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
).
我有用户随机定义的三维函数 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
).