我正在上一门关于python的大学课程,我遇到了一个要求以下内容的作业问题:
使用以下参数编写函数iterate:
f: a function
start: a numeric starting value
tol: a numerical tolerance (default value 1e-6)
itmax: a maximum number of iterations (default value 1000)
从初始值开始,你的函数应该继续重复调用函数(例如y = f(y)),直到f(y)-y的绝对值小于tol或者迭代次数等于itmax。
要检查我的代码是否正确,以下内容应为True
print(approx_equal(iterate(math.sqrt,1.01,tol=1e-4),[6, 1.0000777399813863]))
print(approx_equal(iterate(math.cos,0),[34, 0.7390855263619245]))
print(approx_equal(iterate(math.cos,0,tol=1e-8),[46, 0.7390851366465718]))
print(approx_equal(iterate(math.cos,0,itmax=5),[5, 0.7013687736227565]))
这是我到目前为止所做的:
def approx_equal(f,start,tol,itmax):
y=start
tol=1e-6
itmax=1000
for i in range(itmax):
y=f(y)
while abs(f(y)-y) < tol or i==itmax:
break
我不确定如何“重复调用函数,直到f(y)-y的绝对值小于tol或迭代次数等于itmax。
答案 0 :(得分:0)
你的功能非常接近,但你有几个问题。要传递参数的默认值,您需要在定义语句的第一行中执行此操作。目前您编写的方式tol
始终为1e-6
而itmax
始终为1000
。
此外,您应使用if
添加针对容差的检查。如果差异小于容差,您可以使用break
或return
。 break
会中断for
循环,但return
会退出该函数并给出一个值。
def approx_equal(f, start, tol=1e-6 ,itmax=1000):
y = start
for i in range(itmax):
y_new = f(y)
if abs(y_new-y) < tol:
return y # return the value when the next iteration is not needed
else:
y = y_new