Kürzlich habe ich verschiedene nichtlineare Löser von scipy verglichen und war besonders beeindruckt vom Newton-Krylov-Beispiel im Scipy-Kochbuch, in dem sie eine Differentialgleichungsgleichung zweiter Ordnung mit nichtlinearem Reaktionsterm in etwa 20 Codezeilen lösen.
Ich habe den Beispielcode geändert, um die nichtlineare Poisson-Gleichung ( auch Poisson-Boltzmann-Gleichung genannt , siehe Seite 17 in diesen Hinweisen) für Halbleiter-Heterostrukturen zu lösen , die die folgende Form haben:
(Dies ist die Restfunktion, die an den Solver übergeben wird.)
Dies ist ein elektrostatisches Problem, bei dem und p ( x , ϕ ) nichtlineare Funktionen für die Form n i ( x ) e - ( E i ( x , ϕ ) - E f ) sind . Die Details hier sind nicht wichtig, aber der Punkt ist, dass die nichtlineare Funktion exponentiell mit ϕ variiert, so dass die Restfunktion über einen großen Bereich variieren kann ( 10 - 6 - 10 16 ).mit einer leichten änderung in .
Ich löse diese Gleichung numerisch mit Newton-Krylov von scipy, aber sie würde niemals konvergieren (tatsächlich würde sie immer einen Fehler bei der Berechnung des Jacobian melden). Ich habe von einem Newton-Krylov- Solver auf fsolve (basierend auf MINPACK hybrd) gewechselt und es hat zum ersten Mal funktioniert!
Gibt es allgemeine Gründe, warum Newton-Krylov für bestimmte Probleme nicht geeignet ist? Müssen die Eingangsgleichungen irgendwie konditioniert werden?
Möglicherweise sind weitere Informationen erforderlich, um einen Kommentar abzugeben, aber warum hat fsolve Ihrer Meinung nach in diesem Fall funktioniert?
sol = newton_krylov(func, guess, method='gmres')
) das Problem behebt . Ich weiß nicht genau warum, aber jeder, der dieses Problem hat, könnte das Gleiche in Betracht ziehen.