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

2024-04-25 21:29:43 发布

您现在位置: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(θ)的根:

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

牛顿法只接受一个可调用的函数如何使函数f(x,y)可调用?你知道吗

我不想替换如下所示,并在牛顿法中调用它

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)。你知道吗

任何想法都将不胜感激


Tags: 函数用户return定义defnpnewtonsin
1条回答
网友
1楼 · 发布于 2024-04-25 21:29:43

你的问题是对的。scipy.optimize.newton()只接受可调用函数。因此,您可以简单地定义z_func():一个函数,它接受您的优化变量(在本例中是theta)并返回需要零的函数的输出。我选择了分离函数并保留您的结构,但是使用了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()作为起始值,因为它返回一个True,并转换为1,这使我对θ数组的定义产生疑问,因为您所需要的只是一个起始值(尽管如此,这很重要,因为它将更改代码将收敛到的根,甚至可能导致RuntimeError如果它不能收敛)。你知道吗

相关问题 更多 >