我想致电scipy.newton(f, x0, df)
。
我将f
定义为
def f(x):
resf = x**2
return resf
和df
为
def df(x):
df = 2*x
return df
我这样打电话给newton
x0 = 1.0
y0 = 6.0
root = newton(f-y0, x0, df)
我当然收到错误,因为我尝试从float
中减去function
。
如何定义函数f
并致电newton
以查找f-y0
的根。
语法是什么,输入参数是什么?
以下不起作用:
def f(x, y0):
resf = x**2-y0
return resf
因为那时我不知道如何拨打newton
。
答案 0 :(得分:4)
您可以传递这样的匿名函数:
root = newton(lambda x: f(x)-y0, x0, df)
也可以使用嵌套函数:
def difference(x):
return f(x) - y0
root = newton(difference, x0, df)
答案 1 :(得分:2)
您可以在args=
中使用选项scipy.optimize.newton
来提供其他参数。然后,必须修改df
才能接受其他参数,这可以通过添加*args, **kwargs
来完成。
使用functools.partial
将与额外的12%运行时间相关联。
In [26]:
import functools
import scipy.optimize as so
def f(x, y0):
resf = x**2-y0
return resf
def df(x, *args, **kwargs):
df = 2*x
return df
x0 = 1.0
y0 = 6.0
so.newton(f, x0, args=(y0,), fprime=df)
Out[26]:
2.449489742783178
In [27]:
%timeit so.newton(f, x0, args=(y0,), fprime=df)
100000 loops, best of 3: 6.54 µs per loop
In [28]:
%timeit so.newton(functools.partial(f, y0=y0), x0, df)
100000 loops, best of 3: 7.4 µs per loop
答案 2 :(得分:1)
您可以将f()
的双参数版本与functools.partial()
:
def f(x, y0):
resf = x**2-y0
return resf
x0 = 1.0
y0 = 6.0
root = scipy.optimize.newton(functools.partial(f, y0=y0), x0, df)
我稍微偏爱这个方法而不是包装f()
的单参数版本,因为它更容易看出df()
是正确的衍生w.r.t. x
。