本篇文章是西安交大《计算物理与程序设计》课程的笔记,程序语言为 MATLAB。内容主要包括 MATLAB 基础语法,数值积分方法,方程求根,常微分方程的初值问题,常微分方程的边值问题和偏微分方程的边值问题。
MATLAB基础语法
标量向量矩阵
复数 i \mathrm{i} i 在MATLAB中应当写作 1i
。
注意向量是行向量还是列向量。
矩阵的非共轭转置为 transpose
,共轭转置为 ctranspose
。
函数
匿名函数:f = @(x) expr(x)
,这样创建的 f
是函数句柄 (function handle) 。
普通函数:function y = f(x)
,这样创建的 f
是函数本身,调用函数句柄需要使用 @f
。
数值积分
内置命令
MATLAB内置的一维数值积分命令为 integral
,语法为
1 I = integral(f,xmin,xmax)
integral
使用全局自适应积分和默认误差容限在 x_\min 至 x_\max 间以数值形式为函数 f f f 求积分,积分限为 + ∞ +\infty + ∞ 时可用 Inf
表示,积分限为 − ∞ -\infty − ∞ 时可用 -Inf
表示。
类似的二维数值积分和三维数值积分命令为 integral2
和 integral3
,语法为
1 2 integral2(fun,xmin,xmax,ymin,ymax) integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax)
梯形公式
以下讨论中,总是将积分区间 ( a , b ) (a,b) ( a , b ) 切割为 N N N 份,并设初始节点 x 1 = a x_1=a x 1 = a ,末端节点 x N + 1 = b x_{N+1}=b x N + 1 = b ,积分步长 h h h 为
h = b − a N h = \frac{b-a}{N}
h = N b − a
梯形公式来源于线性插值。在区间 [ x i , x i + 1 ] [x_i,x_{i+1}] [ x i , x i + 1 ] 上梯形公式给出的数值积分为
I trapz = h 2 [ f ( x i ) + f ( x i + 1 ) ] I_{\text{trapz}} = \frac{h}{2} \left[ f(x_i)+f(x_{i+1})\right]
I trapz = 2 h [ f ( x i ) + f ( x i + 1 ) ]
函数 f ( x ) f(x) f ( x ) 在区间 ( a , b ) (a,b) ( a , b ) 上的梯形数值积分公式为
I trapz = h 2 f ( a ) + h ∑ i = 2 N f ( x i ) + h 2 f ( b ) I_{\text{trapz}} = \frac{h}{2} f(a)+ h \sum_{i=2}^N f(x_i) +\frac{h}{2} f(b)
I trapz = 2 h f ( a ) + h i = 2 ∑ N f ( x i ) + 2 h f ( b )
MATLAB代码为
1 2 3 4 5 6 7 function numint = numint_trapz (f,x_min,x_max,n) h = (x_max-x_min)/n; x = x_min:h:x_max; fx = f(x); numint = h/2 *(f(x_min)+f(x_max)+2 *sum(fx(2 :n))); end
Simpson公式
Simpson公式来源于二次插值,涉及连续三个节点,三个节点夹着两个区间,因此 N N N 必须是 2 2 2 的倍数。
在区间 [ x i , x i + 2 ] [x_i,x_{i+2}] [ x i , x i + 2 ] 上Simpson公式给出的数值积分为
I simpon = h 3 [ f ( x i ) + 4 f ( x i + 1 ) + f ( x i + 2 ) ] I_{\text{simpon}} = \frac{h}{3} \left[ f(x_i)+ 4f(x_{i+1}) + f(x_{i+2} )\right]
I simpon = 3 h [ f ( x i ) + 4 f ( x i + 1 ) + f ( x i + 2 ) ]
函数 f ( x ) f(x) f ( x ) 在区间 ( a , b ) (a,b) ( a , b ) 上的Simpson数值积分公式为
I simpson = h 3 f ( a ) + 4 h 3 ∑ i = 2 sep = 2 N f ( x i ) + 2 h 3 ∑ i = 3 sep = 2 N − 1 f ( x i ) + h 2 f ( b ) I_{\text{simpson}} = \frac{h}{3} f(a)+ \frac{4h}{3} \sum_{\scriptstyle i=2 \atop \scriptstyle \text{sep}=2}^N f(x_i) + \frac{2h}{3} \sum_{\scriptstyle i=3 \atop \scriptstyle \text{sep}=2}^{N-1} f(x_i) + \frac{h}{2} f(b)
I simpson = 3 h f ( a ) + 3 4 h sep = 2 i = 2 ∑ N f ( x i ) + 3 2 h sep = 2 i = 3 ∑ N − 1 f ( x i ) + 2 h f ( b )
MATLAB代码为
1 2 3 4 5 6 7 8 function numint = simpson (f,x_min,x_max,n) h = (x_max-x_min)/n; x = x_min:h:x_max; fx = f(x); numint = h/3 *(f(x_min)+f(x_max)+4 *sum(fx(2 :2 :n))+2 *sum(fx(3 :2 :n-1 ))); end
方程的数值解
内置命令
x = fzero(f,x0)
从 x 0 x_0 x 0 开始,尝试求出 f ( x ) = 0 f(x) = 0 f ( x ) = 0 的解并赋给 x x x 。
命令要求根必须是 f ( x ) f(x) f ( x ) 变号的位置,因此 fzero
无法求解函数零点同时为函数极值点的问题,例如 x 2 = 0 x^2=0 x 2 = 0 。
x = fsolve(F,x0)
从 x 0 \bm{x}_0 x 0 开始尝试求解向量方程/ n n n 元非线性方程组 F ( x ) = 0 \boldsymbol{F}(\boldsymbol{x}) = \boldsymbol{0} F ( x ) = 0 的解 x = [ x 1 , x 2 , ⋯ , x n ] T \bm{x} = [x_1, x_2, \cdots, x_n]^T x = [ x 1 , x 2 , ⋯ , x n ] T 。
例如求解非线性方程组对应的命令为
{ e − ( x 1 + x 2 ) − x 2 ( 1 + x 1 2 ) = 0 x 1 cos ( x 2 ) + x 2 sin ( x 1 ) − 1 2 = 0 \begin{cases}
e^{-\left(x_1+x_2\right)}-x_2\left(1+x_1^2\right)=0 \\
x_1 \cos \left(x_2\right)+x_2 \sin \left(x_1\right)-\frac{1}{2}=0
\end{cases}
{ e − ( x 1 + x 2 ) − x 2 ( 1 + x 1 2 ) = 0 x 1 cos ( x 2 ) + x 2 sin ( x 1 ) − 2 1 = 0
1 2 3 x = fsolve(F,[0 ,0 ]); F(1 ) = exp (-(x(1 )+x(2 ))) - x(2 )*(1 +x(1 )^2 ); F(2 ) = x(1 )*cos (x(2 )) + x(2 )*sin (x(1 )) - 0.5 ;
二分法
二分法利用二分查找逐步缩小根 x 0 x_0 x 0 所在的区间 [ a , b ] [a,b] [ a , b ] ,直到 ∣ a − b ∣ < ε | a-b | <\varepsilon ∣ a − b ∣ < ε 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function [root,deviation] = bisection (f,a,b,epsilon) if f(a)*f(b)>0 warning('No root in the interval.' ); else while abs (b-a) > epsilon mid = (a+b)/2 ; if f(mid)*f(a)<0 b = mid; else a = mid; end end end root = (a+b)/2 ; deviation = abs (f(a)-f(b)); end
牛顿法
牛顿法需要知晓 f ( x ) f(x) f ( x ) 的导数 f ′ ( x ) f^\prime(x) f ′ ( x ) 的解析表达式,并给定一个启动值 x 0 x_0 x 0 。Newton - Raphson 迭代公式为
x i + 1 = x i − f ( x i ) f ′ ( x i + 1 ) x_{i+1} = x_i - \frac{f(x_i)}{f^\prime (x_{i+1})}
x i + 1 = x i − f ′ ( x i + 1 ) f ( x i )
当 ∣ x i + 1 − x i ∣ < ε | x_{i+1} - x_i | <\varepsilon ∣ x i + 1 − x i ∣ < ε 且 f ( x i ) < δ f(x_i)<\delta f ( x i ) < δ 时视为找到了根。
MATLAB代码为
1 2 3 4 5 6 7 8 9 10 function root = newton (f,f_derivative,x0,delta,epsilon) x1 = x0 - f(x0)/f_derivative(x0); while abs (x1-x0)>epsilon || abs (f(x1))>delta x2 = x1 - f(x1)/f_derivative(x1); x0 = x1; x1 = x2; end root = x1; end
弦割法
弦割法迭代公式需要两个相近的启动值 x 0 , x 1 x_0,x_1 x 0 , x 1 ,并用割线的斜率近似代替导数的斜率。迭代公式为
x i + 1 = x i − f ( x i ) x i − x i − 1 f ( x i ) − f ( x i − 1 ) x_{i+1} = x_i - f(x_i) \frac{x_i - x_{i-1}}{f(x_i) - f(x_{i-1})}
x i + 1 = x i − f ( x i ) f ( x i ) − f ( x i − 1 ) x i − x i − 1
1 2 3 4 5 6 7 8 9 function root = secant (f,x0,x1,epsilon,delta) while abs (x1-x0)>epsilon || abs (f(x1))>delta x2 = x1 - (x1-x0)/(f(x1)-f(x0))*f(x1); x0 = x1; x1 = x2; end root = x1; end
预搜索弦割
当恰当的启动值未知时,可从某点开始进行预搜索,找到有根区间后再应用上述三种方法求数值解,程序以弦割法为例。
简单搜索结合弦割法求根:x 0 x_0 x 0 为启动值,step
为搜索步长,搜索到异号区间 [ x i , x i + step ] [x_i,x_i + \text{step}] [ x i , x i + step ] 时应用弦割法求解区间内的根。
1 2 3 4 5 6 7 function root = presecant (f,x0,step,epsilon,delta) while f(x0+step)*f(x0)>0 x0 = x0 + step; end root = secant(f,x0,x0+step,epsilon,delta); end
常微分方程的初值问题
内置命令
一阶非线性常微分方程的普遍形式为
{ d y d x = f ( x , y ) y ( x 0 ) = y 0 ⟹ y = y ( x ) \left\{ \begin{matrix}
\dfrac{\mathrm{d}y}{\mathrm{d}x} = f(x,y) \\
y(x_0) = y_0
\end{matrix} \right. \implies y=y(x)
{ d x d y = f ( x , y ) y ( x 0 ) = y 0 ⟹ y = y ( x )
找出一阶非线性常微分方程的解法后,可以很容易将其推广至常微分方程组,只需将待求解函数改为向量函数即可
{ d y d x = f ( x , y ) y ( x 0 ) = y 0 ⟹ y = y ( x ) \left\{ \begin{matrix}
\dfrac{\mathrm{d}\boldsymbol{y}}{\mathrm{d}x} = f(x,\boldsymbol{y}) \\
\boldsymbol{y}(x_0) = \boldsymbol{y}_0
\end{matrix} \right. \implies \boldsymbol{y}=\boldsymbol{y}(x)
{ d x d y = f ( x , y ) y ( x 0 ) = y 0 ⟹ y = y ( x )
对于高阶常微分方程,总可以通过降阶化为一阶常微分方程组,例如牛顿第三定律
m d 2 x d t 2 = F ( x , t ) ⟺ { d x d t = p m d p d t = F ( x , t ) ⟺ d y d t = f ( t , y ) m \frac{\mathrm{d}^2 x}{\mathrm{d} t^2}=F(x, t) \iff \begin{cases}
\frac{\mathrm{d} x}{\mathrm{d} t} = \frac{p}{m} \\
\frac{\mathrm{d}p}{\mathrm{d} t} = F(x,t)
\end{cases} \iff \dfrac{\mathrm{d}\boldsymbol{y}}{\mathrm{d}t} = f(t,\boldsymbol{y})
m d t 2 d 2 x = F ( x , t ) ⟺ { d t d x = m p d t d p = F ( x , t ) ⟺ d t d y = f ( t , y )
其中 y ( t ) = [ x ( t ) , p ( t ) ] , f ( t , y ) = [ p ( t ) / m , F ( x , t ) ] \boldsymbol{y}(t)=[x(t),p(t)], \ f(t,\boldsymbol{y}) = [p(t)/m, F(x,t)] y ( t ) = [ x ( t ) , p ( t ) ] , f ( t , y ) = [ p ( t ) / m , F ( x , t ) ] 。因此,关键在于求解一阶非线性常微分方程。
Taylor级数方法
Taylor级数法适用于 f ( x , y ) f(x,y) f ( x , y ) 的解析表达式已知且简单,只是方程非线性导致需要数值计算。方法就是将区间离散化,对 y ( x ) y(x) y ( x ) 求Taylor级数然后迭代。设区间步长为 h = x i + 1 − x i h=x_{i+1}-x_i h = x i + 1 − x i ,则有
y ( x i + 1 ) = y ( x i ) + h d y d x ∣ x i + h 2 2 d 2 y d x 2 ∣ x i + ⋯ y(x_{i+1}) = y(x_i) + h \frac{\mathrm{d}y}{\mathrm{d}x}\bigg|_{x_i} + \frac{h^2}{2} \frac{\mathrm{d}^2 y}{\mathrm{d}x^2}\bigg|_{x_i} + \cdots
y ( x i + 1 ) = y ( x i ) + h d x d y ∣ ∣ ∣ ∣ ∣ x i + 2 h 2 d x 2 d 2 y ∣ ∣ ∣ ∣ ∣ x i + ⋯
其中
d y d x ∣ x i = f ( x i , y i ) \frac{\mathrm{d}y}{\mathrm{d}x}\bigg|_{x_i} = f(x_i,y_i)
d x d y ∣ ∣ ∣ ∣ ∣ x i = f ( x i , y i )
d 2 y d x 2 ∣ x i = d d x f ( x , y ( x ) ) ∣ x i = ( ∂ f ∂ x + ∂ f ∂ y d y d x ) ∣ x i = ( ∂ f ∂ x + ∂ f ∂ y f ) ∣ x i \frac{\mathrm{d}^2 y}{\mathrm{d}x^2}\bigg|_{x_i} = \frac{\mathrm{d}}{\mathrm{d}x}f(x,y(x))\bigg|_{x_i} = \left(\frac{\partial f}{\partial x} + \frac{\partial f}{\partial y} \frac{\mathrm{d}y}{\mathrm{d}x} \right)\bigg|_{x_i} = \left(\frac{\partial f}{\partial x} + \frac{\partial f}{\partial y} f\right) \bigg|_{x_i}
d x 2 d 2 y ∣ ∣ ∣ ∣ ∣ x i = d x d f ( x , y ( x ) ) ∣ ∣ ∣ ∣ ∣ x i = ( ∂ x ∂ f + ∂ y ∂ f d x d y ) ∣ ∣ ∣ ∣ ∣ x i = ( ∂ x ∂ f + ∂ y ∂ f f ) ∣ ∣ ∣ ∣ ∣ x i
数值方法综述
其最基本的数值方法是,将第一个方程的 d x \mathrm{d}x d x 移到右边去,在 [ x i , x i + 1 ] [x_i,x_{i+1}] [ x i , x i + 1 ] 上积分得到
y i + 1 − y i = ∫ x i x i + 1 f ( x , y ( x ) ) d x y_{i+1} - y_i = \int_{x_i}^{x_{i+1}} f(x,y(x)) \,\mathrm{d}x
y i + 1 − y i = ∫ x i x i + 1 f ( x , y ( x ) ) d x
这样就能得到从已知的 x i x_i x i 处的函数值 y i y_i y i ,推得下一点 x i + 1 x_{i+1} x i + 1 的函数值 y i + 1 y_{i+1} y i + 1 。
但问题在于 y ( x ) y(x) y ( x ) 在区间 [ x i , x i + 1 ] [x_i,x_{i+1}] [ x i , x i + 1 ] 上的表达式未知,需要用合适的方法进行估计,从而给出被积函数 f ( x , y ( x ) ) f(x,y(x)) f ( x , y ( x ) ) 的表达式。我们可以利用前几点的函数值 ( x i − 1 , y i − 1 ) , ( x i − 2 , y i − 2 ) , ⋯ (x_{i-1},y_{i-1}),(x_{i-2},y_{i-2}),\cdots ( x i − 1 , y i − 1 ) , ( x i − 2 , y i − 2 ) , ⋯ 作线性外插拟合 [ x i , x i + 1 ] [x_i,x_{i+1}] [ x i , x i + 1 ] 上 y ( x ) y(x) y ( x ) 的表达式,这就是所谓的「多步法」,在此不介绍。
或者,也可以利用中值定理近似求积分。根据中值定理,必然存在某点 ( x i + θ h , y i + θ h ) (x_i+\theta h,y_i + \theta h) ( x i + θ h , y i + θ h ) ,使得被积函数可用该点的函数值代替
∫ x i x i + 1 f ( x , y ( x ) ) d x = h f ( x i + θ h , y i + θ h ) \int_{x_i}^{x_{i+1}} f(x,y(x)) \,\mathrm{d}x = h f(x_i+\theta h,y_i + \theta h)
∫ x i x i + 1 f ( x , y ( x ) ) d x = h f ( x i + θ h , y i + θ h )
如何找出最优的 f ( x i + θ h , y i + θ h ) f(x_i+\theta h,y_i + \theta h) f ( x i + θ h , y i + θ h ) 呢?这就是所谓的Runge-Kutta法。
Euler法
最简单的方法是直接用起点 x i x_i x i 处函数斜率 K 1 = f ( x i , y i ) K_1=f(x_i,y_i) K 1 = f ( x i , y i ) 去当中值,也就是 θ = 0 \theta=0 θ = 0 ,这就是Euler法:
y i + 1 − y i = h f ( x i , y i ) y_{i+1} - y_i = h f(x_i,y_i)
y i + 1 − y i = h f ( x i , y i )
其几何意义是用斜率为 K 1 = f ( x i , y i ) K_1=f(x_i,y_i) K 1 = f ( x i , y i ) 的斜线拟合了 y ( x ) y(x) y ( x ) ,即设 y ( x ) y(x) y ( x ) 在 [ x i , x i + 1 ] [x_i,x_{i+1}] [ x i , x i + 1 ] 上的表达式是 y ( x ) = K 1 ( x − x i ) + y i y(x) = K_1 (x - x_i)+y_i y ( x ) = K 1 ( x − x i ) + y i 。Euler法的精度是 ο ( h 2 ) \omicron(h^2) ο ( h 2 ) ,因为 y ( x ) y(x) y ( x ) 在 x i x_i x i 处的Taylor级数为 y ( x i + 1 ) = y ( x i ) + h f ( x i , y i ) + ο ( h 2 ) y(x_{i+1}) = y(x_i) + h f(x_i,y_i) + \omicron(h^2) y ( x i + 1 ) = y ( x i ) + h f ( x i , y i ) + ο ( h 2 ) 。
Euler法的MATLAB代码为
1 2 3 4 5 6 7 8 9 10 11 12 13 function y = odeEuler (f,tspan,y0,n) dim = length (y0); h = (tspan(2 ) - tspan(1 )) / (n-1 ); y = zeros (dim, n); y(:, 1 ) = y0(:); t = linspace (tspan(1 ), tspan(2 ), n); for i = 1 :n-1 K = f(t(i ), y(:,i )); y(:,i +1 ) = y(:,i ) + h*K; end end
Euler法可以改进为梯形公式
梯形公式的MATLAB代码为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function y = odeTrapz (f,tspan,y0,n) dim = length (y0); h = (tspan(2 ) - tspan(1 )) / (n-1 ); y = zeros (dim, n); y(:, 1 ) = y0(:); t = linspace (tspan(1 ), tspan(2 ), n); for i = 1 :n-1 K1 = f(t(i ), y(:,i )); K2 = f(t(i )+h, y(:,i )+h*K1); y(:,i +1 ) = y(:,i ) + h/2 *(K1+K2); end end
Runge-Kutta方法
Runge-Kutta法通过求不同节点上的斜率 f ( x i + θ 1 h , y i + θ 1 h ) , f ( x i + θ 2 h , y i + θ 2 h ) , ⋯ f(x_i+\theta_1 h,y_i + \theta_1 h),f(x_i+\theta_2 h,y_i + \theta_2 h),\cdots f ( x i + θ 1 h , y i + θ 1 h ) , f ( x i + θ 2 h , y i + θ 2 h ) , ⋯ 作线性组合,构造中值 K K K 的近似公式,把近似公式和解的Taylor展开式相比较,使其前面若干项相吻合,从而得到相应的高阶方法。其中,节点处的函数值 y i + θ n h y_i + \theta_n h y i + θ n h 以及相应的 f ( x i + θ n h , y i + θ n h ) f(x_i+\theta_n h,y_i + \theta_n h) f ( x i + θ n h , y i + θ n h ) 由前面 n − 1 n-1 n − 1 个节点处的斜率 K 1 , K 2 , ⋯ K_1,K_2,\cdots K 1 , K 2 , ⋯ 线性组合后作为区间平均斜率得到的一次函数近似而得。
例如:已有 K 1 K_1 K 1 ,欲求区间中点处的函数值,可得 y 1 / 2 = y i + h 2 K 1 y_{1/2} = y_i + \frac{h}{2} K_1 y 1 / 2 = y i + 2 h K 1 ;已有 K 1 , K 2 K_1,K_2 K 1 , K 2 ,欲求 2 / 3 2/3 2 / 3 节点处的函数值,可设为 y 2 / 3 = y i + 2 3 h ( λ 1 K 1 + λ 2 K 2 ) y_{2/3} = y_i + \frac{2}{3}h (\lambda_1 K_1 +\lambda_2 K_2) y 2 / 3 = y i + 3 2 h ( λ 1 K 1 + λ 2 K 2 ) ,其中 λ 1 \lambda_1 λ 1 和 λ 2 \lambda_2 λ 2 是待定系数。
二阶Runge-Kutta法使用区间中点处的斜率 K 2 K_2 K 2 作中值,表达式为
{ y i + 1 = y i + h K 2 + ο ( h 3 ) K 1 = f ( x i , y i ) K 2 = f ( x i + 1 2 h , y i + 1 2 h K 1 ) \begin{cases}
y_{i+1} = y_i + h K_2 + \omicron(h^3) \\
K_1 = f(x_i,y_i) \\
K_2 = f(x_i+\frac{1}{2}h,y_i + \frac{1}{2}hK_1)
\end{cases}
⎩ ⎪ ⎪ ⎨ ⎪ ⎪ ⎧ y i + 1 = y i + h K 2 + ο ( h 3 ) K 1 = f ( x i , y i ) K 2 = f ( x i + 2 1 h , y i + 2 1 h K 1 )
四阶Runge-Kutta法由区间起点、中点、终点处的斜率组合而成,其中中点斜率经过两次修正分别得到 K 2 , K 3 K_2,K_3 K 2 , K 3 ,均要使用
{ y i + 1 = y i + h ⋅ 1 6 ( K 1 + 2 K 2 + 2 K 3 + K 4 ) + ο ( h 5 ) K 1 = f ( x i , y i ) K 2 = f ( x i + 1 2 h , y i + 1 2 h K 1 ) K 3 = f ( x i + 1 2 h , y i + 1 2 h K 2 ) K 4 = f ( x i + h , y i + h K 3 ) \begin{cases}
y_{i+1} = y_i + h \cdot\frac{1}{6} (K_1 + 2 K_2 + 2K_3 +K_4) + \omicron(h^5) \\
K_1 = f(x_i,y_i) \\
K_2 = f(x_i+\frac{1}{2}h,y_i + \frac{1}{2}hK_1) \\
K_3 = f(x_i+\frac{1}{2}h,y_i + \frac{1}{2}hK_2) \\
K_4 = f(x_i+h,y_i + h K_3)
\end{cases}
⎩ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎧ y i + 1 = y i + h ⋅ 6 1 ( K 1 + 2 K 2 + 2 K 3 + K 4 ) + ο ( h 5 ) K 1 = f ( x i , y i ) K 2 = f ( x i + 2 1 h , y i + 2 1 h K 1 ) K 3 = f ( x i + 2 1 h , y i + 2 1 h K 2 ) K 4 = f ( x i + h , y i + h K 3 )
经典四阶Runge-Kutta法的MATLAB代码为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function y = odeRK4 (f,tspan,y0,n) dim = length (y0); h = (tspan(2 ) - tspan(1 )) / (n-1 ); y = zeros (dim, n); y(:, 1 ) = y0(:); t = linspace (tspan(1 ), tspan(2 ), n); for i = 1 :n-1 K1 = f(t(i ), y(:,i )); K2 = f(t(i )+h/2 , y(:,i )+K1*h/2 ); K3 = f(t(i )+h/2 , y(:,i )+K2*h/2 ); K4 = f(t(i )+h, y(:,i )+K2*h/2 ); y(:,i +1 ) = y(:,i ) + h/6 * (K1+2 *K2+2 *K3+K4); end end
Numerov算法
Numerov算法仅适用于求解不含一阶导数项的二阶常微分方程初值问题
{ d 2 y d x 2 + k ( x ) y = S ( x ) y ( x 0 ) = y 0 , y ′ ( x 0 ) = K \begin{cases}
\displaystyle
\frac{\mathrm{d}^2 y}{\mathrm{~d} x^2}+k(x) y=S(x) \\
\,y(x_0)=y_0 , \, y^\prime (x_0)= K
\end{cases}
⎩ ⎪ ⎨ ⎪ ⎧ d x 2 d 2 y + k ( x ) y = S ( x ) y ( x 0 ) = y 0 , y ′ ( x 0 ) = K
其迭代公式为
y n + 1 ( 1 + h 2 12 k n + 1 ) = 2 y n ( 1 − 5 h 2 12 k n ) − y n − 1 ( 1 + h 2 12 k n − 1 ) + h 2 12 ( S n + 1 + 10 S n + S n − 1 ) + O ( h 6 ) y_{n+1}\left(1+\frac{h^2}{12} k_{n+1}\right)=2 y_n\left(1-\frac{5 h^2}{12} k_n\right)-y_{n-1}\left(1+\frac{h^2}{12} k_{n-1}\right)+\frac{h^2}{12}\left(S_{n+1}+10 S_n+S_{n-1}\right)+\mathcal{O}\left(h^6\right)
y n + 1 ( 1 + 1 2 h 2 k n + 1 ) = 2 y n ( 1 − 1 2 5 h 2 k n ) − y n − 1 ( 1 + 1 2 h 2 k n − 1 ) + 1 2 h 2 ( S n + 1 + 1 0 S n + S n − 1 ) + O ( h 6 )
Numerov算法是二步法,需要2个启动值。我们已经有一个 y 0 y_0 y 0 作为启动值,第二个启动值可利用Taylor展开获得
y 1 = y 0 + h y ′ ( x 0 ) = y 0 + K h y_1 = y_0 +h y^\prime (x_0)=y_0+Kh
y 1 = y 0 + h y ′ ( x 0 ) = y 0 + K h
MATLAB代码为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function y = numerov (kfun,Sfun,xspan,y0,K,n) dim = length (y0); h = (xspan(2 ) - xspan(1 )) / (n-1 ); y = zeros (dim, n); x = linspace (xspan(1 ), xspan(2 ), n); y(:, 1 ) = y0(:); y(:, 2 ) = y0(:)+K*h; k = arrayfun(kfun,x); S = arrayfun(Sfun,x); for i = 2 :n-1 y(:,i +1 ) = (2 *y(:,i )*(1 -5 *h*h/12 *k(i ))-y(:,i -1 )*(1 +h*h/12 *k(i -1 ))+h*h/12 *(S(:,i +1 )+10 *S(:,i )+S(:,i -1 )))/(1 +h*h/12 *k(i +1 )); end end
常微分方程的边值问题
二阶线性常微分方程
二阶线性常微分方程是一般二阶ODE的一个特例,其普遍形式为
{ y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) y ( a ) = α , y ( b ) = β \begin{cases}
y^{\prime \prime}+p(x) y^{\prime}+q(x) y=f(x) \\
y(a)=\alpha, \,y(b)=\beta
\end{cases}
{ y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) y ( a ) = α , y ( b ) = β
可转化为两个初值问题的叠加
{ y 1 ′ ′ + p ( x ) y 1 ′ + q ( x ) y 1 = f ( x ) y 1 ( a ) = α , y 1 ′ ( a ) = 0 + { y 2 ′ ′ + p ( x ) y 2 ′ + q ( x ) y 2 = 0 y 2 ( a ) = 0 , y 2 ′ ( a ) = 1 \begin{cases}
y^{\prime \prime}_1 +p(x) y^{\prime}_1 +q(x) y_1 =f(x) \\
y_1 (a)=\alpha, \,y^\prime_1 (a)=0
\end{cases} \quad + \quad
\begin{cases}
y^{\prime \prime}_2 +p(x) y^{\prime}_2 +q(x) y_2 =0\\
y_2 (a)=0, \, y^\prime_2 (a)=1
\end{cases}
{ y 1 ′ ′ + p ( x ) y 1 ′ + q ( x ) y 1 = f ( x ) y 1 ( a ) = α , y 1 ′ ( a ) = 0 + { y 2 ′ ′ + p ( x ) y 2 ′ + q ( x ) y 2 = 0 y 2 ( a ) = 0 , y 2 ′ ( a ) = 1
方程的解为
y ( x ) = y 1 ( x ) + β − y 1 ( b ) y 2 ( b ) y 2 ( x ) y(x)=y_1(x)+\frac{\beta-y_1(b)}{y_2(b)} y_2(x)
y ( x ) = y 1 ( x ) + y 2 ( b ) β − y 1 ( b ) y 2 ( x )
其中 y 2 ( b ) ≠ 0 y_2(b)\neq 0 y 2 ( b ) = 0 。
打靶法
第一类边值条件
第一类边值条件(Dirichlet condition)下的二阶非线性常微分方程可以写作
{ y ′ ′ = f ( x , y , y ′ ) y ( a ) = α , y ( b ) = β \begin{cases}
y^{\prime \prime} = f(x,y,y^\prime) \\
y(a)=\alpha, \,y(b)=\beta
\end{cases}
{ y ′ ′ = f ( x , y , y ′ ) y ( a ) = α , y ( b ) = β
打靶法的基本思想是:遍历可能的导数初值 y ′ ( a ) = s y^\prime(a) = s y ′ ( a ) = s ,求解对应的初值问题
{ y ′ ′ = f ( x , y , y ′ ) y ( a ) = α , y ′ ( a ) = s \begin{cases}
y^{\prime \prime} = f(x,y,y^\prime) \\
y(a)=\alpha, \,y^\prime(a) = s
\end{cases}
{ y ′ ′ = f ( x , y , y ′ ) y ( a ) = α , y ′ ( a ) = s
直到寻找到一个 s = s 0 s=s_0 s = s 0 ,使得初值问题的解满足 y ( b ) = β y(b)=\beta y ( b ) = β 为止。即寻找方程 y ( b , s ) − β = 0 y(b,s)-\beta = 0 y ( b , s ) − β = 0 关于变量 s s s 的根,其中 y y y 是满足初值 y ( a ) = α , y ′ ( a ) = s y(a)=\alpha, \,y^\prime(a)=s y ( a ) = α , y ′ ( a ) = s 的函数。
在具体实现方法上,可应用弦割法求解。因此打靶法求解第一类边值条件的步骤为
给定初始点的斜率猜测值 s 1 s_1 s 1 ;
用常微分方程的初值问题解法求解 y ( b , s 1 ) y(b,s_1) y ( b , s 1 ) ;
给出另一个斜率猜测值 s 2 s_2 s 2 作为弦割法的第二个启动点;
用常微分方程的初值问题解法求解 y ( b , s 2 ) y(b,s_2) y ( b , s 2 ) ;
将 s 1 , s 2 s_1,s_2 s 1 , s 2 作为启动点,弦割法求解方程 @(s) y(b,s) - beta = 0
第二类边值条件
第二类边值条件(Neumann condition)下的二阶非线性常微分方程可以写作
{ y ′ ′ = f ( x , y , y ′ ) y ′ ( a ) = α , y ′ ( b ) = β \begin{cases}
y^{\prime \prime} = f(x,y,y^\prime) \\
y^\prime(a)=\alpha, \,y^\prime(b)=\beta
\end{cases}
{ y ′ ′ = f ( x , y , y ′ ) y ′ ( a ) = α , y ′ ( b ) = β
此时靶心是 y ′ ( b ) = β y^\prime(b)=\beta y ′ ( b ) = β ,子弹是 y ( a ) y(a) y ( a ) ,待求解的初值问题是
{ y ′ ′ = f ( x , y , y ′ ) y ( a ) = s , y ′ ( a ) = α \begin{cases}
y^{\prime \prime} = f(x,y,y^\prime) \\
y(a)=s, \,y^\prime(a) = \alpha
\end{cases}
{ y ′ ′ = f ( x , y , y ′ ) y ( a ) = s , y ′ ( a ) = α
遍历所有可能的 s s s 值,直到找到 s = s 0 s=s_0 s = s 0 使得 y ′ ( b , s ) − β = 0 y^\prime(b,s)-\beta = 0 y ′ ( b , s ) − β = 0 。但要注意,此处的 y ′ ( b , s ) y^\prime(b,s) y ′ ( b , s ) 需通过差分来计算
y ′ ( b , s ) = y ′ ( b , s ) − y ′ ( b − h , s ) h y^\prime(b,s) = \frac{y^\prime(b,s)-y^\prime(b-h,s)}{h}
y ′ ( b , s ) = h y ′ ( b , s ) − y ′ ( b − h , s )
第三类边值条件
第三类边值条件(Robin condition)下的二阶非线性常微分方程可以写作
{ y ′ ′ = f ( x , y , y ′ ) α 1 y ( a ) + β 1 y ′ ( a ) = r 1 α 2 y ( b ) + β 2 y ′ ( b ) = r 2 \begin{cases}
y^{\prime \prime} = f(x,y,y^\prime) \\
\alpha_1 y(a) + \beta_1 y^\prime(a) = r_1 \\
\alpha_2 y(b) + \beta_2 y^\prime(b) = r_2
\end{cases}
⎩ ⎪ ⎪ ⎨ ⎪ ⎪ ⎧ y ′ ′ = f ( x , y , y ′ ) α 1 y ( a ) + β 1 y ′ ( a ) = r 1 α 2 y ( b ) + β 2 y ′ ( b ) = r 2
注意到求解由 y ′ ′ = f ( x , y , y ′ ) y^{\prime \prime} = f(x,y,y^\prime) y ′ ′ = f ( x , y , y ′ ) 描述的初值问题时,常常利用降阶法令 z 1 = y , z 2 = y ′ z_1 = y, z_2 = y^\prime z 1 = y , z 2 = y ′ ,这时二阶ODE将会化成关于向量 z \boldsymbol{z} z 的一阶ODE,进而可应用Runge-Kutta方法求解,同时初值条件也将被转写为
{ α 1 z 1 ( a ) + β 1 z 2 ( a ) = r 1 α 2 z 1 ( b ) + β 2 z 2 ( b ) = r 2 \begin{cases}
\alpha_1 z_1(a) +\beta_1 z_2(a) = r_1 \\
\alpha_2 z_1(b) +\beta_2 z_2(b) = r_2
\end{cases}
{ α 1 z 1 ( a ) + β 1 z 2 ( a ) = r 1 α 2 z 1 ( b ) + β 2 z 2 ( b ) = r 2
此时子弹为 z ( a ) = [ s , r 1 − α 1 s β 1 ] T \boldsymbol{z}(a) = \left[s,\dfrac{r_1-\alpha_1 s}{\beta_1}\right]^T z ( a ) = [ s , β 1 r 1 − α 1 s ] T ,s s s 为可调参数,靶心为 α 2 z 1 ( b ) + β 2 z 2 ( b ) = r 2 \alpha_2 z_1(b) +\beta_2 z_2(b) = r_2 α 2 z 1 ( b ) + β 2 z 2 ( b ) = r 2 。
差分法
差分法适用于线性边值问题,即要求微分方程是线性的,形如 y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) y^{\prime\prime} + p(x) y^{\prime} + q(x) y = f(x) y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) 。
第一类边值条件
第一类边值条件(Dirichlet condition)下的二阶非线性常微分方程可以写作
{ y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) y ( a ) = α , y ( b ) = β \begin{cases}
y^{\prime\prime} + p(x) y^{\prime} + q(x) y = f(x) \\
y(a)=\alpha, \,y(b)=\beta
\end{cases}
{ y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) y ( a ) = α , y ( b ) = β
将待求解区间 [ a , b ] [a,b] [ a , b ] 离散化为 n n n 个节点,y 1 = y ( a ) , y n = y ( b ) y_1 = y(a), \, y_n = y(b) y 1 = y ( a ) , y n = y ( b ) ,即向量的第 1 1 1 个和第 n n n 个分量为边界。
将二阶导数和一阶导数分别差分为
y k + 1 − 2 y k + y k − 1 h 2 + p k y k + 1 − y k − 1 2 h + q k y k = f k , k = 2 , ⋯ , n − 1 \frac{y_{k+1}-2 y_k+y_{k-1}}{h^2}+p_k \frac{y_{k+1}-y_{k-1}}{2 h}+q_k y_k=f_k \, , \, k=2,\cdots,n-1
h 2 y k + 1 − 2 y k + y k − 1 + p k 2 h y k + 1 − y k − 1 + q k y k = f k , k = 2 , ⋯ , n − 1
( 2 − h p k ) y k − 1 + ( 2 h 2 q k − 4 ) y k + ( 2 + h p k ) y k + 1 = 2 h 2 f k , k = 2 , ⋯ , n − 1 \left(2-h p_k\right) y_{k-1}+\left(2 h^2 q_k-4\right) y_k+\left(2+h p_k\right) y_{k+1}=2 h^2 f_k \, , \, k=2,\cdots,n-1
( 2 − h p k ) y k − 1 + ( 2 h 2 q k − 4 ) y k + ( 2 + h p k ) y k + 1 = 2 h 2 f k , k = 2 , ⋯ , n − 1
结合边界条件,可得矩阵方程组
[ 2 h 2 q 2 − 4 2 + h p 2 2 − h p 3 2 h 2 q 3 − 4 2 + h p 3 ⋱ ⋱ ⋱ 2 − h p n − 2 2 h 2 q n − 2 − 4 2 + h p n − 2 2 − h p n − 1 2 h 2 q n − 1 − 4 ] [ y 2 y 3 ⋮ y n − 2 y n − 1 ] = [ 2 h 2 f 1 − ( 2 − h p 1 ) α 2 h 2 f 2 ⋮ 2 h 2 f n − 2 2 h 2 f n − 1 − ( 2 + h p n − 1 ) β ] \begin{bmatrix}
2 h^2 q_2-4 & 2+h p_2 & & & \\
2-h p_3 & 2 h^2 q_3-4 & 2+h p_3 & & \\
& \ddots & \ddots & \ddots & \\
& & 2-h p_{n-2} & 2 h^2 q_{n-2}-4 & 2+h p_{n-2} \\
& & & 2-h p_{n-1} & 2 h^2 q_{n-1}-4
\end{bmatrix}\begin{bmatrix}
y_2 \\
y_3 \\
\vdots \\
y_{n-2} \\
y_{n-1}
\end{bmatrix}=\begin{bmatrix}
2 h^2 f_1-\left(2-h p_1\right) \alpha \\
2 h^2 f_2 \\
\vdots \\
2 h^2 f_{n-2} \\
2 h^2 f_{n-1}-\left(2+h p_{n-1}\right) \beta
\end{bmatrix}
⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 2 h 2 q 2 − 4 2 − h p 3 2 + h p 2 2 h 2 q 3 − 4 ⋱ 2 + h p 3 ⋱ 2 − h p n − 2 ⋱ 2 h 2 q n − 2 − 4 2 − h p n − 1 2 + h p n − 2 2 h 2 q n − 1 − 4 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ y 2 y 3 ⋮ y n − 2 y n − 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 2 h 2 f 1 − ( 2 − h p 1 ) α 2 h 2 f 2 ⋮ 2 h 2 f n − 2 2 h 2 f n − 1 − ( 2 + h p n − 1 ) β ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
第二类边值条件
第二类边值条件(Neumann condition)下的二阶非线性常微分方程可以写作
{ y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) y ′ ( a ) = α , y ′ ( b ) = β \begin{cases}
y^{\prime\prime} + p(x) y^{\prime} + q(x) y = f(x) \\
y^\prime(a)=\alpha, \,y^\prime(b)=\beta
\end{cases}
{ y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) y ′ ( a ) = α , y ′ ( b ) = β
离散化后差分方程仍然为
( 2 − h p k ) y k − 1 + ( 2 h 2 q k − 4 ) y k + ( 2 + h p k ) y k + 1 = 2 h 2 f k , k = 2 , ⋯ , n − 1 \left(2-h p_k\right) y_{k-1}+\left(2 h^2 q_k-4\right) y_k+\left(2+h p_k\right) y_{k+1}=2 h^2 f_k \, , \, k=2,\cdots,n-1
( 2 − h p k ) y k − 1 + ( 2 h 2 q k − 4 ) y k + ( 2 + h p k ) y k + 1 = 2 h 2 f k , k = 2 , ⋯ , n − 1
离散化后边界条件为
y 2 − y 1 = h α , y n − y n − 1 = h β y_2 - y_1 = h \alpha \, , \, y_n - y_{n-1} = h \beta
y 2 − y 1 = h α , y n − y n − 1 = h β
可得矩阵方程组
[ − 1 1 2 − h p 2 2 h 2 q 2 − 4 2 + h p 2 2 − h p 3 2 h 2 q 3 − 4 2 + h p 3 ⋱ ⋱ ⋱ 2 − h p n − 2 2 h 2 q n − 2 − 4 2 + h p n − 2 2 − h p n − 1 2 h 2 q n − 1 − 4 2 + h p n − 1 − 1 1 ] [ y 1 y 2 y 3 ⋮ y n − 2 y n − 1 y n ] = [ h α 2 h 2 f 1 2 h 2 f 2 ⋮ 2 h 2 f n − 2 2 h 2 f n − 1 h β ] \begin{bmatrix}
-1 & 1 & & & & \\
2-h p_2 & 2 h^2 q_2-4 & 2+h p_2 & & & \\
& 2-h p_3 & 2 h^2 q_3-4 & 2+h p_3 & & \\
& & \ddots & \ddots & \ddots & \\
& & 2-h p_{n-2} & 2 h^2 q_{n-2}-4 & 2+h p_{n-2} & \\
& & & 2-h p_{n-1} & 2 h^2 q_{n-1}-4 & 2+h p_{n-1} \\
& & & & -1 & 1
\end{bmatrix}\begin{bmatrix}
y_1 \\
y_2 \\
y_3 \\
\vdots \\
y_{n-2} \\
y_{n-1} \\
y_n
\end{bmatrix}=\begin{bmatrix}
h \alpha \\
2 h^2 f_1 \\
2 h^2 f_2 \\
\vdots \\
2 h^2 f_{n-2} \\
2 h^2 f_{n-1} \\
h \beta
\end{bmatrix}
⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ − 1 2 − h p 2 1 2 h 2 q 2 − 4 2 − h p 3 2 + h p 2 2 h 2 q 3 − 4 ⋱ 2 − h p n − 2 2 + h p 3 ⋱ 2 h 2 q n − 2 − 4 2 − h p n − 1 ⋱ 2 + h p n − 2 2 h 2 q n − 1 − 4 − 1 2 + h p n − 1 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ y 1 y 2 y 3 ⋮ y n − 2 y n − 1 y n ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ h α 2 h 2 f 1 2 h 2 f 2 ⋮ 2 h 2 f n − 2 2 h 2 f n − 1 h β ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
第三类边值条件
第三类边值条件(Robin condition)下的二阶非线性常微分方程可以写作
{ y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) α 1 y ( a ) + β 1 y ′ ( a ) = r 1 α 2 y ( b ) + β 2 y ′ ( b ) = r 2 \begin{cases}
y^{\prime\prime} + p(x) y^{\prime} + q(x) y = f(x) \\
\alpha_1 y(a) + \beta_1 y^\prime(a) = r_1 \\
\alpha_2 y(b) + \beta_2 y^\prime(b) = r_2
\end{cases}
⎩ ⎪ ⎪ ⎨ ⎪ ⎪ ⎧ y ′ ′ + p ( x ) y ′ + q ( x ) y = f ( x ) α 1 y ( a ) + β 1 y ′ ( a ) = r 1 α 2 y ( b ) + β 2 y ′ ( b ) = r 2
边界条件可差分为
α 1 y 1 + β 1 y 2 − y 1 h = r 1 , α 2 y n + β 2 y n − y n − 1 h = r 2 \alpha_1 y_1 + \beta_1 \frac{y_2 - y_1}{h} = r_1 \, , \,\alpha_2 y_n + \beta_2 \frac{y_n - y_{n-1}}{h} = r_2
α 1 y 1 + β 1 h y 2 − y 1 = r 1 , α 2 y n + β 2 h y n − y n − 1 = r 2
整理得到
{ ( α 1 h − β 1 ) y 1 + β 1 y 2 = r 1 h − β 2 y n − 1 + ( α 2 h + β 2 ) y n = r 2 h \begin{cases}
(\alpha_1 h - \beta_1) y_1 + \beta_1 y_2 = r_1 h \\
-\beta_2 y_{n-1} + (\alpha_2 h + \beta_2 ) y_n = r_2 h
\end{cases}
{ ( α 1 h − β 1 ) y 1 + β 1 y 2 = r 1 h − β 2 y n − 1 + ( α 2 h + β 2 ) y n = r 2 h
可得矩阵方程组
[ α 1 h − β 1 β 1 2 − h p 2 2 h 2 q 2 − 4 2 + h p 2 2 − h p 3 2 h 2 q 3 − 4 2 + h p 3 ⋱ ⋱ ⋱ 2 − h p n − 2 2 h 2 q n − 2 − 4 2 + h p n − 2 2 − h p n − 1 2 h 2 q n − 1 − 4 2 + h p n − 1 − β 2 α 2 h + β 2 ] [ y 1 y 2 y 3 ⋮ y n − 2 y n − 1 y n ] = [ r 1 h 2 h 2 f 1 2 h 2 f 2 ⋮ 2 h 2 f n − 2 2 h 2 f n − 1 r 2 h ] \begin{bmatrix}
\alpha_1 h - \beta_1 & \beta_1 & & & & \\
2-h p_2 & 2 h^2 q_2-4 & 2+h p_2 & & & \\
& 2-h p_3 & 2 h^2 q_3-4 & 2+h p_3 & & \\
& & \ddots & \ddots & \ddots & \\
& & 2-h p_{n-2} & 2 h^2 q_{n-2}-4 & 2+h p_{n-2} & \\
& & & 2-h p_{n-1} & 2 h^2 q_{n-1}-4 & 2+h p_{n-1} \\
& & & & -\beta_2 & \alpha_2 h + \beta_2
\end{bmatrix}\begin{bmatrix}
y_1 \\
y_2 \\
y_3 \\
\vdots \\
y_{n-2} \\
y_{n-1} \\
y_n
\end{bmatrix}=\begin{bmatrix}
r_1 h \\
2 h^2 f_1 \\
2 h^2 f_2 \\
\vdots \\
2 h^2 f_{n-2} \\
2 h^2 f_{n-1} \\
r_2 h
\end{bmatrix}
⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ α 1 h − β 1 2 − h p 2 β 1 2 h 2 q 2 − 4 2 − h p 3 2 + h p 2 2 h 2 q 3 − 4 ⋱ 2 − h p n − 2 2 + h p 3 ⋱ 2 h 2 q n − 2 − 4 2 − h p n − 1 ⋱ 2 + h p n − 2 2 h 2 q n − 1 − 4 − β 2 2 + h p n − 1 α 2 h + β 2 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ y 1 y 2 y 3 ⋮ y n − 2 y n − 1 y n ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ r 1 h 2 h 2 f 1 2 h 2 f 2 ⋮ 2 h 2 f n − 2 2 h 2 f n − 1 r 2 h ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
偏微分方程的边值问题
二阶椭圆型偏微分方程
二阶椭圆型PDE形如
− ( ∂ 2 ∂ x 2 + ∂ 2 ∂ y 2 ) ϕ = S ( x , y ) -\left(\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}\right) \phi=S(x, y)
− ( ∂ x 2 ∂ 2 + ∂ y 2 ∂ 2 ) ϕ = S ( x , y )
求解区域为长方形 0 ≤ x ≤ a , 0 ≤ y ≤ b 0 \le x \le a, 0\le y \le b 0 ≤ x ≤ a , 0 ≤ y ≤ b ,辅以边界条件
ϕ ( x , 0 ) = f 1 ( x ) ϕ ( x , b ) = f 2 ( x ) ϕ ( 0 , y ) = g 1 ( y ) ϕ ( a , y ) = g 2 ( y ) \begin{gathered}
\phi(x,0) = f_1(x) \quad \phi(x,b) = f_2(x) \\
\phi(0,y) = g_1(y) \quad \phi(a,y) = g_2(y)
\end{gathered}
ϕ ( x , 0 ) = f 1 ( x ) ϕ ( x , b ) = f 2 ( x ) ϕ ( 0 , y ) = g 1 ( y ) ϕ ( a , y ) = g 2 ( y )
为便于计算 x x x 和 y y y 方向应当选取相同差分步长 h h h ,这样二阶椭圆型PDE的差分形式可以写作
− ( ϕ i + 1 , j − 2 ϕ i , j + ϕ i − 1 , j h 2 + ϕ i , j + 1 − 2 ϕ i , j + ϕ i , j − 1 h 2 ) = S i j -\left(\frac{\phi_{i+1,j}-2\phi_{i,j}+\phi_{i-1,j}}{h^2} + \frac{\phi_{i,j+1}-2\phi_{i,j}+\phi_{i,j-1}}{h^2}\right) = S_{ij}
− ( h 2 ϕ i + 1 , j − 2 ϕ i , j + ϕ i − 1 , j + h 2 ϕ i , j + 1 − 2 ϕ i , j + ϕ i , j − 1 ) = S i j
ϕ i j = 1 4 ( ϕ i + 1 , j + ϕ i − 1 , j + ϕ i , j + 1 + ϕ i , j − 1 + h 2 S i j ) \phi_{ij} = \frac{1}{4} \left(\phi_{i+1,j}+\phi_{i-1,j}+\phi_{i,j+1}+\phi_{i,j-1}+h^2 S_{ij}\right)
ϕ i j = 4 1 ( ϕ i + 1 , j + ϕ i − 1 , j + ϕ i , j + 1 + ϕ i , j − 1 + h 2 S i j )
Jacobi迭代法
Jacobi迭代法的基本思路是:猜测一个初始解 ϕ 0 \phi^0 ϕ 0 ,第 n n n 次迭代解 ϕ i j n \phi_{ij}^n ϕ i j n 由前一次 ϕ i j n − 1 \phi_{ij}^{n-1} ϕ i j n − 1 迭代解代入PDE的差分方程计算得到,直到收敛为止,即前后两次迭代解的差别不大:∣ ϕ i j n − ϕ i j n − 1 ∣ < ε |\phi_{ij}^n - \phi_{ij}^{n-1}| < \varepsilon ∣ ϕ i j n − ϕ i j n − 1 ∣ < ε 。
ϕ i j n = 1 4 ( ϕ i + 1 , j n − 1 + ϕ i − 1 , j n − 1 + ϕ i , j + 1 n − 1 + ϕ i , j − 1 n − 1 + h 2 S i j ) \phi_{ij}^n = \frac{1}{4} \left(\phi_{i+1,j}^{n-1}+\phi_{i-1,j}^{n-1}+\phi_{i,j+1}^{n-1}+\phi_{i,j-1}^{n-1}+h^2 S_{ij}\right)
ϕ i j n = 4 1 ( ϕ i + 1 , j n − 1 + ϕ i − 1 , j n − 1 + ϕ i , j + 1 n − 1 + ϕ i , j − 1 n − 1 + h 2 S i j )
Gauss-Seidel迭代法
Gauss-Seidel迭代法在Jacobi迭代法的基础上,在计算第 n n n 次迭代解的 ( i , j ) (i,j) ( i , j ) 元时,将周围已经算出的 i − 1 i-1 i − 1 和 j − 1 j-1 j − 1 元,从使用第 n − 1 n-1 n − 1 次的结果替换为使用第 n n n 次的结果。
ϕ i j n = 1 4 ( ϕ i + 1 , j n − 1 + ϕ i − 1 , j n + ϕ i , j + 1 n − 1 + ϕ i , j − 1 n + h 2 S i j ) \phi_{ij}^n = \frac{1}{4} \left(\phi_{i+1,j}^{n-1}+\phi_{i-1,j}^{n}+\phi_{i,j+1}^{n-1}+\phi_{i,j-1}^{n}+h^2 S_{ij}\right)
ϕ i j n = 4 1 ( ϕ i + 1 , j n − 1 + ϕ i − 1 , j n + ϕ i , j + 1 n − 1 + ϕ i , j − 1 n + h 2 S i j )
松弛法
松弛法将第 n n n 次迭代解的值取为新值和旧值的线性组合,即
ϕ i j n = ω ϕ ~ i j n + ( 1 − ω ) ϕ i j n \phi_{ij}^n = \omega \tilde{\phi}_{ij}^n + (1-\omega) \phi_{ij}^n
ϕ i j n = ω ϕ ~ i j n + ( 1 − ω ) ϕ i j n
其中 ϕ ~ i j n = 1 4 ( ϕ i + 1 , j n − 1 + ϕ i − 1 , j n + ϕ i , j + 1 n − 1 + ϕ i , j − 1 n + h 2 S i j ) \tilde{\phi}_{ij}^n = \frac{1}{4} \left(\phi_{i+1,j}^{n-1}+\phi_{i-1,j}^{n}+\phi_{i,j+1}^{n-1}+\phi_{i,j-1}^{n}+h^2 S_{ij}\right) ϕ ~ i j n = 4 1 ( ϕ i + 1 , j n − 1 + ϕ i − 1 , j n + ϕ i , j + 1 n − 1 + ϕ i , j − 1 n + h 2 S i j ) 是本应当取的新值,ω \omega ω 是松弛因子 ,取值范围 0 < ω < 2 0<\omega<2 0 < ω < 2 。
当 0 < ω < 1 0<\omega<1 0 < ω < 1 时称为低松弛 ,新的迭代解中旧值占主导,收敛速度变慢,计算稳定;
当 1 < ω < 2 1<\omega<2 1 < ω < 2 时称为超松弛 ,新的迭代解中新值占主导,收敛速度变快,计算加速。
因此Gauss-Seidel迭代法结合松弛法的迭代公式为
ϕ i j n + 1 = ω 4 ( ϕ i + 1 , j n + ϕ i − 1 , j n + 1 + ϕ i , j + 1 n + ϕ i , j − 1 n + 1 + h 2 S i j ) + ( 1 − ω ) ϕ i j n \phi_{ij}^{n+1} = \frac{\omega}{4} \left(\phi_{i+1,j}^{n}+\phi_{i-1,j}^{n+1}+\phi_{i,j+1}^{n}+\phi_{i,j-1}^{n+1}+h^2 S_{ij}\right) +(1-\omega)\phi_{ij}^{n}
ϕ i j n + 1 = 4 ω ( ϕ i + 1 , j n + ϕ i − 1 , j n + 1 + ϕ i , j + 1 n + ϕ i , j − 1 n + 1 + h 2 S i j ) + ( 1 − ω ) ϕ i j n
二阶抛物型偏微分方程
抛物型PDE形如
∂ ϕ ∂ t = ∇ ⋅ ( D ∇ ϕ ) + S \frac{\partial \phi}{\partial t} = \nabla \cdot (D \nabla \phi) + S
∂ t ∂ ϕ = ∇ ⋅ ( D ∇ ϕ ) + S
对二阶抛物型PDE则有
∂ ϕ ∂ t = D ∂ 2 ϕ ∂ x 2 + S ( x , t ) \frac{\partial \phi}{\partial t} = D \frac{\partial^2 \phi}{\partial x^2} + S(x,t)
∂ t ∂ ϕ = D ∂ x 2 ∂ 2 ϕ + S ( x , t )
将空间 x x x 间隔 h h h 差分为 { x i } , i = 1 , 2 ⋯ , N \left\{x_i\right\} , i=1,2\cdots,N { x i } , i = 1 , 2 ⋯ , N ,x 1 x_1 x 1 为左端点,x N x_N x N 为右端点。
时间 t t t 间隔 Δ t \Delta t Δ t 差分为 { t j } , j = 1 , 2 ⋯ , M \left\{t_j\right\} , j=1,2\cdots,M { t j } , j = 1 , 2 ⋯ , M ,t 1 t_1 t 1 为起始时刻,t M t_M t M 为终止时刻。
显式差分法
显式差分法中,∂ 2 ϕ ∂ x 2 \frac{\partial^2 \phi}{\partial x^2} ∂ x 2 ∂ 2 ϕ 使用当前时刻 j j j 的解 ϕ j \phi^j ϕ j 进行差分,即
ϕ i j + 1 − ϕ i j Δ t = D ϕ i + 1 j − 2 ϕ i j + ϕ i − 1 j h 2 + S i j \frac{\phi_i^{j+1}-\phi_i^j}{\Delta t} = D \frac{\phi_{i+1}^j-2\phi_i^j+\phi_{i-1}^j}{h^2} + S_i^j
Δ t ϕ i j + 1 − ϕ i j = D h 2 ϕ i + 1 j − 2 ϕ i j + ϕ i − 1 j + S i j
ϕ i j + 1 = ϕ i j + D Δ t h 2 ( ϕ i + 1 j − 2 ϕ i j + ϕ i − 1 j ) + S i j Δ t \phi_i^{j+1} = \phi_i^j + \frac{D \Delta t}{h^2} \left(\phi_{i+1}^j-2\phi_i^j+\phi_{i-1}^j\right) + S_i^j \Delta t
ϕ i j + 1 = ϕ i j + h 2 D Δ t ( ϕ i + 1 j − 2 ϕ i j + ϕ i − 1 j ) + S i j Δ t
定义 r = D Δ t h 2 r = \frac{D \Delta t}{h^2} r = h 2 D Δ t ,由数值分析可得 r < 1 / 2 r<1/2 r < 1 / 2 时算法稳定。当我们选用更小的空间步长 h h h 时,迫使我们不得不取一个更小的时间步长 Δ t \Delta t Δ t ,这将付出很大的代价,特别是这个时间步长比恰当地描述系统演化所需要的自然时间尺度要小的多时。因此显式差分法需要改进。
隐式差分法
隐式差分法中,∂ 2 ϕ ∂ x 2 \frac{\partial^2 \phi}{\partial x^2} ∂ x 2 ∂ 2 ϕ 使用下一时刻 j + 1 j+1 j + 1 的解 ϕ j + 1 \phi^{j+1} ϕ j + 1 进行差分,即
ϕ i j + 1 − ϕ i j Δ t = D ϕ i + 1 j + 1 − 2 ϕ i j + 1 + ϕ i − 1 j + 1 h 2 + S i j \frac{\phi_i^{j+1}-\phi_i^j}{\Delta t} = D \frac{\phi_{i+1}^{j+1}-2\phi_i^{j+1}+\phi_{i-1}^{j+1}}{h^2} + S_i^j
Δ t ϕ i j + 1 − ϕ i j = D h 2 ϕ i + 1 j + 1 − 2 ϕ i j + 1 + ϕ i − 1 j + 1 + S i j
ϕ i j + 1 = ϕ i j + D Δ t h 2 ( ϕ i + 1 j + 1 − 2 ϕ i j + 1 + ϕ i − 1 j + 1 ) + S i j Δ t \phi_i^{j+1} = \phi_i^j + \frac{D \Delta t}{h^2} \left(\phi_{i+1}^{j+1}-2\phi_i^{j+1}+\phi_{i-1}^{j+1}\right) + S_i^j \Delta t
ϕ i j + 1 = ϕ i j + h 2 D Δ t ( ϕ i + 1 j + 1 − 2 ϕ i j + 1 + ϕ i − 1 j + 1 ) + S i j Δ t
这是一个关于 ϕ i j + 1 \phi^{j+1}_i ϕ i j + 1 的三对角方程。若定义 r = D Δ t h 2 r = \frac{D \Delta t}{h^2} r = h 2 D Δ t ,由数值分析可得隐式算法无条件稳定。方程可写为
− r ϕ i − 1 j + 1 + ( 1 + 2 r ) ϕ i j + 1 − r ϕ i + 1 j + 1 = ϕ i j + S i j Δ t ( i = 2 , 3 , ⋯ , N − 1 ) -r\phi_{i-1}^{j+1} + (1+2r)\phi_i^{j+1} -r\phi_{i+1}^{j+1}= \phi_i^j + S_i^j \Delta t \ (i=2,3,\cdots,N-1)
− r ϕ i − 1 j + 1 + ( 1 + 2 r ) ϕ i j + 1 − r ϕ i + 1 j + 1 = ϕ i j + S i j Δ t ( i = 2 , 3 , ⋯ , N − 1 )
对于左边界 ϕ 1 j \phi_1^j ϕ 1 j 和右边界 ϕ N j \phi_N^j ϕ N j ,它们由给定的边值条件决定,因此待求解的是一个 N − 2 N-2 N − 2 维的三对角方程
[ 1 + 2 r − r − r 1 + 2 r − r ⋱ ⋱ ⋱ − r 1 + 2 r − r − r 1 + 2 r ] [ ϕ 2 j + 1 ϕ 3 j + 1 ⋮ ϕ N − 2 j + 1 ϕ N − 1 j + 1 ] = [ ϕ 2 j + S 2 j Δ t + r ϕ 1 j + 1 ϕ 3 j + S 3 j Δ t ⋮ ϕ N − 2 j + S N − 2 j Δ t ϕ N − 1 j + S N − 1 j Δ t + r ϕ N j + 1 ] \begin{bmatrix}
1+2r & -r & & & \\
-r & 1+2r & -r & & \\
& \ddots & \ddots & \ddots & \\
& & -r & 1+2r & -r \\
& & & -r & 1+2r
\end{bmatrix}\begin{bmatrix}
\phi^{j+1}_2 \\
\phi^{j+1}_3 \\
\vdots \\
\phi^{j+1}_{N-2} \\
\phi^{j+1}_{N-1}
\end{bmatrix}=\begin{bmatrix}
\phi^j_2 + S_2^j\Delta t + r \phi^{j+1}_1\\
\phi^j_3 + S_3^j \Delta t\\
\vdots \\
\phi^j_{N-2} + S_{N-2}^j \Delta t \\
\phi^j_{N-1} + S_{N-1}^j \Delta t + r\phi^{j+1}_N
\end{bmatrix}
⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 1 + 2 r − r − r 1 + 2 r ⋱ − r ⋱ − r ⋱ 1 + 2 r − r − r 1 + 2 r ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ ϕ 2 j + 1 ϕ 3 j + 1 ⋮ ϕ N − 2 j + 1 ϕ N − 1 j + 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ ϕ 2 j + S 2 j Δ t + r ϕ 1 j + 1 ϕ 3 j + S 3 j Δ t ⋮ ϕ N − 2 j + S N − 2 j Δ t ϕ N − 1 j + S N − 1 j Δ t + r ϕ N j + 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
Crank-Nicolson算法
Crank-Nicolson算法又称为平均隐式差分法,∂ 2 ϕ ∂ x 2 \frac{\partial^2 \phi}{\partial x^2} ∂ x 2 ∂ 2 ϕ 使用当前时刻 j j j 的解 ϕ j \phi^j ϕ j 和下一时刻 j + 1 j+1 j + 1 的解 ϕ j + 1 \phi^{j+1} ϕ j + 1 之平均进行差分
ϕ i j + 1 − ϕ i j Δ t = D 2 ( ϕ i + 1 j − 2 ϕ i j + ϕ i − 1 j h 2 + ϕ i + 1 j + 1 − 2 ϕ i j + 1 + ϕ i − 1 j + 1 h 2 ) + S i j \frac{\phi_i^{j+1}-\phi_i^j}{\Delta t} = \frac{D}{2} \left(\frac{\phi_{i+1}^j-2\phi_i^j+\phi_{i-1}^j}{h^2} + \frac{\phi_{i+1}^{j+1}-2\phi_i^{j+1}+\phi_{i-1}^{j+1}}{h^2} \right)+ S_i^j
Δ t ϕ i j + 1 − ϕ i j = 2 D ( h 2 ϕ i + 1 j − 2 ϕ i j + ϕ i − 1 j + h 2 ϕ i + 1 j + 1 − 2 ϕ i j + 1 + ϕ i − 1 j + 1 ) + S i j
− D Δ t 2 h 2 ϕ i − 1 j + 1 + ( 1 + D Δ t h 2 ) ϕ i j + 1 − D Δ t 2 h 2 ϕ i + 1 j + 1 = D Δ t 2 h 2 ϕ i + 1 j + ( 1 − D Δ t h 2 ) ϕ i j + D Δ t 2 h 2 ϕ i − 1 j + S i j Δ t -\frac{D \Delta t}{2h^2} \phi_{i-1}^{j+1}+\left( 1+\frac{D \Delta t}{h^2} \right) \phi_{i}^{j+1} - \frac{D \Delta t}{2h^2}\phi_{i+1}^{j+1} = \frac{D \Delta t}{2h^2} \phi_{i+1}^{j}+\left( 1-\frac{D \Delta t}{h^2} \right) \phi_{i}^{j} + \frac{D \Delta t}{2h^2}\phi_{i-1}^{j} + S_i^j \Delta t
− 2 h 2 D Δ t ϕ i − 1 j + 1 + ( 1 + h 2 D Δ t ) ϕ i j + 1 − 2 h 2 D Δ t ϕ i + 1 j + 1 = 2 h 2 D Δ t ϕ i + 1 j + ( 1 − h 2 D Δ t ) ϕ i j + 2 h 2 D Δ t ϕ i − 1 j + S i j Δ t
若仍定义 r = D Δ t h 2 r = \frac{D \Delta t}{h^2} r = h 2 D Δ t ,由数值分析可得隐式算法无条件稳定。方程可写为
− r 2 ϕ i − 1 j + 1 + ( 1 + r ) ϕ i j + 1 − r 2 ϕ i + 1 j + 1 = r 2 ϕ i + 1 j + ( 1 − r ) ϕ i j + r 2 ϕ i − 1 j + S i j Δ t -\frac{r}{2} \phi_{i-1}^{j+1}+(1+r) \phi_{i}^{j+1} - \frac{r}{2}\phi_{i+1}^{j+1} = \frac{r}{2} \phi_{i+1}^{j}+(1-r)\phi_{i}^{j} + \frac{r}{2}\phi_{i-1}^{j} + S_i^j \Delta t
− 2 r ϕ i − 1 j + 1 + ( 1 + r ) ϕ i j + 1 − 2 r ϕ i + 1 j + 1 = 2 r ϕ i + 1 j + ( 1 − r ) ϕ i j + 2 r ϕ i − 1 j + S i j Δ t
对于左边界 ϕ 1 j \phi_1^j ϕ 1 j 和右边界 ϕ N j \phi_N^j ϕ N j ,它们由给定的边值条件决定,因此待求解的是一个 N − 2 N-2 N − 2 维的三对角方程
[ 1 + r − r / 2 − r / 2 1 + r − r / 2 ⋱ ⋱ ⋱ − r / 2 1 + r − r / 2 − r / 2 1 + r ] [ ϕ 2 j + 1 ϕ 3 j + 1 ⋮ ϕ N − 2 j + 1 ϕ N − 1 j + 1 ] = [ r 2 ϕ 3 j + ( 1 − r ) ϕ 2 j + r 2 ϕ 1 j + S 2 j Δ t + r 2 ϕ 1 j + 1 r 2 ϕ 4 j + ( 1 − r ) ϕ 3 j + r 2 ϕ 2 j + S 3 j Δ t ⋮ r 2 ϕ N − 1 j + ( 1 − r ) ϕ N − 2 j + r 2 ϕ N − 3 j + S N − 2 j Δ t r 2 ϕ N j + ( 1 − r ) ϕ N − 1 j + r 2 ϕ N − 2 j + S N − 1 j Δ t + r 2 ϕ N j + 1 ] \begin{bmatrix}
1+r & -r/2 & & & \\
-r/2 & 1+r & -r/2 & & \\
& \ddots & \ddots & \ddots & \\
& & -r/2 & 1+r & -r/2 \\
& & & -r/2 & 1+r
\end{bmatrix}\begin{bmatrix}
\phi^{j+1}_2 \\
\phi^{j+1}_3 \\
\vdots \\
\phi^{j+1}_{N-2} \\
\phi^{j+1}_{N-1}
\end{bmatrix}=\begin{bmatrix}
\frac{r}{2}\phi^j_3 + (1-r)\phi^j_2+ \frac{r}{2}\phi^j_1+ S_2^j\Delta t + \frac{r}{2} \phi^{j+1}_1\\
\frac{r}{2}\phi^j_4 + (1-r)\phi^j_3+ \frac{r}{2}\phi^j_2 + S_3^j \Delta t\\
\vdots \\
\frac{r}{2}\phi^j_{N-1} + (1-r)\phi^j_{N-2}+ \frac{r}{2}\phi^j_{N-3} + S_{N-2}^j \Delta t \\
\frac{r}{2}\phi^j_{N} + (1-r)\phi^j_{N-1}+ \frac{r}{2}\phi^j_{N-2} + S_{N-1}^j \Delta t + \frac{r}{2} \phi^{j+1}_{N}
\end{bmatrix}
⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 1 + r − r / 2 − r / 2 1 + r ⋱ − r / 2 ⋱ − r / 2 ⋱ 1 + r − r / 2 − r / 2 1 + r ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ ϕ 2 j + 1 ϕ 3 j + 1 ⋮ ϕ N − 2 j + 1 ϕ N − 1 j + 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 2 r ϕ 3 j + ( 1 − r ) ϕ 2 j + 2 r ϕ 1 j + S 2 j Δ t + 2 r ϕ 1 j + 1 2 r ϕ 4 j + ( 1 − r ) ϕ 3 j + 2 r ϕ 2 j + S 3 j Δ t ⋮ 2 r ϕ N − 1 j + ( 1 − r ) ϕ N − 2 j + 2 r ϕ N − 3 j + S N − 2 j Δ t 2 r ϕ N j + ( 1 − r ) ϕ N − 1 j + 2 r ϕ N − 2 j + S N − 1 j Δ t + 2 r ϕ N j + 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
二阶双曲型偏微分方程
二阶双曲型PDE形如
∂ u 2 ∂ t 2 − a 2 ∂ 2 u ∂ x 2 = S ( x , t ) \frac{\partial u^2}{\partial t^2} - a^2 \frac{\partial^2 u}{\partial x^2} = S(x,t)
∂ t 2 ∂ u 2 − a 2 ∂ x 2 ∂ 2 u = S ( x , t )
求解区域为 a ≤ x ≤ b a \le x \le b a ≤ x ≤ b ,辅以边界条件
u ∣ t = 0 = φ ( x ) ∂ u ∂ t ∣ t = 0 = ψ ( x ) u ( a , t ) = f ( t ) u ( b , t ) = g ( t ) \begin{gathered}
u|_{t=0} = \varphi(x) \quad \frac{\partial u}{\partial t}\bigg|_{t=0} = \psi(x) \\
u(a,t) = f(t) \quad u(b,t) = g(t)
\end{gathered}
u ∣ t = 0 = φ ( x ) ∂ t ∂ u ∣ ∣ ∣ ∣ ∣ t = 0 = ψ ( x ) u ( a , t ) = f ( t ) u ( b , t ) = g ( t )
隐式差分法
隐式差分法中,∂ 2 u ∂ x 2 \frac{\partial^2 u}{\partial x^2} ∂ x 2 ∂ 2 u 使用下一时刻 j + 1 j+1 j + 1 的解 u j + 1 u^{j+1} u j + 1 进行差分,即
u i j + 1 − 2 u i j + u i j − 1 ( Δ t ) 2 − a 2 u i + 1 j + 1 − 2 u i j + 1 + u i − 1 j + 1 h 2 = S i j \frac{u_i^{j+1}-2u_i^j+u_i^{j-1}}{(\Delta t)^2} - a^2 \frac{u_{i+1}^{j+1}-2u_i^{j+1}+u_{i-1}^{j+1}}{h^2} = S_i^j
( Δ t ) 2 u i j + 1 − 2 u i j + u i j − 1 − a 2 h 2 u i + 1 j + 1 − 2 u i j + 1 + u i − 1 j + 1 = S i j
若仍定义 r = a 2 ( Δ t ) 2 h 2 r = \frac{a^2 (\Delta t)^2}{h^2} r = h 2 a 2 ( Δ t ) 2 ,由数值分析可得隐式算法无条件稳定。方程可写为
− r u i − 1 j + 1 + ( 1 + 2 r ) u i j + 1 − r u i + 1 j + 1 = 2 u i j − u i j − 1 + S i j ( Δ t ) 2 -ru_{i-1}^{j+1} + (1+2r)u_i^{j+1} -ru_{i+1}^{j+1}= 2u_i^j - u_i^{j-1}+ S_i^j (\Delta t)^2
− r u i − 1 j + 1 + ( 1 + 2 r ) u i j + 1 − r u i + 1 j + 1 = 2 u i j − u i j − 1 + S i j ( Δ t ) 2
对于左边界 u 1 j u_1^j u 1 j 和右边界 u N j u_N^j u N j ,它们由给定的边值条件决定,因此待求解的是一个 N − 2 N-2 N − 2 维的三对角方程
[ 1 + 2 r − r − r 1 + 2 r − r ⋱ ⋱ ⋱ − r 1 + 2 r − r − r 1 + 2 r ] [ u 2 j + 1 u 3 j + 1 ⋮ u N − 2 j + 1 u N − 1 j + 1 ] = [ 2 u 2 j − u 2 j − 1 + S 2 j ( Δ t ) 2 + r u 1 j + 1 2 u 3 j − u 3 j − 1 + S 3 j ( Δ t ) 2 ⋮ 2 u N − 2 j − u N − 2 j − 1 + S N − 2 j ( Δ t ) 2 2 u N − 1 j − u N − 1 j − 1 + S N − 1 j ( Δ t ) 2 + r u N j + 1 ] \begin{bmatrix}
1+2r & -r & & & \\
-r & 1+2r & -r & & \\
& \ddots & \ddots & \ddots & \\
& & -r & 1+2r & -r \\
& & & -r & 1+2r
\end{bmatrix}\begin{bmatrix}
u^{j+1}_2 \\
u^{j+1}_3 \\
\vdots \\
u^{j+1}_{N-2} \\
u^{j+1}_{N-1}
\end{bmatrix}=\begin{bmatrix}
2u^j_2 -u_2^{j-1}+ S_2^j(\Delta t)^2 + r u^{j+1}_1\\
2u^j_3 -u_3^{j-1}+ S_3^j(\Delta t)^2 \\
\vdots \\
2u^j_{N-2} -u_{N-2}^{j-1}+ S_{N-2}^j(\Delta t)^2 \\
2u^j_{N-1} -u_{N-1}^{j-1}+ S_{N-1}^j(\Delta t)^2 + ru^{j+1}_N
\end{bmatrix}
⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 1 + 2 r − r − r 1 + 2 r ⋱ − r ⋱ − r ⋱ 1 + 2 r − r − r 1 + 2 r ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ u 2 j + 1 u 3 j + 1 ⋮ u N − 2 j + 1 u N − 1 j + 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 2 u 2 j − u 2 j − 1 + S 2 j ( Δ t ) 2 + r u 1 j + 1 2 u 3 j − u 3 j − 1 + S 3 j ( Δ t ) 2 ⋮ 2 u N − 2 j − u N − 2 j − 1 + S N − 2 j ( Δ t ) 2 2 u N − 1 j − u N − 1 j − 1 + S N − 1 j ( Δ t ) 2 + r u N j + 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤