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=
选项可以用来传递附加参数。