1
牛顿-克里洛夫什么时候不适合求解?
最近,我一直在比较来自scipy的不同非线性求解器,并且尤其对《 Scipy Cookbook》中的Newton-Krylov示例印象深刻,在该示例中,他们用大约20行代码来求解带有非线性反应项的二阶微分方程组。 我修改了示例代码,以解决半导体异质结构的非线性Poisson方程(也称为Poisson-Boltzmann方程,请参见本说明中的第17页),其形式为: d2ϕdx2−k(x)(p(x,ϕ)−n(x,ϕ)+N+(x))=0d2ϕdx2−k(x)(p(x,ϕ)−n(x,ϕ)+N+(x))=0 \frac{d^2\phi}{dx^2} - k(x) \left(p(x,\phi) - n(x,\phi) + N^{+}(x)\right) = 0 (这是传递给求解器的残差函数。) 这是一个静电问题,其中和是形式为n_i(x)e ^ {-(E_i(x,\ phi)-E_f)}的非线性函数。此处的细节并不重要,但关键是非线性函数随\ phi呈指数变化,因此残差函数可以在很大的范围内(10 ^ {-6}-10 ^ {16})发生微小变化。在\ phi中n(x,ϕ)n(x,ϕ)n(x,\phi)p(x,ϕ)p(x,ϕ)p(x,\phi)ni(x)e−(Ei(x,ϕ)−Ef)ni(x)e−(Ei(x,ϕ)−Ef)n_i(x) e^{-(E_i(x,\phi) - E_f)}ϕϕ\phi10−6−1016)10−6−1016)10^{-6} - 10^{16})ϕϕ\phi。 我用scipy的Newton-Krylov用数值方法求解了这个方程,但是它永远不会收敛(实际上,在计算雅可比方程时总是会报告一个错误)。我从Newton-Krylov求解器切换为fsolve(基于MINPACK hybrd),它第一次起作用! 牛顿-克里洛夫(Newton-Krylov)不适合某些问题的一般原因吗?输入方程是否需要以某种方式进行调节? 也许需要更多信息来发表评论,但是为什么您认为fsolve在这种情况下有效?