Поиск комплексных корней из множества нелинейных уравнений в python
Я тестировал алгоритм, который был опубликован в литературе, который включает в себя решение набора " M " нелинейных уравнений как в Matlab, так и в Python. Набор нелинейных уравнений включает входные переменные, содержащие комплексные числа, и поэтому полученные решения также должны быть сложными. На данный момент я смог получить довольно хорошие результаты в Matlab, используя следующие строки кода:
lambdas0 = ones(1,m)*1e-5;
options = optimset('Algorithm','levenberg-marquardt',...
'MaxFunEvals',1000000,'MaxIter',10000,'TolX',1e-20,...
'TolFun',1e-20);
Eq = @(lambda)maxentfun(lambda,m,h,g);
[lambdasf] = fsolve(Eq,lambdas0,options);
где h и g-комплексная матрица и вектор, соответственно. Решение сходится очень хорошо для широкого диапазона исходных значений.
Я пытаюсь имитировать эти результаты в Python с очень небольшим успехом. Численные решатели, похоже, настроены совсем по-другому, и алгоритм "левенбурга-Марквардта" существует под корнем функции. В python Этот алгоритм не может обрабатывать сложные корни, и когда я запускаю следующие строки:
lambdas0 = np.ones(m)*1e-5
sol = root(maxentfun, lambdas0, args = (m,h,g), method='lm', tol = 1e-20, options = {'maxiter':10000, 'xtol':1e-20})
lambdasf = sol.x
Я получаю следующую ошибку:
minpack.error: Result from function call is not a proper array of floats.
Я пробовал использовать некоторые другие алгоритмы, такие как "broyden2" и "anderson", но они намного уступают Matlab и дают хорошие результаты только после игры с начальными условиями. Функция "fsolve"также не может обрабатывать сложные переменные.
мне было интересно, есть ли что-то, что я применяю неправильно, и если у кого-то есть идея о том, как правильно решить сложные нелинейные уравнения в Python.
спасибо
1 ответов
когда я сталкиваюсь с этим типом проблемы, я пытаюсь переписать свою функцию как массив реальных и мнимых частей. Например, если f
- это функция, которая принимает сложный входной массив x
(скажем x
имеет размер 2, для простоты)
from numpy import *
def f(x):
# Takes a complex-valued vector of size 2 and outputs a complex-valued vector of size 2
return [x[0]-3*x[1]+1j+2, x[0]+x[1]] # <-- for example
def real_f(x1):
# converts a real-valued vector of size 4 to a complex-valued vector of size 2
# outputs a real-valued vector of size 4
x = [x1[0]+1j*x1[1],x1[2]+1j*x1[3]]
actual_f = f(x)
return [real(actual_f[0]),imag(actual_f[0]),real(actual_f[1]),imag(actual_f[1])]
новая функция, real_f
может использоваться в fsolve
: реальная и мнимая части функции одновременно решаются для, рассматривая реальную и мнимую части входного аргумента как независимые.