Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用牛顿函数寻找Scipy';s优化包_Python_Scipy - Fatal编程技术网

Python 如何使用牛顿函数寻找Scipy';s优化包

Python 如何使用牛顿函数寻找Scipy';s优化包,python,scipy,Python,Scipy,我想使用加载为的newton函数 from scipy.optimize import newton 为了找到用户输入的函数的零。我编写了一个脚本,首先要求用户指定一个函数及其一阶导数,以及算法的起点。首先键入help(newton)我了解了哪些参数使用函数和相关解释: newton(func,x0,fprime=None,args=(),tol=1.48e-08,maxiter=50) 我必须以哪种方式传递我的函数?如果我使用func,例如x**3(及其一阶导数),则响应为name错误:未定

我想使用加载为的
newton
函数

from scipy.optimize import newton
为了找到用户输入的函数的零。我编写了一个脚本,首先要求用户指定一个函数及其一阶导数,以及算法的起点。首先键入
help(newton)
我了解了哪些参数使用函数和相关解释:

newton(func,x0,fprime=None,args=(),tol=1.48e-08,maxiter=50)

我必须以哪种方式传递我的函数?如果我使用func,例如
x**3
(及其一阶导数),则响应为
name错误:未定义名称“x”
。在互联网上,我发现首先我必须定义我的函数及其一阶导数,并将名称作为参数传递。所以我做了以下几点

fie = raw_input('Enter function in terms of x (e.g. x**2 - 2*x). F= ')
dfie = raw_input('Enter first derivative of function above DF = ')
x0 = input('Enter starting point x0 = ')

def F(x,fie):
    y = eval(fie)
    return y 

def DF(x, dfie):
    dy = eval(dfie)
    return dy

print newton(F,x0,DF)
但是我得到了输出

    102         for iter in range(maxiter):
    103             myargs = (p0,) + args
--> 104             fder = fprime(*myargs)
    105             if fder == 0:
    106                 msg = "derivative was zero."

TypeError: DF() takes exactly 2 arguments (1 given)

如果我省略了DF,那么F的问题也是一样的。查看
/usr/local/share/src/scipy/scipy/optimize/zeros.py
中的代码,我看到它使用
fder=fprime(*myargs)
计算一阶导数,因此可能我必须输入
args
一些使其工作的东西。我在考虑,但没有解决办法

首先,请注意使用
eval
会使您的程序容易受到恶意用户的攻击。如果该问题不适用,您可以如下创建F和DF:

F = eval('lambda x :'+fie)
DF = eval('lambda x :'+dfie)
然后这两个函数只需要一个参数,您可以将
args
参数保留为空

编辑。如果你真的想尽可能地坚持你的代码,这也应该行得通,但对我来说并不太好
newton
将向两个函数发送相同的
args

def F(x,fie,dfie):
    y = eval(fie)
    return y 

def DF(x,fie,dfie):
    dy = eval(dfie)
    return dy

print newton(F,x0,DF,(fie,dfie))

对不起,这对我来说是非常重要的(我的意思是lambda),你能给我解释一下这种“形式主义”吗?@StefanoMessina A计算的是一个函数对象。让我们暂时假设一下,我“必须”使用函数newton()的参数“args”来传递“fie”。@StefanoMessina在我的答案中添加了这样一种方法。
def F(x,fie,dfie):
    y = eval(fie)
    return y 

def DF(x,fie,dfie):
    dy = eval(dfie)
    return dy

print newton(F,x0,DF,(fie,dfie))