Il y a probablement deux problèmes que vous rencontrerez.
Mauvais conditionnement
Tout d'abord, le problème est mal conditionné, mais si vous ne fournissez qu'un résiduel, Newton-Krylov jette la moitié de vos chiffres significatifs en différenciant finement le résidu pour obtenir l'action du jacobien:
J[ x ] y≈ F( x + ϵ y) - F( x )ϵ
Si vous fournissez un jacobien analytique, vous pouvez conserver tous les chiffres (par exemple, 16 en double précision). Les méthodes Krylov reposent également sur des produits intérieurs, donc si votre jacobien est mal conditionné à hauteur de , il est effectivement singulier et Krylov peut stagner ou renvoyer des solutions erronées. Cela peut également empêcher la convergence des solveurs directs. Parfois, vous pouvez utiliser des méthodes multigrilles pour homogénéiser en une grille grossière avec un conditionnement traitable. Lorsqu'un problème ne peut pas être formulé avec un meilleur conditionnement, il peut être utile de travailler en quadruple précision. (Ceci est pris en charge par PETSc, par exemple.)dix16
Notez que les mêmes problèmes s'appliquent aux méthodes quasi-Newton, mais sans différenciation finie. Toutes les méthodes évolutives pour les problèmes avec les opérateurs non compacts (par exemple, les équations différentielles) doivent utiliser des informations jacobiennes pour le préconditionnement.
Il est probable que fsolve
soit n'a pas utilisé d'informations jacobiennes, soit qu'il ait utilisé une méthode dogleg ou un changement pour progresser avec une méthode de «descente en gradient», malgré une méthode jacobienne essentiellement singulière (c.-à-d. Que la différenciation finie aurait beaucoup de «bruit» de arithmétique de précision finie). Ce n'est pas évolutif et fsolve
devient probablement plus lent lorsque vous augmentez la taille du problème.
Mondialisation
Si les problèmes linéaires sont résolus avec précision, nous pouvons exclure les problèmes liés au problème linéaire (Krylov) et nous concentrer sur ceux dus à la non-linéarité. Les minima locaux et les caractéristiques non lisses ralentissent la convergence ou provoquent la stagnation. Poisson-Boltzmann est un modèle lisse, donc si vous commencez avec une estimation initiale suffisamment bonne, Newton convergera quadratique. La plupart des stratégies de mondialisation impliquent une sorte de poursuite pour produire une estimation initiale de haute qualité pour les itérations finales. Les exemples incluent la continuation de la grille (par exemple, Full Multigrid), la continuation des paramètres et la continuation pseudotransitoire. Ce dernier est généralement applicable aux problèmes d'état stationnaire et offre une théorie de convergence globale, voir Coffey, Kelley et Keyes (2003) . Une recherche révèle ce papier, qui peut vous être utile: Shestakov, Milovich et Noy (2002) Solution de l'équation de Poisson-Boltzmann non linéaire utilisant la continuation pseudo-transitoire et la méthode des éléments finis . La continuation pseudo-transitoire est étroitement liée à l'algorithme de Levenberg-Marquardt.
Lectures complémentaires
sol = newton_krylov(func, guess, method='gmres')
) a résolu le problème. Je ne sais pas exactement pourquoi, mais toute autre personne ayant ce problème pourrait envisager de faire de même.