如何在Python中应用牛顿-拉斐逊极函数法?

如何在Python中应用牛顿-拉斐逊极函数法?,python,function,newtons-method,scipy-optimize,Python,Function,Newtons Method,Scipy Optimize,我有一个由用户随机定义的三维函数Z=f(x,y) 定义f(x,y): 返回((7*x*y)/(np.exp(x**2+y**2))) 我通过替换将此函数转换为极坐标: x_c = r*np.cos(theta)+x1; y_c = r*np.sin(theta)+y1; 在哪里 theta=np.linspace(0,2*np.pi,30) r、 x1和y1是常数 现在我需要使用NR方法找到极坐标形式下函数Z(θ)的根: from scipy.optimize import newton Z

我有一个由用户随机定义的三维函数Z=f(x,y)

定义f(x,y): 返回((7*x*y)/(np.exp(x**2+y**2)))

我通过替换将此函数转换为极坐标:

x_c = r*np.cos(theta)+x1; y_c = r*np.sin(theta)+y1;
在哪里

theta=np.linspace(0,2*np.pi,30)

r、 x1和y1是常数

现在我需要使用NR方法找到极坐标形式下函数Z(θ)的根:

from scipy.optimize import newton

Z_func = f(x_c,y_c);
root = newton(Z_func,theta.any());
错误消息显示:

q0=func(*(p0,)+args)) TypeError:“numpy.ndarray”对象不可调用

牛顿法只接受一个可调用的函数我怎样才能使函数f(x_c,y_c)可调用

我确实希望替换如下所示,并在牛顿法中调用它

7*(r*np.cos(theta)+x1)*(r*np.sin(theta)+y1))/(np.exp((r*np.cos(theta)+x1)**2+(r*np.sin(theta)+y1)**2)
因为我不知道将要给出的函数f(x,y)


如果您有任何想法,我们将不胜感激。

您的问题是对的。
scipy.optimize.newton()
只接受可调用的函数。因此,您可以简单地定义
z_func()
:一个函数,它接受您的优化变量(在本例中是θ),并返回需要零的函数的输出。我选择了分离函数并保留您的结构,但是使用了
lambda
操作符(参见下面的代码)


备注:我不确定为什么要使用
theta.any()
作为起始值,因为它返回一个True并转换为1,这使我对θ数组的定义产生疑问,因为您只需要一个起始值(尽管如此,这一点很重要,因为它会改变代码将收敛到的根,或者如果它无法收敛,甚至可能导致
运行时错误)。

您是否也可以共享您的
newton
函数的代码?-此q0变量来自何处?@B.Kocis newton函数用于scipy“从scipy.optimize导入牛顿”
import numpy as np
from scipy import optimize

# define functions
f   = lambda         x, y : (7 * x * y) / np.exp(x**2 + y**2)
x_c = lambda r, theta, x1 : r * np.cos(theta) + x1 
y_c = lambda r, theta, y1 : r * np.sin(theta) + y1
z_f = lambda        theta : f(x_c(1, theta, 1), y_c(1, theta, 1))

# define theta
theta = np.linspace(0, 2*np.pi, 30)

# optimize
root   = optimize.newton(z_f, theta.any())
print("root: ", root)