Python中的极函数如何应用Newton Raphson方法?

How to apply Newton Raphson method for polar function in Python?

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

def f(x,y): return ((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(theta) 的根:

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' object is not callable

newton 方法只接受一个可调用函数我怎样才能使函数 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():一个函数,它接受你的优化变量(在本例中是 theta)和 returns 需要零的函数的输出。我选择分离功能并保留您的结构,但使用 lambda 运算符(参见下面的代码)。

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)

备注:我不确定你为什么使用 theta.any() 作为起始值,因为它 returns 是 True 并且转换为 1,这让我质疑 theta 数组的定义,因为你所需要的只是一个起始值(这仍然很重要,因为它会改变代码将收敛到的根,或者如果它无法收敛甚至可能导致 RuntimeError ).