Perché il metodo di Newton non converge?


22

Sto usando il pacchetto di risolutore non lineare SNES di PETSc per risolvere un sistema di equazioni non lineari ottenuto discretizzando un'equazione differenziale parziale. Come posso determinare perché il risolutore non converge e cosa posso fare per risolvere con successo le mie equazioni?


8
Come con qualsiasi metodo iterativo, è fondamentale trovare un buon seme per avviare il metodo Newton-Raphson. Un punto di partenza mediocre spesso provoca caos.
JM,

6
Penso che "spesso si traduca in caos" non è corretto. Riferendosi a Blum, Cucker, Shub e Smale, Newton ha bacini attraenti separati da confini che possono provocare iterazioni caotiche. Pertanto questo tipo di comportamento è molto improbabile rispetto alla convergenza. Se l'algoritmo è alla ricerca di soluzioni reali, non riuscirà a convergere spesso, ma non diventerà caotico.
Matt Knepley,

5
Intendevo "caos" in senso non tecnico, @Matt; per esempio, divergenza all'infinito o comportamento ciclico. Forse "disastro" sarebbe stata una scelta migliore delle parole?
JM,

Risposte:


43

Il metodo di Newton potrebbe non convergere per molte ragioni, ecco alcuni dei più comuni.

  • Il giacobino ha torto (o corretto in sequenza ma non in parallelo).
  • Il sistema lineare non è stato risolto o non è stato risolto in modo sufficientemente accurato.
  • Il sistema giacobino ha una singolarità che il risolutore lineare non sta gestendo.
  • C'è un bug nella routine di valutazione delle funzioni.
  • La funzione non è continua o non ha derivati ​​secondari continui (ad es. Cambio di fase o limitatori TVD).
  • Le equazioni potrebbero non avere una soluzione (ad es. Ciclo limite invece di uno stato stazionario) oppure potrebbe esserci una "pendenza" tra ipotesi iniziale e stato stazionario (ad es. I reagenti devono accendersi e bruciare prima di raggiungere uno stato stazionario, ma il costante- lo stato residuo sarà maggiore durante la combustione).

Ecco alcuni dei modi per aiutare il debug della mancanza di convergenza di Newton.

  • Esegui con le opzioni -snes_monitor -ksp_monitor_true_residual -snes_converged_reason -ksp_converged_reason. Se la soluzione lineare non converge, controlla se il Jacobian è corretto, quindi vedi questa domanda . Se il residuo precondizionato converge, ma il vero residuo no, il precondizionatore può essere singolare. Se la soluzione lineare converge bene, ma la ricerca della linea fallisce, il Jacobiano potrebbe non essere corretto.
  • Corri con -pc_type lu or -pc_type svdper vedere se il problema è un povero risolutore lineare
  • Corri con -mat_viewo -mat_view_drawper vedere se il giacobino sembra ragionevole
  • Corri con -snes_type test -snes_test_displayper vedere se il giacobino che stai usando è sbagliato. Confronta l'output quando aggiungi -mat_fd_type dsper vedere se il risultato è sensibile alla scelta del parametro di differenziazione.
  • Corri con -snes_mf_operator -pc_type luper vedere se il giacobino che stai usando è sbagliato. Se il problema è troppo grande per una risoluzione diretta, provare -snes_mf_operator -pc_type ksp -ksp_ksp_rtol 1e-12. Confronta l'output quando aggiungi -mat_mffd_type dsper vedere se il risultato è sensibile alla scelta del parametro di differenziazione.
  • Esegui su un processore per vedere se il problema è solo in parallelo.
  • Corri con -snes_ls_monitorper vedere se la ricerca della linea sta fallendo (questo di solito è un segno di un cattivo Jacobiano).
  • Esegui con -infoper ottenere informazioni più dettagliate sul processo di soluzione.

Qui ci sono alcuni modi per aiutare il processo di Newton se tutto quanto sopra si verifica

  • Esegui con il sequenziamento della griglia ( -snes_grid_sequenceè tutto ciò che serve se si lavora con a DM) per generare una migliore ipotesi iniziale sulla mesh più fine
  • Esegui con precisione quad ( ./configure --with-precision=__float128 --download-f2cblaslapackcon PETSc 3.2 e versioni successive, richiede compilatori GNU versione 4.6 o successive)
  • Cambia le unità (non dimensionalizzazione), il ridimensionamento delle condizioni al contorno o la formulazione in modo che il giacobino sia meglio condizionato.
  • Mollifica le caratteristiche della funzione che non hanno primi derivati ​​continui (spesso si verificano quando ci sono ifdichiarazioni nella valutazione residua, ad esempio cambio di fase o limitatori TVD). Utilizzare un solutore di disuguaglianza variazionale ( SNESVINEWTONRSLS ) se le discontinuità sono di fondamentale importanza.
  • Prova un metodo della regione attendibile ( -ts_type trpotrebbe essere necessario modificare i parametri).
  • Esegui con alcuni parametri di continuazione da un punto in cui conosci la soluzione, vedi TSPSEUDO per risolvere i problemi di stato stazionario. Esistono pacchetti di risolutore di omotopi come PHCpack che possono offrirti tutte le possibili soluzioni (e dirti che li ha trovati tutti) ma quelli non sono scalabili e non possono risolvere altro che piccoli problemi.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.