Euler正演方法的步长和稳定性

计算科学 稳定 显式方法
2021-12-26 06:26:06

我正在尝试使用欧拉前向方法计算为以下非线性 IVP 提供稳定性的最大步长:

u(t)=200tu(t)2,u0=1,t[0,3],

解析解为u=(1+100t2)1(见下图)。在此处输入图像描述从线性稳定性分析,即通过求解u=λu,u0=1,λ<0,可以证明欧拉前锋的稳定区域是|1+λh|1, 在哪里h是步长。所以步长必须是h<2/|λ|.
我意识到这仅适用于线性问题,但是在解决一般 IVP(包括非线性项)时:

u(t)=f(t,u(t)),u(t0)=u0

计算特征值λi(t)A=fui(t,u(t)), 在哪里fui是雅可比矩阵,当使用所有的最小值时,也应该导致合理的步长λi. 也就是说,如果u(t)是渐近稳定的。
所以下一步是计算雅可比矩阵(在这种情况下只有一个条目):
fui=400t1+100t2=λ. 下确界λ在给定的间隔上是λ=20因此 h=2/20. 下图显示λ(t). 然而,随着模型的爆炸,步长似乎太大了。稳定似乎在某个地方
在此处输入图像描述
h=2/29. 所以我有两个问题:
1:在计算步长时我做错了什么,或者这个例子只是病态的,如果是这样,为什么?
2:如何实际计算提供稳定性的最大步长?

1个回答

使用精确解来估计λ可能无法给出适用于数值方案的时间步长。当地估计λ

λ=400tu
如果你尝试这一步
h=min(2/20,2/(400tu+1012))
它是稳定的,但当然准确性很差。这是一个代码

import numpy as np
import matplotlib.pyplot as plt

t = 0.0
u = 1.0
tdata, udata = [], []
tdata.append(t); udata.append(u)
while t<3.0:
    dt = np.min([2.0/20.0, 2.0/(400*t*u+1.0e-12)])
    rhs = - 200.0*t*u**2
    u = u + dt*rhs
    t += dt
    print("dt, t =", dt, t)
    tdata.append(t); udata.append(u)

tdata = np.array(tdata); udata = np.array(udata)
uexact = 1.0/(1.0 + 100*tdata**2)
plt.plot(tdata,udata,tdata,uexact)
plt.legend(('Forward Euler','Exact'))
plt.xlabel('t'); plt.ylabel('u')
plt.show()

第一步,步长为第一步之后,数值解仍然是 所以你需要在第二步使用步长 ,小于 .h=0.1u=1

λ=4000.11=40
h2/40=0.05
2/20=0.1

这个特定问题还有另一个问题。开始,解决方案应保留在中。如果由于某种原因它变为负数,则正向 euler 会将其带到,就像一样。ODE 本身具有这种行为。所以对于这个问题,如果精确解应该是正的,则应该选择时间步长,使数值解保持为正。 我们有 iff 而且这个条件也符合线性稳定性分析的限制。u=1[0,1]h=2/20

un+1=un200tnun2h
un0 un+10
h1200tnun