matlab 四阶龙格-库塔法求微分方程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab 实现四阶龙格-库塔发求解微分方程
从理论上讲,只要函数在某区间上充分光滑,那么它可以展开为泰勒级数,因此在该区间上的函数值可用各阶导数值近似地表示出来,反之其各阶导数值也可用某些函数值的线性组合近似地表示出来。龙格-库塔法就是将待求函数)(t y 展开为泰勒级数,并用方程函数),(y f t 近似其各阶导数,从而迭代得到)(t y 的数值解。具体来说,四阶龙格-库塔迭代公式为
)22(6
143211k k k k h n n ++++=+y y ),(1n n t k y f =
)2/,2/(12hk h t k n n ++=y f
)2/,2/(23hk h t k n n ++=y f
),(33hk h t k n n ++=y f
实验内容:
已知二阶系统21x x
= ,u x x x 5.02.04.0212+--= ,0)0()0(21==x x ,u 为单位阶跃信号。用四阶龙格-库塔法求数值解。分析步长对结果的影响。
实验总结:
实验报告要求简要的说明实验原理;简明扼要地总结实验内容;编制m 文件,并给出运行结果。报告格式请按实验报告模板编写。
进入matlab ,
Step1:choose way1 or way2
way1):
可以选择直接加载M 文件(函数M 文件)。
way2):
点击new ——function ,先将shier (函数1文本文件)复制运行;
点击new ——function ,再将RK (函数2文本文件)运行;
点击new ——function ,再将finiRK (函数3文本文件)运行;
Step2:
回到command页面输入下面四句。
[t,k]=finiRK45([0;0],150);%迭代150次,步长=20/150
[t1 k1]=ode45(@shier,[0 -10],[0 0]);%调用matlab自带四阶龙格-库塔,对比结果[t2 k2]=ode45(@shier,[0 10],[0 0]);
plot(t,k(1,:),'-',t1,k1(:,1),'*',t2,k2(:,1),'^')%在图形上表示出来
补充:改变步长影响数据的准确性。
函数1 shier:
function dx =shier(t,x)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
dx=zeros(2,1);
dx(1)=x(2);
dx(2)=-0.4*x(1)-0.2*x(2)+0.5*0.5*(sign(t)-sign(-t));
end
函数2 RK45:
function [t,y]=RK45(f,b,ch0,N)%f为函数句柄,b为上限(为了方便fniRK45这%里默认下限为0),ch0为初值,N为迭代次数。
h=b/N;%计算步长
y=zeros(2,N);%开辟y,k的向量空间确定维数
t=zeros(1,N);
t(1)=0;
y(:,1)=ch0;%赋迭代初值
for j=1:N %循环迭代过程
t(j+1)=t(j)+h ;
k1=f(t(j),y(:,j));
k2=f(t(j)+h/2,y(:,j)+h*k1/2);
k3=f(t(j)+h/2,y(:,j)+h*k2/2);
k4=f(t(j)+h/2,y(:,j)+h*k3/2);
y(:,j+1)=y(:,j)+h*(k1+2*k2+2*k3+k4)/6;
end
end
函数3 finiRK45:
function [x1, y1 ] =finiRK45(fch0,N1)%fch为迭代初值,N1为迭代次数[t11,y11]=RK45(@shier,-10,fch0,N1/2);%求在【-10,10】的解
[t12,y12]=RK45(@shier,10,fch0,N1/2);
t11=fliplr(t11);%左右转换如:a1=[1 2 3]执行后a1=[3 2 1]
y11=fliplr(y11);
x1=[t11 t12];%将所有的解和成最终的解向量
y1=[y11 y12];
end
%步长=(10+10)/N1