Ich habe einen Algorithmus getestet, der in der Literatur veröffentlicht wurde, der das Lösen einer Reihe von nichtlinearen m-Gleichungen in Matlab und Python beinhaltet. Die Menge der nichtlinearen Gleichungen umfasst Eingabevariablen, die komplexe Zahlen enthalten, und daher sollten die resultierenden Lösungen auch komplex sein. Ab jetzt konnte ich mit den folgenden Zeilen Code recht gute Ergebnisse in Matlab bekommen:Suche nach komplexen Wurzeln aus einem Satz nichtlinearer Gleichungen in Python
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);
wo h und g eine komplexe Matrix und Vektor ist, respectively. Die Lösung konvergiert sehr gut für einen großen Bereich von Anfangswerten.
Ich habe versucht, diese Ergebnisse in Python mit sehr wenig Erfolg jedoch nachzuahmen. Die numerischen Löser scheinen sehr unterschiedlich aufgebaut zu sein, und der 'levenburg-marquardt'-Algorithmus existiert unter der Funktion root. In Python behandelt diesen Algorithmus kann nicht komplexe Wurzeln, und wenn ich laufe die folgenden Zeilen:
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
bekomme ich folgende Fehlermeldung:
minpack.error: Result from function call is not a proper array of floats.
Ich habe versucht, einige der anderen Algorithmen, wie zum Beispiel ' broyden2 'und' anderson ', aber sie sind viel schlechter als Matlab und geben nur gute Ergebnisse, nachdem sie mit den Anfangsbedingungen herumgespielt haben. Die Funktion 'fsolve' kann auch keine komplexen Variablen verarbeiten.
Ich frage mich, ob es etwas gibt, das ich falsch anwende, und ob irgendjemand eine Idee hat, vielleicht komplexe nichtlineare Gleichungen in Python richtig zu lösen.
Vielen Dank