Recentemente, comparei diferentes solucionadores não lineares do scipy e fiquei particularmente impressionado com o exemplo de Newton-Krylov no Scipy Cookbook, no qual eles resolvem uma equação de equação diferencial de segunda ordem com o termo de reação não linear em cerca de 20 linhas de código.
Modifiquei o código de exemplo para resolver a equação de Poisson não linear ( também chamada de equação de Poisson-Boltzmann , consulte a página 17 nestas notas) para heteroestruturas de semicondutores, que tem a forma,
(Essa é a função residual que é passada para o solucionador.)
Este é um problema electrostática onde e são funções não lineares para a forma . Os detalhes aqui não são importantes, mas o ponto é que a função não linear varia exponencialmente com modo que a função residual pode variar em uma faixa enorme ( com uma pequena alteração em .
Eu resolvo numericamente essa equação com Newton-Krylov, de Scipy, mas ela nunca convergiria (na verdade, sempre reportaria um erro no cálculo do jacobiano). Troquei de um solucionador de Newton-Krylov para fsolve (que é baseado no MINPACK hybrd) e funcionou pela primeira vez!
Existem razões gerais pelas quais Newton-Krylov não se ajusta a certos problemas? As equações de entrada precisam ser condicionadas de alguma forma?
Talvez seja necessário mais informações para comentar, mas por que você acha que o fsolve funcionou nesse caso?
sol = newton_krylov(func, guess, method='gmres')
) resolveu o problema. Não sei exatamente por que, mas qualquer outra pessoa com esse problema pode considerar fazer o mesmo.