最近、私はscipyのさまざまな非線形ソルバーを比較しており、Scipy CookbookのNewton-Krylovの例に特に感銘を受けました。約20行のコードで非線形反応項を持つ2階微分方程式方程式を解きます。
半導体ヘテロ構造の非線形ポアソン方程式(ポアソン-ボルツマン方程式とも呼ばれ、これらのノートの17ページを参照)を解くためにサンプルコードを修正しました。
(これはソルバーに渡される残差関数です。)
これは、静電気の問題である及びP (X 、φは)フォームの非線形関数であり、N I(X )E - (E I(X 、φ )- E 、F)。ここでの詳細は重要ではありませんが、ポイントは非線形関数がϕで指数関数的に変化するため、残差関数は巨大な範囲(10 − 6 − 10 16)にわたって変化する可能性があることです。わずかな変化で。
私はこの式をscipyのNewton-Krylovで数値的に解きましたが、収束することはありませんでした(実際、ヤコビアンの計算で常にエラーを報告します)。Newton-Krylovソルバーからfsolve(MINPACK hybrdに基づいています)に切り替えて、初めて動作しました!
ニュートン・クリロフが特定の問題にうまく適合しない一般的な理由はありますか?入力方程式を何らかの形で条件付けする必要がありますか?
コメントするにはもっと情報が必要なのかもしれませんが、なぜこの場合fsolveが機能したと思いますか?
sol = newton_krylov(func, guess, method='gmres')
)に変更すると問題が修正されることがわかりました。正確な理由はわかりませんが、この問題を抱えている他の人が同じことを検討するかもしれません。