简单的数值方法

本文列举了简单的数值方法:Euler 方法、后退 Euler 方法、梯形公式、改进 Euler 方法,并用 MATLAB 求解线性 ODE,最后展示了输出结果。

常微分方程初值问题

考虑常微分方程初值问题,设

{dudt=f(t,u),0<tTu(0)=0

f(t,u) .在区域G:0tT,|u|<上连续,求u=u(t):满足:

{dudt=f(t,u),0<tT u(0)=0

通常 f 满足 Lipschitz 条件:|f(t,u1)f(t,u2)|L|u1u2|

线性 ODE 例子

$$\left{dudt=t2+tu,t[0,1] u(0)=0\right.$$

方程的真解:u(x)=et+t2t+1

Euler 方法

un+1=un+hf(tn,un)

Euler 方法数值求解

MATLAB 程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
% Euler1.m
% Euler method for the ODE model
% u'(x)=x^2+x-u, x in [0,1]
% Initial condition: u(0)=0 ;
% Exact solution: u(x)=-exp(-x)+x^2-x+1.
clear all; clf
h=0.1;
x=0:h:1; % function interval
N=length(x)-1;
u(1)=0; % initial value
fun=@(t,u) t.^2+t-u; % RHS
for n=1:N
u(n+1)=u(n)+h.*fun(x(n),u(n));
end
ue=-exp(-x)+x.^2-x+1; % exact solution
plot(x,ue,'b-',x,u,'r+','LineWidth',1)
legend('Exact ','Numerical','location','North')
set(gca,'fontsize',12)
xlabel('x','fontsize', 16), ylabel('u','fontsize',16,'Rotation',0)

% print -dpng -r600 Euler1.png
输出结果
Euler1.png

后退 Euler 方法

un+1=un+hf(tn+1,un+1).

梯形公式

un+1=un+h2[f(tn,un)+f(tn+1,un+1)].

梯形公式数值求解

梯形公式与后退 Euler 方法类似,这里考虑梯形公式,对于线性 ODE 例子:

un+1=un+h2[tn2+tnun+tn+12+tn+1un+1]

可得

un+1=2h2+hun+h2+h[tn2+tn+tn+12+tn+1]

MATLAB 程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% Trapezoidal.m
% Trapezoidal rule for the ODE model
% u'(x)=x^2+x-u, x in [0,1]
% Initial condition: u(0)=0 ;
% Exact solution: u(x)=-exp(-x)+x^2-x+1.
clear all; clf
h=0.1;
x=0:h:1; % function interval
N=length(x)-1;
u(1)=0; % initial value
for n=1:N
u(n+1)=(2-h)/(2+h).*u(n)+h/(2+h).*(x(n)^2+x(n)+x(n+1)^2+x(n+1));
end
ue=-exp(-x)+x.^2-x+1; % exact solution
plot(x,ue,'b-',x,u,'r+','LineWidth',1)
legend('Exact ','Numerical','location','North')
set(gca,'fontsize',12)
xlabel('x','fontsize', 16), ylabel('u','fontsize',16,'Rotation',0)

% print -dpng -r600 Trapezoidal.png
输出结果
Trapezoidal.png

改进的 Euler 方法

预估校正
{y¯n+1=yn+hf(xn,yn)yn+1=yn+h2[f(xn,yn)+f(xn+1,y¯n+1)]
MATLAB 程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% EulerPro.m
% Modified Euler method for the ODE model
% u'(x)=x^2+x-u, x in [0,1]
% Initial condition: u(0)=0 ;
% Exact solution: u(x)=-exp(-x)+x^2-x+1.
clear all; clf
h=0.1;
x=0:h:1; % function interval
N=length(x)-1;
u(1)=0; % initial value
fun=@(x,u) x.^2+x-u; % RHS
for n=1:N
k1=fun(x(n),u(n));
k2=fun(x(n+1),u(n)+h*k1);
u(n+1)=u(n)+(h/2)*(k1+k2);
end
ue=-exp(-x)+x.^2-x+1; % exact solution
plot(x,ue,'b-',x,u,'r+','LineWidth',1)
legend('Exact','Numerical','location','North')
set(gca,'fontsize',12)
xlabel('x','fontsize', 16), ylabel('u','fontsize',16,'Rotation',0)

% print -dpng -r600 EulerPro.png
输出结果

EulerPro.png

参考书籍

  • 数值分析 第 5 版 (李庆扬等)

  • MATLAB 微分方程高效解法

  • 微分方程数值解法(第四版)李荣华