尝试生成一个接受初始猜测和其他3个参数的函数,以便产生收敛到单个值的猜测。
尝试生成一个带4个参数的python函数:
一种python函数,它接受一个数字作为输入,并返回一个浮点数作为输出。使用这个:def f(x): return 2 - exp(-x)
不动点的初始猜测,浮点数
一个公差值,一个正值浮点数
允许算法运行的最大迭代次数
为了测量最近的猜测与一个固定点的接近程度,我取了最近的3个值,并使用这个等式(zap在本例中是被访问的列表):caltol = abs(((zap[-1]-zap[-2])**2)/((2*zap[-2])-zap[-3]-zap[-1]))
这是我已经尝试过的代码,但似乎在nugget = mega[len(mega)-numms]中出现了超出范围的错误另外,当对参数使用某些值时,代码无法返回正确的值,例如guess_finder(f, xo=83.30748524231714, tol=0.0013756415772893204, max_it=232)应该返回[83.30748524231714, 2.0, 1.8646647167633872]而不是返回[83.30748524231714, 2.0, 1.8646647167633872, 1.8450518473052135, 1.8419828720850022]
另一个例子:运行guess_finder(f, xo=91.0, tol=1e-10, max_it=10)应该输出[91.0, 2.0, 1.8646647167633872, 1.8450518473052135, 1.8419828720850022, 1.8414971765224537, 1.8414201737059899, 1.8414079621425745, 1.8414060254740223, 1.8414057183297619]

from math import exp
from collections import OrderedDict

def f(x):
    return  2 - exp(-x)

def guess_finder(func, xo, tol, max_it):
    legit=[]
    legit.append(xo)
    caltol = 0
    guesses = []

    mega = []

    for x in range(max_it-1):
        xo = func(xo)
        legit.append(xo)

    zap = list(OrderedDict.fromkeys(legit))

    if max_it > 3 and len(zap) >= 3:
        mega = zap.copy()

        for i in range(len(zap)):
            print(caltol)
            caltol = abs(((zap[-1]-zap[-2])**2)/((2*zap[-2])-zap[-3]-zap[-1]))

            if caltol < tol:
                zap.pop()

    numms= len(mega)- len(zap)
    if numms != 0 and numms > 0 :
        nugget = mega[len(mega)-numms]
        zap.append(nugget)

    return zap

函数应该产生猜测,直到_n小于指定的公差值,或者直到产生的猜测数(包括初始猜测)匹配/超过最大迭代次数。它应该返回所有猜测的列表。在评估容忍度之前需要三次猜测。
在此方面的任何帮助都将不胜感激。
谢谢您。

最佳答案

代码中的两个修改-
for i in range(len(zap)):中,如果公差值很高,则需要在长度-2处停止,否则将超出范围-for i in range(len(zap)-2):
当收敛速度比迭代次数快得多时添加条件-if len(zap)>3: return zap[:3];
另外,由于您正在对列表进行排序,因此仅当x <f(x) or x>f(x) for x in your space时,此操作才有效。
你的完整代码看起来像-

from math import exp
from collections import OrderedDict

def f(x):

    return  2 - exp(-x)

def guess_finder(func, xo, tol, max_it):

    legit=[]
    legit.append(xo)
    caltol = 0
    guesses = []

    mega = []

    for x in range(max_it-1):
        xo = func(xo)
        legit.append(xo)

    #print(legit)

    zap = list(OrderedDict.fromkeys(legit))
    #print(legit)
    if max_it > 3 and len(zap) >= 3:
        mega = zap.copy()

        for i in range(len(zap)-2):
            print(caltol)
            caltol = abs(((zap[-1]-zap[-2])**2)/((2*zap[-2])-zap[-3]-zap[-1]))

            if caltol < tol:
                zap.pop()
    if len(zap)>3:
        print("test")
        return zap[:3]
    numms= len(mega)- len(zap)
    if numms != 0 and numms > 0 :
        nugget = mega[len(mega)-numms]
        zap.append(nugget)

    return zap

关于python - 创建一个采用初始猜测和参数的python函数,以产生以单个值终止的猜测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54729666/

10-12 19:29