我非常喜欢初学者,所以请保持温和。
我正在修改一些Python练习,我的代码看起来像这样。
def newton(x0, Tol):
def F(x):
return (x**3)+898
def dF(x):
return 3*x**2
x=[x0]
for n in range(400):
x.append(x[n]-(F(x[n]))/dF(x[n]))
if abs((x[n+1])-(x[n]))<Tol:
conv='Converge'
print n
break
if abs((x[n+1])-(x[n]))>=Tol:
conv='No converge'
return x[n+1], conv
我定义了一个函数F(x)
及其派生dF(x)
,并将值添加到列表x
。
任务是检查系列是否收敛,我认为我已经成功了。
但我的问题是将函数(x**3)+898
和3*x**2
作为函数Newton
的参数。
我想象它会是这样的
def newton(f, df, x0, Tol):
def F(x):
return f
def dF(x):
return df
*calculations*
return x[n+1], conv
你会用
来称呼它newton((x**3)+898, 3*x**2, x0=something, Tol=something)
这样就可以在过程中定义函数F(x)
和dF(x)
。
但是,x
未定义,因此无效。
请注意,在练习中需要将f和df作为'newton'的参数。
你会如何解决这个问题?
感谢。
答案 0 :(得分:6)
您可以使用lambda
s,它们基本上都是简单的功能。
你会这样称呼:
newton(lambda x: (x**3)+898, lambda x: 3*x**2, x0=something, Tol=something)
这与做这样的事情是一样的:
def f1(x):
return (x**3)+898
def f2(x):
return 3*x**2
newton(f1, f2, x0=something, Tol=something)
唯一的区别是你没有“给lambda命名”,即将它分配给变量。这对于您只需要使用一次的函数非常方便,尤其是作为sorted
和max
等函数的关键参数。
答案 1 :(得分:3)
使用lambda
:
newton(lambda x: (x**3)+898, lambda x: 3*x**2, x0=something, Tol=something)