试图创建一个需要初始猜测和其他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]))
< / p>
这是我已经尝试过的代码,但是似乎在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小于指定的公差值,或者直到产生的猜测数量(包括初始猜测)匹配/超过最大迭代次数为止。它应该返回所有猜测的列表。在评估公差之前,需要进行三个猜测。
在此方面的任何帮助将不胜感激。 谢谢。
答案 0 :(得分:0)
代码中有两项修改-
在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