一阶常微分方程欧拉法
考虑如下微分方程在[0, T]区间上的数值解:
在[0, T]上取N个小区间,每个小区间长度为,共N+1个点,则
由泰勒展开:
即:
例题
clear
T = 2; N = 10000; dt = T/N;
t = 0:dt:T;
y0 = 1;
y = zeros(1, length(t));
y(1) = y0;
for n = 1:length(t)-1
y(n+1) = y(n) + y(n)*dt;
end
plot(t, y, t, exp(t))
legend('数值解','解析解')
二阶常微分方程欧拉法
考虑如下常微分方程:
令:
例1谐振子
clear
k = 1; m=2;
T = 20; N = 10000; dt = T/N;
t = 0:dt:T;
y0 = 1; y1 = zeros(1, length(t)); y1(1) = y0;
v0 = 1; y2 = zeros(1, length(t)); y2(1) = v0;
for n = 1:length(t)-1
y1(n+1) = y1(n) + y2(n)*dt;
y2(n+1) = y2(n) + (-k/m*y1(n))*dt;
end
figure(1)
plot(t, y1, t, y2)
figure(2)
plot(y1, y2)
误差分析
回顾一下泰勒展开公式:
这里有两个思想:
- 将泰勒展开公式看做是关于
的无穷高阶多项式,利用多项式的形式和y(t)处的信息预测
处的值。
- 在第一个思想下,
越小,多项式阶数越高,则误差越小,其与
成正比。
对于欧拉法
误差为,而在代码中步长的选取是非常小的。
在使用简单欧拉法进行数值积分时,误差是会累积的,设一次计算的误差为,若在[0 1]区间上进行计算,则计算次数为
,二者相乘,最终误差为步长。