Python:从函数中减去一个浮点(以便调用scipy.newton()
我想调用Python:从函数中减去一个浮点(以便调用scipy.newton(),python,function,syntax,scipy,Python,Function,Syntax,Scipy,我想调用scipy.newton(f,x0,df) 我将f定义为 def f(x): resf = x**2 return resf 和dfas def df(x): df = 2*x return df 我这样称呼牛顿 x0 = 1.0 y0 = 6.0 root = newton(f-y0, x0, df) 当然,我得到了一个错误,因为我试图从函数中减去浮点 如何定义函数f并调用newton来查找f-y0的根 语法是什么,输入参数是什么 以下操作
scipy.newton(f,x0,df)
我将f
定义为
def f(x):
resf = x**2
return resf
和df
as
def df(x):
df = 2*x
return df
我这样称呼牛顿
x0 = 1.0
y0 = 6.0
root = newton(f-y0, x0, df)
当然,我得到了一个错误,因为我试图从函数
中减去浮点
如何定义函数f
并调用newton
来查找f-y0
的根
语法是什么,输入参数是什么
以下操作不起作用:
def f(x, y0):
resf = x**2-y0
return resf
因为我不知道如何调用
newton
你可以传递这样一个匿名函数:
root=newton(λx:f(x)-y0,x0,df)
也可以使用嵌套函数:
def difference(x):
return f(x) - y0
root = newton(difference, x0, df)
您可以像这样传递匿名函数:
root=newton(λx:f(x)-y0,x0,df)
也可以使用嵌套函数:
def difference(x):
return f(x) - y0
root = newton(difference, x0, df)
您可以将双参数版本的
f()
用于:
与包装单参数版本的
f()
相比,我更倾向于使用这种方法,因为更容易看出df()
是正确的导数w.r.t.x
您可以将双参数版本的f()
用于:
与包装单参数版本的
f()。然后必须修改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
您可以在scipy.optimize.newton
中使用一个选项args=
,以提供其他参数。然后必须修改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
x从哪里来?我不能告诉你。当我用f来称呼“牛顿”时,如果没有x参数,它似乎是有效的。x从哪里来?我不能告诉你。当我用f调用“newton”时,如果没有x参数,它似乎是有效的。(+1)可能值得一提的是,必须注意确保这个新函数具有与原始函数相同的一阶导数(在本例中,它具有相同的一阶导数)。@Falko:,它不知道y0从哪里来,除非我把它作为一个参数传递给差分(x,y0)。但是当我调用newton(差分(x,y0),x0,df)时,x是未定义的@NPE:y0是一个常数,但总的来说你是对的。y0
在定义差分之前需要先定义。那么它在函数中是已知的。(+1)可能值得一提的是,必须注意确保这个新函数与原始函数具有相同的一阶导数(在本例中是这样的)。@Falko:对于你的例子二,它不知道y0来自哪里,除非我将它作为一个参数传递给差分(x,y0)。但是当我调用newton(差分(x,y0),x0,df)时,x是未定义的@NPE:y0是一个常数,但总的来说你是对的。y0
在定义差分之前需要先定义。然后在函数中就知道了。总是有args=
选项可以用来传递附加参数。总是有args=
选项可以用来传递附加参数。