Python:从函数中减去一个浮点数(为了调用scipy.newton())

时间:2014-08-09 11:26:45

标签: python function syntax scipy

我想致电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

3 个答案:

答案 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