Recentemente ho confrontato diversi solutori non lineari di scipy e sono stato particolarmente colpito dall'esempio di Newton-Krylov nel ricettario di Scipy in cui risolvono un'equazione differenziale di secondo ordine con il termine di reazione non lineare in circa 20 righe di codice.
Ho modificato il codice di esempio per risolvere l'equazione di Poisson non lineare ( chiamata anche equazione di Poisson-Boltzmann , vedi pagina 17 in queste note) per eterostrutture a semiconduttore, che ha la forma,
(Questa è la funzione residua che viene passata al solutore.)
Questo è un problema elettrostatico in cui e p ( x , ϕ ) sono funzioni non lineari per la forma n i ( x ) e - ( E i ( x , ϕ ) - E f ) . I dettagli qui non sono importanti, ma il punto è che la funzione non lineare varia in modo esponenziale con ϕ quindi la funzione residua può variare in un ampio intervallo ( 10 - 6 - 10 16 )con una leggera variazione in .
Risolvo numericamente questa equazione con Newton-Krylov di Scipy, ma non converrebbe mai (in effetti segnalerebbe sempre un errore nel calcolo del giacobino). Sono passato da un solutore di Newton-Krylov a fsolve (che si basa su MINPACK hybrd) e ha funzionato per la prima volta!
Ci sono ragioni generali per cui Newton-Krylov non è adatto a determinati problemi? Le equazioni di input devono essere condizionate in qualche modo?
Forse sono necessarie ulteriori informazioni per commentare, ma perché pensi che fsolve abbia funzionato in questo caso?
sol = newton_krylov(func, guess, method='gmres')
) risolto il problema. Non sono esattamente sicuro del perché, ma chiunque altro con questo problema potrebbe considerare di fare lo stesso.