尝试生成一个接受初始猜测和其他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/