Я тестировал алгоритм, который был опубликован в литературе, который включает решение набора нелинейных уравнений 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.
Большое Вам спасибо