牛顿-克里洛夫什么时候不适合求解?


16

最近,我一直在比较来自scipy的不同非线性求解器,并且尤其对《 Scipy Cookbook》中的Newton-Krylov示例印象深刻,在该示例中,他们用大约20行代码来求解带有非线性反应项的二阶微分方程组。

我修改了示例代码,以解决半导体异质结构的非线性Poisson方程(也称为Poisson-Boltzmann方程,请参见本说明中的第17页),其形式为:

d2ϕdx2k(x)(p(x,ϕ)n(x,ϕ)+N+(x))=0

(这是传递给求解器的残差函数。)

这是一个静电问题,其中和是形式为n_i(x)e ^ {-(E_i(x,\ phi)-E_f)}的非线性函数。此处的细节并不重要,但关键是非线性函数随\ phi呈指数变化,因此残差函数可以在很大的范围内(10 ^ {-6}-10 ^ {16})发生微小变化。在\ phi中n(x,ϕ)p(x,ϕ)ni(x)e(Ei(x,ϕ)Ef)ϕ1061016)ϕ

我用scipy的Newton-Krylov用数值方法求解了这个方程,但是它永远不会收敛(实际上,在计算雅可比方程时总是会报告一个错误)。我从Newton-Krylov求解器切换为fsolve(基于MINPACK hybrd),它第一次起作用!

牛顿-克里洛夫(Newton-Krylov)不适合某些问题的一般原因吗?输入方程是否需要以某种方式进行调节?

也许需要更多信息来发表评论,但是为什么您认为fsolve在这种情况下有效?


牛顿-克里洛夫(Newton-Krylov)的雅各布式(Jacobian)失效使我遇到了同样的问题,并且发现将方法从“ lgmres”更改为“ gmres”(sol = newton_krylov(func, guess, method='gmres'))可以解决问题。不确定原因,但其他任何遇到此问题的人都可以考虑这样做。
亚瑟·登特

Answers:


18

您可能会遇到两个问题。

不适

首先,问题是病态的,但是如果您仅提供一个残差,则牛顿-克里洛夫通过有限差分残差以得到雅可比行列式来扔掉有效数字的一半:

J[x]yF(x+ϵy)F(x)ϵ

1016,则它实际上是奇异的,Krylov会停滞或返回错误的解决方案。这也可以防止直接求解器收敛。有时,您可以使用多重网格方法将其均匀化为具有易处理条件的粗网格。如果无法通过更好的条件来解决问题,则值得以四精度工作。(例如,PETSc支持。)

注意,相同的问题适用于拟牛顿法,尽管没有有限的区别。对于非紧致算子(例如,微分方程)的所有可伸缩方法,都必须使用Jacobian信息进行预处理。

fsolve尽管本质上是奇异的雅可比行列式(即,有限差分会产生很多“噪声”),但要么不使用雅可比行列式信息,要么使用狗腿法或移动以“梯度下降”法取得进展。有限精度算法)。这是不可扩展的,并且fsolve随着问题规模的增加,速度可能会变慢。

全球化

如果线性问题得到了正确的解决,我们可以排除与线性问题(Krylov)有关的问题,并将重点放在非线性方面。局部极小值和不平滑特征会缓慢收敛或导致停滞。Poisson-Boltzmann是一个平滑的模型,因此,如果您以足够好的初始猜测开始,牛顿将二次收敛。大多数全球化策略都涉及某种延续,以产生针对最终迭代的高质量初始猜测。示例包括网格连续(例如,完全多重网格),参数连续和伪瞬态连续。后者通常适用于稳态问题,并提供了一些全局收敛理论,请参阅Coffey,Kelley和Keyes(2003)。通过搜索可以找到这篇论文,这可能对您有用:Shestakov,Milovich和Noy(2002)用拟暂态连续和有限元法求解非线性Poisson-Boltzmann方程。伪瞬态连续与Levenberg-Marquardt算法紧密相关。

进一步阅读

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.