中点法求解高阶线性微分方程(Solving higher order linear differential equations by midpoint method)

该博客通过Matlab程序详细展示了如何运用改进欧拉法解决二阶微分方程的数值解,并探讨了时间步长对解的绝对误差的影响。博主首先定义计算步长和初始值,然后编写自定义函数实现改进欧拉法,最后绘制曲线展示解的结果。接着,博主计算不同时间步长下的误差,分析了误差与时间步长的关系,以log-log图直观呈现误差随步长变化的规律。
摘要由CSDN通过智能技术生成

欧拉法(Euler)和改进欧拉法是求解线性微分方程初值问题常用的数值解法,对于一般方程可以手算出来,但是对于比较复杂的手算是算不出来,本文以二阶方程为例编写matlab程序实现高阶微分方程的数值解法。并且估计了绝对误差与时间步长h之间的关系。

%% 定义计算步长,设置变量的初始值
clear;clc;close all
Delta=0.001;% 定义步长
t=0:Delta:1;% 定义自变量t
n=length(t);
Y(:,1)=[1;0] % 定义x y的初始值
%% 自定义改进欧拉法,求解微分方程组
for k=1:n-1
    F1=f(t(k),Y(:,k));
    F2=f(t(k+1),Y(:,k)+Delta*f(t(k),Y(:,k)));
    Y(:,k+1)=Y(:,k)+Delta*(F1+F2)/2;
end
x=Y(1,:);
y=Y(2,:);
%% 绘制x y的求解结果
figure
set(gcf,'units','normalized','position',[0.15 0.2 0.7 0.6]); %设置figure窗口的位置和尺寸
subplot(1,2,1)
plot(t,x,'b')
xlabel('t')
ylabel('x')

subplot(1,2,2)
plot(t,y,'r')
xlabel('t')
ylabel('y')

求解误差随时间步长的变化

%% 求误差值
clear;
clc;
err1=0;
err2=0;
j=1;
for h=0.001:0.001:0.1
    N=1/h;
    y(:,1)=[1
            0];
    a=[0  , 1
       -1 , -1];
  for i = 1:N
    t=i*h;
    b1=[0
        sin(t)];
    b2=[0
        sin(t+h/2)];
    f1=y(:,i)+1/2*h*(a*y(:,i)+b1); 
    y(:,i+1) = y(:,i) + h*(a*f1+b2);
    err1=err1+h^3/12*abs(y(1,i)+cos(t)-sin(t));
    err2=err2+h^3/12*abs(y(2,i)-sin(t)-cos(t));
  end
    err(j)=sqrt(err1^2+err2^2);
    h1(j)=h;
    j=j+1;
end
 %% 绘制误差图
figure
set(gcf,'units','normalized','position',[0.15 0.2 0.7 0.6]); %设置figure窗口的位置和尺寸
subplot(1,2,1)
plot(h1,err,'b')
xlabel('h1')
ylabel('err')

subplot(1,2,2)
plot(log(h1),log(err),'r')
xlabel('log(h1)')
ylabel('log(err)')

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值