2 点 BVP 求解器:如何计算误差

计算科学 有限差分 数字 收敛 微分方程
2021-12-20 14:25:12

背景

我正在阅读 LeVeque 书中的第 2 章:https ://faculty.washington.edu/rjl/fdmbook/

我在 Python 中构建了自己的求解器来求解 2 点 BVP:

ϵu+u(u1)=0,u(0)=α,u(1)=β

我遵循了 VoB 在这篇文章中的回答所描述的确切步骤: 非线性边界值问题。如何计算雅可比?(均匀网格;牛顿法求解G(U)=0 wrt U)。

对于参数[ϵ,α,β]=[0.01,1,1.5] 我得到这个结果

在此处输入图像描述

在第 10 次运行中,它已经收敛到我认为是真正的解决方案。这对我来说看起来非常正确。(run1 是牛顿步的初始猜测)。我的步长是Δx=h=0.005

我的问题

在帖子中提到收敛的阶数是 2。但是我如何计算误差来确定收敛的阶数是 2?

1个回答

我在链接答案中计算解决方案的方式是经典的:我只是采用了一个参考解决方案(假设代码是正确的,即我找到的数值解决方案是正确的),步长足够小,比如然后我计算了具有较小的解,并且对于其中的每一个我计算了在双对数图中。我认为在那种情况下我使用了最高范数,因为参数的选择不会产生边界层。正如 Lutz 在评论中指出的那样,这种规范可能不是最适合这种情况的规范。hh=109hh||eh||

请注意,这告诉您该方法已正确实施,而不是您的解决方案是正确的。如果您的设置中有拼写错误,您可能会收敛到另一种解决方案,而不是想要的解决方案。

我认为您可以使用我在该答案中提供的 Octave/MatLab 代码来测试收敛顺序。如果你想坚持使用 Python,只需定义类似

m_range = [10**(i) for i in range(0,4)] #number of points in each grid

并循环这个。在正文中,只需计算解决方案并检查错误范数,将其附加到列表中,例如error_list.

最后,只是做plt.loglog(m_range,error_list)或类似的事情。你的线是否适合错误的点并不重要,就像我的回答一样(我使用了一个技巧将其移向错误点):重要的一点是错误点与斜率的线平行。2