与上一篇中实例相比,改进欧拉法多了一步修正过程,正是应为有了该一步修正过程使得数值解法具有更高一级精度。 先看下面两幅图,第一幅是没有改进的欧拉法,第二幅是改进的欧拉法 两者相比误差有很大的提高。 下式即为改进欧拉法的修正公式,即梯形公式, 其中右边项中的i+1使用的时传统欧拉法的预估值。对当前值进行进一步修正。 代码如下:
%微分方程数值解法----欧拉法测试 %------------------------------------- clc; clear all; close all; %------------------------------------- %du/dt + u^2 = 0 %u(0)=1 %------------------------------------- N = 100; t_s = 0; t_e = 1; dt = (t_e-t_s)/N; t = t_s:dt:t_e-dt; M=2; %------------------------------------- %解析解 u_j=1./(1+t); u_s(1) = 1; for i=2:N if M==1 u_s(i)=-u_s(i-1)^2*dt+u_s(i-1); elseif M==2 u_s(i)=-u_s(i-1)^2*dt+u_s(i-1);%预测 u_s(i)=u_s(i-1)+(-u_s(i)^2-u_s(i-1)^2)*dt/2; end end subplot(2,1,1); plot(t,u_j,'-o',t,u_s,'-*'); xlabel('t'); ylabel('y'); legend('解析解','数值解'); subplot(2,1,2); plot(t,u_j-u_s,'-r'); xlabel('t'); ylabel('err'); legend('误差');运行结果如下: