Как применить метод Ньютона-Рафсона для полярной функции в Python? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть трехмерная функция, случайно определенная пользователем. 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 постоянны

Теперь мне нужно найти корни для функции Z (тета) вполярная форма с использованием метода NR:

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), которая будет предоставлена.

Любая идея будет оценена по достоинству

1 Ответ

0 голосов
/ 21 сентября 2019

Ну, вы правы в своей проблеме.scipy.optimize.newton() принимает только вызываемую функцию.Таким образом, вы можете просто определить z_func(): функцию, которая принимает переменную оптимизации (в данном случае это тэта) и возвращает результат функции, нулевой желаемый результат.Я решил разделить функции и сохранить вашу структуру, но с использованием оператора 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, если он не сходится).

...