Matlab作业龙格库塔欧拉方法解二阶微分方程ppt

合集下载

matlab龙格库塔方法求解二元二阶常微分方程组

matlab龙格库塔方法求解二元二阶常微分方程组

matlab龙格库塔方法求解二元二阶常微分方程组文章标题:深入探讨matlab中的龙格库塔方法及其在求解二元二阶常微分方程组中的应用摘要:在科学与工程领域,常常需要求解复杂的微分方程组,而matlab作为一种强大的数学工具,提供了许多求解微分方程组的方法。

本文将深入探讨matlab中的龙格库塔方法及其在求解二元二阶常微分方程组中的应用,以便读者全面理解该方法并能灵活应用于实际问题中。

正文:一、介绍龙格库塔方法龙格-库塔法(Runge-Kutta methods)是一种数值求解常微分方程的方法,通过将微分方程的解进行离散化,将微分方程转化为差分方程,从而进行数值求解。

龙格库塔方法通过迭代计算,能够得到微分方程的数值解,广泛应用于科学计算和工程技术领域。

二、matlab中的龙格库塔方法在matlab中,龙格库塔方法通过ode45函数实现,该函数能够对一阶或高阶常微分方程进行数值求解。

用户可以通过设定初始条件、微分方程表达式,以及积分区间等参数,快速得到微分方程的数值解。

ode45函数采用自适应步长的方式进行求解,能够有效解决微分方程解的数值稳定性和精确度问题。

三、龙格库塔方法在求解二元二阶常微分方程组中的应用考虑如下形式的二元二阶常微分方程组:$$\begin{cases}y_1' = f_1(t, y_1, y_2) \\y_2' = f_2(t, y_1, y_2)\end{cases}$$其中,$y_1(t)$和$y_2(t)$是未知函数,$f_1(t, y_1, y_2)$和$f_2(t,y_1, y_2)$分别表示其对应的函数表达式。

通过matlab中的ode45函数,可以将该二元二阶常微分方程组转化为一阶常微分方程组的形式,然后利用龙格库塔方法进行数值求解。

设定初始条件$y_1(0) = y1_0, y_2(0) = y2_0$,对应的一阶方程组为:$$\begin{cases}u_1' = u_3 \\u_2' = u_4 \\u_3' = f_1(t, u_1, u_2) \\u_4' = f_2(t, u_1, u_2)\end{cases}$$其中,$u_1(t) = y_1(t), u_2(t) = y_2(t), u_3(t) = y_1'(t), u_4(t) =y_2'(t)$,通过ode45函数求解该一阶常微分方程组即可得到原二元二阶常微分方程组的数值解。

龙格库塔求解二阶常微分方程

龙格库塔求解二阶常微分方程

龙格库塔求解二阶常微分方程一、前言在数学领域中,常微分方程是一种非常重要的数学工具。

它可以用来描述许多自然现象,如物理学、化学、生物学等。

而龙格库塔法是一种求解常微分方程的方法之一。

本文将介绍如何使用龙格库塔法求解二阶常微分方程。

二、什么是二阶常微分方程二阶常微分方程是指形如y''+p(t)y'+q(t)y=f(t)的方程,其中y表示未知函数,p(t)、q(t)和f(t)都是已知函数。

通常情况下,我们需要找到一个特定的y函数来满足这个方程。

三、什么是龙格库塔法龙格库塔法是一种数值求解常微分方程的方法。

它基于欧拉方法,但更准确和稳定。

欧拉方法使用线性逼近来估计未知函数值,而龙格库塔法使用高阶多项式逼近来更准确地估计未知函数值。

四、龙格库塔法的基本思想1. 将时间区间[0,T]平均分成N个小区间;2. 在每个小区间内进行递推计算,直到得到所有时间点上的y值;3. 每次递推计算都使用龙格库塔公式来估算y的值。

五、龙格库塔法的公式对于二阶常微分方程y''+p(t)y'+q(t)y=f(t),我们可以使用以下公式来递推计算:1. k1=h*y'(t)l1=h*f(t)-p(t)*k1/2-q(t)*y(t);2. k2=h*(y'(t)+l1/2)l2=h*f(t+h/2)-p(t+h/2)*k2/2-q(t+h/2)*(y(t)+k1/2);3. k3=h*(y'(t)+l2/2)l3=h*f(t+h/2)-p(t+h/2)*k3/2-q(t+h/2)*(y(t)+k2/2);4. k4=h*(y'(t)+l3)l4=h*f(t+h)-p(t+h)*k4-q(t+h)*(y(t)+k3);其中,h表示时间步长,t表示当前时间点,f表示已知函数,p和q都是已知常数。

通过这些公式,我们可以得到下一个时间点上的y值。

六、龙格库塔法的实现为了更好地理解龙格库塔法,我们可以看一下具体的实现过程。

计算方法 常微分方程初值问题数值解法Euler公式龙格库塔法 ppt课件

计算方法 常微分方程初值问题数值解法Euler公式龙格库塔法 ppt课件

(b)-(a),得
y(i x 1)yi1
h2
y(ξ)
2!
定义9.2 若数值方法的局部截断误差为O(hp1) , 则称这种数值方法的精度阶数是P。
评论: • 步长(h<1) 越小,P越高,则局部截断误差
越小。计算精度越高。
欧拉公式的精度讨论 欧拉公式的局部截断误差为 :
y(xi+1 ) – yi+1 = O(h2) 欧拉方法仅为一阶方法。
点可表示为
x i x 0 ih i , 1… ,,2 n,
数值解法需要把连续性的问题加以离散化,从 而求出离散节点的数值解。
a=x0 x1 x2 x3 x4 xn-1 xn=b
• 常微分方程数值解法的基本出发点:离散化。 采用“步进式”,即求解过程顺着节点排列的 次序逐步向前推进。
• 算法:要求给出用已知信息
直线 P1P 2 方程为: y y 1 f1 ( ,y 1 x )( x x 1 ) 当 x x2时,得
y 2 y 1 f1 ( ,y 1 x )2 ( x x 1 )
由此获得了P2的坐标。
重复以上过程, 对已求得点 Pi(xi,yi),以 y(ix )f(i,x yi)
为(近似)斜率作直线
• 如果老师最后没有总结一节课的重点的难点,你 是否会认为老师的教学方法需要改进?
• 你所经历的课堂,是讲座式还是讨论式? • 教师的教鞭
• “不怕太阳晒,也不怕那风雨狂,只怕先生骂我 笨,没有学问无颜见爹娘 ……”
• “太阳当空照,花儿对我笑,小鸟说早早早……”
常微分方程初值问题 解的存在性定理
的解y=y(x)代表通过点 ( x0, y0)的一条称之为微分方
程的积分曲线。

matlab-欧拉方法和龙格库塔方法的小实例

matlab-欧拉方法和龙格库塔方法的小实例

题一:a)y’=y+2x , 欧拉方法:112()2n n h y y k k +=++,12n n k y x =+,2112()n n k y hk x +=++; 龙格-库塔方法:11234(22)6n n h y y k k k k +=++++,12n n k y x =+,12222n n k h k y h x ⎛⎫=+++ ⎪⎝⎭,23222n n k h k y h x ⎛⎫=+++ ⎪⎝⎭,432()n n k y hk x h =+++ 精确解:y=3e x -2x-2。

以步长h=0.1 在0<=x<=1内的计算结果如下所示:0.1000 1.1150 1.1155 1.11550.2000 1.2631 1.2642 1.26420.3000 1.4477 1.4496 1.44960.4000 1.6727 1.6755 1.67550.5000 1.9423 1.9462 1.94620.6000 2.2613 2.2664 2.26640.7000 2.6347 2.6413 2.64130.8000 3.0684 3.0766 3.07660.9000 3.5685 3.5788 3.57881.0000 4.1422 4.1548 4.1548b)文案 编辑词条B 添加义项 ?文案,原指放书的桌子,后来指在桌子上写字的人。

现在指的是公司或企业中从事文字工作的职位,就是以文字来表现已经制定的创意策略。

文案它不同于设计师用画面或其他手段的表现手法,它是一个与广告创意先后相继的表现的过程、发展的过程、深化的过程,多存在于广告公司,企业宣传,新闻策划等。

基本信息中文名称文案外文名称Copy目录1发展历程2主要工作3分类构成4基本要求5工作范围6文案写法7实际应用折叠编辑本段发展历程汉字"文案"(wén àn)是指古代官衙中掌管档案、负责起草文书的幕友,亦指官署中的公文、书信等;在现代,文案的称呼主要用在商业领域,其意义与中国古代所说的文案是有区别的。

数值分析Matlab作业龙格库塔欧拉方法解二阶微分方程

数值分析Matlab作业龙格库塔欧拉方法解二阶微分方程

数值分析Matlab作业龙格库塔欧拉方法解二阶微分方程Matlab 应用使用Euler 和Rungkutta 方法解臂状摆的能量方程背景单摆是常见的物理模型,为了得到摆角θ的关于时间的函数,来描述单摆运动。

由角动量定理我们知道εJ M =化简得到 0sin 22=+θθlg dt d 在一般的应用和计算中,只考虑摆角在5度以内的小摆动,因为可以吧简化为θ,这样比较容易解。

实际上这是一个解二阶常微分方程的问题。

在这里的单摆是一种特别的单摆,具有均匀的质量M 分布在长为2的臂状摆上,使用能量法建立方程 WT = h mg ?=2J 21ω 化简得到θθcos35499.722=dtd 重力加速度取9.806651使用欧拉法令dxdy z =,这样降阶就把二阶常微分方程转化为一阶微分方程组,再利用向前Euler 方法数值求解。

y(i+1)=y(i)+h*z(i);z(i+1)=z(i)+h*7.35499*cos(y(i));y(0)=0z(0)=0精度随着h 的减小而更高,因为向前欧拉方法的整体截断误差与h 同阶,(因为是用了泰勒公式)所以欧拉方法的稳定区域并不大。

2.RK4-四阶龙格库塔方法使用四级四阶经典显式Rungkutta 公式稳定性很好,RK4法是四阶方法,每步的误差是h5阶,而总积累误差为h4阶。

所以比欧拉稳定。

运行第三个程序:在一幅图中显示欧拉法和RK4法,随着截断误差的积累,欧拉法产生了较大的误差h=0.01h=0.0001,仍然是开始较为稳定,逐渐误差变大总结:RK4是很好的方法,很稳定,而且四阶是很常用的方法,因为到五阶的时候精度并没有相应提升。

通过这两种方法计算出角度峰值y=3.141593,周期是1.777510。

三个程序欧拉法clear;clch=0.00001;a=0;b=25;x=a:h:b;y(1)=0;z(1)=0;for i=1:length(x)-1 % 欧拉y(i+1)=y(i)+h*z(i);z(i+1)=z(i)+h*7.35499*cos(y(i));endplot(x,y,'r*');xlabel('时间');ylabel('角度');A=[x,y];%y(find(y==max(y)))%Num=(find(y==max(y)))[y,T]=max(y);fprintf('角度峰值等于%d',y) %角度的峰值也就是πfprintf('\n')fprintf('周期等于%d',T*h) %周期legend('欧拉');龙格库塔方法先定义函数rightf_sys1.mfunction w=rightf_sys1(x,y,z)w=7.35499*cos(y);clear;clc;%set(0,'RecursionLimit',500)h=0.01;a=0;b=25;x=a:h:b;RK_y(1)=0; %初值RK_z(1)=0; %初值for i=1:length(x)-1K1=RK_z(i);L1=rightf_sys1(x(i),RK_y(i),RK_z(i)); % K1 and L1 K2=RK_z(i)+0.5*h*L1;L2=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K1,RK_z(i)+0.5*h*L1 );K3=RK_z(i)+0.5*h*L2;L3=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K2,RK_z(i)+0.5*h*L2 );K4=RK_z(i)+h*L3;L4=rightf_sys1(x(i)+h,RK_y(i)+h*K3,RK_z(i)+h*L3); % K4 and L4RK_y(i+1)=RK_y(i)+1/6*h*(K1+2*K2+2*K3+K4);RK_z(i+1)=RK_z(i)+1/6*h*(L1+2*L2+2*L3+L4);endplot(x,RK_y,'b+');xlabel('Variable x');ylabel('Variable y');A=[x,RK_y];[y,T]=max(RK_y);legend('RK4方法');fprintf('角度峰值等于%d',y) %角度的峰值也就是πfprintf('\n')fprintf('周期等于%d',T*h) %周期两个方法在一起对比使用跟上一个相同的函数rightf_sys1.mclear;clc; %清屏h=0.0001;a=0;b=25;x=a:h:b;Euler_y(1)=0;Euler_z(1)=0; %欧拉的初值RK_y(1)=0;RK_z(1)=0; %龙格库塔初值for i=1:length(x)-1%先是欧拉法Euler_y(i+1)=Euler_y(i)+h*Euler_z(i);Euler_z(i+1)=Euler_z(i)+h*7.35499*cos(Euler_y(i));%龙格库塔K1=RK_z(i); L1=rightf_sys1(x(i),RK_y(i),RK_z(i)); % K1 and L1 K2=RK_z(i)+0.5*h*L1;L2=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K1,RK_z(i)+0.5*h*L1);% K2 and L2K3=RK_z(i)+0.5*h*L2;L3=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K2,RK_z(i)+0.5*h*L2 );% K3 and L3K4=RK_z(i)+h*L3;L4=rightf_sys1(x(i)+h,RK_y(i)+h*K3,RK_z(i)+h*L3); % K4 and L4RK_y(i+1)=RK_y(i)+1/6*h*(K1+2*K2+2*K3+K4);RK_z(i+1)=RK_z(i)+1/6*h*(L1+2*L2+2*L3+L4);endplot(x,Euler_y,'r-',x,RK_y,'b-');[y,T]=max(RK_y);fprintf('角度峰值等于%d',y) %角度的峰值也就是πfpri ntf('\n') fprintf('周期等于%d',T*h) %周期xlabel('时间');ylabel('角度');legend('欧拉','RK4');。

欧拉法 二阶 四阶龙格库塔法

欧拉法  二阶 四阶龙格库塔法

高树磊 2010010909题2--3%欧拉法0.1步长下输出响应曲线和真实响应曲线的比较subplot(221)x=1;%步长为0.1y=x;h=0.1;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'r')hold onx=1;y=x;h=0.1;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'*g')title('欧拉法0.1步长下输出响应曲线和真实响应曲线的比较'); xlabel('t/time');ylabel('y/gain');legend('Euler 0.1步长''真实输出');%欧拉法0.05步长下输出响应曲线和真实响应曲线的比较subplot(222)x=1;%步长为0.05y=x;h=0.05;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'k')hold onx=1;y=x;h=0.1;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'*y')title('欧拉法0.05步长下输出响应曲线和真实响应曲线的比较'); xlabel('t/time');ylabel('y/gain');legend('Euler 0.05步长','真实输出');%欧拉法0.5步长下输出响应曲线和真实响应曲线的比较subplot(223)x=1;%步长为0.5y=x;h=0.5;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'b')hold onx=1;y=x;h=0.1;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'*r')title('欧拉法0.5步长下输出响应曲线和真实响应曲线的比较'); xlabel('t/time');ylabel('y/gain');legend('Euler 0.5步长','真实输出');%欧拉法不同步长下输出响应曲线和真实响应曲线的比较subplot(224)x=1;%步长为0.1y=x;h=0.1;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'k')hold onx=1;%步长为0.05y=x;h=0.05;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'y')hold onx=1;%步长为0.5y=x;h=0.5;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'b')hold onx=1;y=x;h=0.1;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'*r')title('欧拉法不同步长下输出响应曲线和真实响应曲线的比较');xlabel('t/time');ylabel('y/gain');legend('Euler 0.1步长','Euler 0.05步长','Euler 0.5步长','真实输出');欧拉法、二阶龙库、四阶龙库比较h=0.5%欧拉法求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(221)x=1;y=x;h=0.5;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'c')hold onx=1;y=x;h=0.5;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'m')title('欧拉法求出的输出响应曲线和真实的输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('Euler','真实输出');%二阶龙格库塔法求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(222)x=1;y=x;h=0.5;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1);x=x+h*(k1+k2)/2;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'b')hold onx=1;y=x;h=0.5;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'g')title('二阶龙格库塔法求出的输出响应曲线和真实输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('RK2','真实输出');%四阶龙格库塔法求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(223)x=1;y=x;h=0.5;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1/2);k3=-(x+h*k2/2);k4=-(x+h*k3);x=x+h*(k1+k2*2+k3*2+k4)/6;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'*g')hold onx=1;y=x;h=0.5;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'r')title('四阶龙格库塔法求出的的输出响应曲线和真实输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('RK4','真实输出');%欧拉法、二阶龙格库塔法和四阶龙格库塔法分别求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(224)x=1;y=x;h=0.5;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'k')hold onx=1;y=x;h=0.5;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1);x=x+h*(k1+k2)/2;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'b')hold onx=1;y=x;h=0.5;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1/2);k3=-(x+h*k2/2);k4=-(x+h*k3);x=x+h*(k1+k2*2+k3*2+k4)/6;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'g')hold onx=1;y=x;h=0.5;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'k')title('Euler、RK2、RK4下输出响应曲线和真实输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('Euler','RK2','RK4','真实输出');h=0.1%欧拉法求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(221)x=1;y=x;h=0.1;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'c')hold onx=1;y=x;h=0.1;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'m')title('欧拉法求出的输出响应曲线和真实的输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('Euler','真实输出');%二阶龙格库塔法求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(222)x=1;y=x;h=0.1;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1);x=x+h*(k1+k2)/2;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'b')hold onx=1;y=x;h=0.1;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'g')title('二阶龙格库塔法求出的输出响应曲线和真实输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('RK2','真实输出');%四阶龙格库塔法求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(223)x=1;y=x;h=0.1;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1/2);k3=-(x+h*k2/2);k4=-(x+h*k3);x=x+h*(k1+k2*2+k3*2+k4)/6;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'*g')hold onx=1;y=x;h=0.1;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'r')title('四阶龙格库塔法求出的的输出响应曲线和真实输出响应曲线之间的比较');xlabel('t/time');ylabel('y/gain');legend('RK4','真实输出');%欧拉法、二阶龙格库塔法和四阶龙格库塔法分别求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(224)x=1;y=x;h=0.1;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'k')hold onx=1;y=x;h=0.1;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1);x=x+h*(k1+k2)/2;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'b')hold onx=1;y=x;h=0.1;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1/2);k3=-(x+h*k2/2);k4=-(x+h*k3);x=x+h*(k1+k2*2+k3*2+k4)/6;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'g')hold onx=1;y=x;h=0.1;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'k')title('Euler、RK2、RK4下输出响应曲线和真实输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('Euler','RK2','RK4','真实输出');h=0.05%欧拉法求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(221)x=1;y=x;h=0.05;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'c')hold onx=1;y=x;h=0.05;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'m')title('欧拉法求出的输出响应曲线和真实的输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('Euler','真实输出');%二阶龙格库塔法求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(222)x=1;y=x;h=0.05;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1);x=x+h*(k1+k2)/2;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'b')hold onx=1;y=x;h=0.05;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'g')title('二阶龙格库塔法求出的输出响应曲线和真实输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('RK2','真实输出');%四阶龙格库塔法求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(223)x=1;y=x;h=0.05;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1/2);k3=-(x+h*k2/2);k4=-(x+h*k3);x=x+h*(k1+k2*2+k3*2+k4)/6;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'*g')hold onx=1;y=x;h=0.05;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'r')title('四阶龙格库塔法求出的的输出响应曲线和真实输出响应曲线之间的比较');xlabel('t/time');ylabel('y/gain');legend('RK4','真实输出');%欧拉法、二阶龙格库塔法和四阶龙格库塔法分别求出的输出响应曲线和真实的输出响应曲线之间的比较subplot(224)x=1;y=x;h=0.05;N=round(1/h);%取整t=0;T=0;for i=1:Nk=-x;x=x+h*k;y=[y,x];T=[T,t+h];%画图的时候都保存了初始值t=t+h;endplot(T,y,'k')hold onx=1;y=x;h=0.05;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1);x=x+h*(k1+k2)/2;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'b')hold onx=1;y=x;h=0.05;N=round(1/h);%取整t=0;T=0;for i=1:Nk1=-x;k2=-(x+h*k1/2);k3=-(x+h*k2/2);k4=-(x+h*k3);x=x+h*(k1+k2*2+k3*2+k4)/6;y=[y,x];T=[T,t+h];t=t+h;endplot(T,y,'g')hold onx=1;y=x;h=0.05;N=round(1/h);t=h;T=0;for i=1:Nx=exp(-t);y=[y,x];T=[T,t];t=t+h;endplot(T,y,'k')title('Euler、RK2、RK4下输出响应曲线和真实输出响应曲线之间的比较'); xlabel('t/time');ylabel('y/gain');legend('Euler','RK2','RK4','真实输出');。

matlab ppt_13_龙格-库塔法

matlab ppt_13_龙格-库塔法

这就是改进的欧拉公式,通常写成 h y = y + ( K1 + K2 ) i i+1 2 K1 = f ( x i , y i ) K2 = f (xi + h, yi + hK1) 由此可见,为了提高精度,可以多取几点的斜率值作加权平均当作平均斜 率kave,这就是龙格库塔法基本思想. 一般的显式龙格库塔方法可以写成
2. 二阶龙格――库塔法
在改进的欧拉公式中将xi+1替换为区间中的任意一点 xi+p = xi + ph (0 < p ≤ 1)
将它的斜率记为K2。利用欧拉公式得y (xi+p)的预报值 y i+p = yi + phK1 求得 K2 = f (xi+p, y i+p) 平均斜率则取 Keve ≈ λ1K1 + λ2K2 其中λ1, λ2是待定的系数。
(h)
y (xi+1) − yi+1 由此可得下列事后估计式
2 y (xi+1) − yi+1 ≈
(h)

1 16
(h)
1 (h (h) 2) (yi+1 − yi+1) 15
这样,可以通过检查步长折半前后两次计算结果的偏差 ∆=
(h 2) |yi+1
− yi+1|
(j )
来判断所选取的步长是否合适。具体可分以下两种情况: 1. 对于给定的精度 ,如果∆ > ,就反复将步长折半计算,直至∆ < 为 (h 2) 止,这时取步长折半后的“新值”yi+1 作为结果。 2. 如果∆ < ,就反复将步长加倍,直至∆ > 为止,这时取步长加倍前 的“旧值”作为结果。 这种通过步长折半或加倍的计算的方法就叫变步长方法。表面上看,为了 选择步长,每一步的计算量似乎增加了,但从总体上考虑往往是合算的。

龙格库塔方法ppt课件

龙格库塔方法ppt课件

z(i1,1)=x;z(i1,2)=k1;z(i1,3)=k2;z(i1,4)=k3;z(i1,5)=k4;z(
i1,6)=y;
i1=i1+1;
end
11
end
例题4
例4 求(3阶、4阶R ห้องสมุดไป่ตู้公式)解初值问题(步长h 0.1)

y


y
2x y
y(0) 1
(0 x 1)
将步长折半,即取
h 2
为步长从xn跨两步到xn+1,求得一个近似值yn( h21)
每跨一步截断误差是C
(
h 2
)5
,
有y(xn+1
)-y(
h 2
)
n1

2C(
h )5 2
16
步长折半后,误差大约减少为原来的 1 ,即有 16
(h)
y( xn1) y( xn1)
y2 n1
y(h) n1
误差 0.45e-4 0.17e-4 0.15e-4 0.48e-4 0.25e-4 0.55e-4 0.14e-4 0.21e-4 0.54e-4 0.06e-4
y(xn) 1.0954 1.1832 1.2649 1.3416 1.4142 1.4832 1.5492 1.6125 1.6733 1.7321
y=y0;z=zeros(c,6);
%z生成c行,6列的零矩阵存放结果;
%每行存放c次迭代结果,每列分别存放
k1~k4及y的结果
10
不断迭代运算: for x=a:h:b
if i1<=c k1=feval(yy,x,y); k2=feval(yy,x+h/2,y+(h*k1)/2); k3=feval(yy,x+h/2,y+(h*k2)/2); k4=feval(yy,x+h,y+h*k3); y=y+(h/6)*(k1+2*k2+2*k3+k4);

龙格-库塔法MATLAB

龙格-库塔法MATLAB

1. matlab 新建.m文件,编写龙格-库塔法求解函数function [x,y]=runge_kutta1(ufunc,y0,h,a,b)%参数表顺序依次是微分方程组的函数名称,初始值向量,步长,时间起点,时间终点(参数形式参考了ode45函数)n=floor((b-a)/h); %求步数x(1)=a;%时间起点y(:,1)=y0;%赋初值,可以是向量,但是要注意维数for ii=1:nx(ii+1)=x(ii)+h;k1=ufunc(x(ii),y(:,ii));k2=ufunc(x(ii)+h/2,y(:,ii)+h*k1/2);k3=ufunc(x(ii)+h/2,y(:,ii)+h*k2/2);k4=ufunc(x(ii)+h,y(:,ii)+h*k3);y(:,ii+1)=y(:,ii)+h*(k1+2*k2+2*k3+k4)/6;%按照龙格库塔方法进行数值求解end2.另外再新建一个.,m文件,定义要求解的常微分方程函数function dx=fun1(t,x)dx =zeros(2,1);%初始化列向量dx(1) =0.08574*x(2)-1.8874*x(1)-20.17;dx(2) =1.8874*x(1)-0.08574*x(2)+115.16;3,再新建一个.m文件,利用龙格-库塔方法求解常微分方程[T1,F1]=runge_kutta1(@fun1,[46.30 1296 ],1,0,20); %求解步骤2定义的fun1常微分方程,@fun1是调用其函数指针,从0到20,间隔为1subplot(122)plot(T1,F1)%自编的龙格库塔函数效果title('自编的龙格库塔函数')grid运行步骤3文件即可得到结果,F1为估测值或者可以调用matlab自带函数ode45求解方法如下:[T,F] = ode45(@fun1,0:1:20,[17.64 37800 ]); subplot(121)plot(T,F)%Matlab自带的ode45函数效果title('ode45函数效果')grid。

二维动力学微分方程迭代解法matlab龙格库塔

二维动力学微分方程迭代解法matlab龙格库塔

1. 二维动力学微分方程的重要性二维动力学微分方程是描述动力学系统中两个变量之间相互作用的数学模型。

这些方程在物理学、工程学、生物学等领域有着广泛的应用。

解决这些方程对于深入理解动力学系统的行为以及预测其未来的状态具有至关重要的意义。

2. 迭代解法的基本原理迭代解法是一种通过不断逼近真实解的方法,其基本原理是从一个初始猜测值开始,通过不断的重复计算来逼近真实解。

这种方法在解决复杂的微分方程时具有很高的实用性和灵活性。

3. MATLAB在迭代解法中的应用MATLAB是一种强大的数学计算软件,它提供了丰富的工具和函数来解决各种数学问题。

在迭代解法中,MATLAB提供了龙格-库塔(Runge-Kutta)方法来解决微分方程,可以高效地求解二维动力学微分方程。

4. 龙格-库塔方法的特点龙格-库塔方法是一种经典的迭代解法算法,它通过多步迭代来逼近微分方程的真实解。

这种方法在数值计算领域被广泛应用,其精度和稳定性都很高,并且适用于各种复杂的微分方程。

5. 在MATLAB中使用龙格-库塔方法解决二维动力学微分方程的步骤a. 定义微分方程的函数表达式b. 设置初始条件c. 调用MATLAB的龙格-库塔函数进行迭代计算d. 获取最终的解并进行结果分析6. 实例分析为了更好地理解在MATLAB中使用龙格-库塔方法解决二维动力学微分方程的过程,我们以一个具体的实例来进行分析。

7. 结论通过使用MATLAB中的龙格-库塔方法,我们可以高效地解决各种复杂的二维动力学微分方程,得到准确的数值解,从而更好地理解动力学系统的行为。

这为动力学系统的建模和分析提供了重要的工具和方法。

8. 实例分析假设我们有一个二维动力学系统,其微分方程表示为:\[ \begin{cases} \frac{dx}{dt} = y \\ \frac{dy}{dt} = -x - 0.5y\end{cases} \]我们希望使用MATLAB的龙格-库塔方法来求解该微分方程,并分析系统的行为。

二阶龙格库塔公式推导_二阶龙格库塔公式.ppt

二阶龙格库塔公式推导_二阶龙格库塔公式.ppt

⼆阶龙格库塔公式推导_⼆阶龙格库塔公式.ppt⼆阶龙格库塔公式第⼀节 常微分⽅程 第⼆节 欧拉⽅法 第三节 龙格—库塔法 在上⼀节中,我们得到了⼀些求微分⽅程近似解的数值⽅法,这些⽅法的局部截断误差较⼤,精度较低,我们希望得到有更⾼阶精度的⽅法。

⼀阶龙格—库塔⽅法 如果以y(x)在xi处的斜率作为y(x)在 [xi,xi+1]上的平均斜率k*,即 ⼆阶龙格—库塔⽅法 在[xi,xi+1]上取两点xi,xi+p(0< p≤1)的斜率值k1,k2的线性组合λ1k1+λ2k2作为k*的近似值(λ1、λ2为待定常数),此公式⼀般形式可写成 这就是⼆阶龙格—库塔法公式。

三阶龙格—库塔公式 为了提⾼精度,考虑在[xi,xi+1]上取三点xi,xi+p,xi+q的斜率值分别为k1,k2,k3,将k1,k2,k3的线性组合作为平均斜率k*的近似值,其中 k* 这就是欧拉法. 则得 其中k1 = f (xi,yi),k2为[xi,xi+1]内任意⼀点xi+p = xi+ ph (0< p≤1) 的斜率f (xi+p,y(xi+p))。

由于y (xi+p)并没有给出,所以先应该求y(xi+p),仿照改进欧拉公式的构造思想,得到 (8-7) 这样构造出的公式为 k1 k2 k* 公式中含有三个参数λ1,λ2和p,如果我们适当选取参数的值,可以使公式的局部截断误差为O(h3)。

对k1和k2作泰勒展开 代⼊(8-7)得 (*) ⼜ y (x)在xi处的⼆阶泰勒展开式为 当x = xi+1时, ,有 (**) (**) ⽐较(*)与(**)的系数即可发现, 要使公式(7-7)的局部截断误差满⾜ ,即要求公式具有⼆阶 精度只要下列条件成⽴即可。

(8-8)满⾜条件(8-8)的⼀簇公式统称为 ⼆阶龙格—库塔公式。

特别的,当 塔公式就成为改进欧拉公式。

时,龙格-库 改进欧拉公式就是以y(x)在xi和xi+1 处的斜率k1和k2的算术平均 值作为y(x)在[xi,xi+1]上的 平均斜率k*来进⾏计算的。

《欧拉方程解法》课件

《欧拉方程解法》课件
01
龙格-库塔方法是另一种常用的数值求解常微分方程的方法,其基本思想是利用 已知的初值和导数值来逼近微分方程的解。
02
龙格-库塔方法的基本步骤是:首先选择一个初始点和初始导数值,然后利用微 分方程、初始条件和初始导数值来计算下一个点和导数值,以此类推,得到一 系列的点和导数值,这些点和导数值就构成了微分方程的近似解。
收敛性分析
随着网格密度的增加,数值解应逐渐接近真实解。
全局误差估计
误差传播
在数值求解过程中,误差会随着 时间和空间的离散化而传播和累 积。全局误差估计需要考虑误差 传播的影响。
收敛速度
全局误差估计还涉及数值解的收 敛速度。理论上,随着时间和空 间的离散化,数值解应逐渐接近 真实解。
误差界
全局误差估计的一个重要目标是 确定数值解的上界和下界,以便 评估其精度和可靠性。
03
欧拉方程的数值解法
欧拉方法
欧拉方法是一种简单的数值求解常微分方程的方法,其基 本思想是利用已知的初值来逼近微分方程的解。
欧拉方法的基本步骤是:首先选择一个初始点,然后利用 微分方程和初始条件来计算下一个点,以此类推,得到一 系列的点,这些点就构成了微分方程的近似解。
欧拉方法的优点是简单易懂,易于实现,但其缺点误差较小,且适用于复杂和非线性的微分方 程,但其缺点是计算量较大,需要更多的计算资源和时间。
04
欧拉方程的稳定性分析
线性稳定性分析
01 线性稳定性分析是研究欧拉方程解的稳定性的基 础方法。
02 通过线性化欧拉方程,可以得到其线性化方程, 进而分析其解的稳定性。
边界问题是指给定微分方 程和某些边界条件,求解 该微分方程的解。
03 方法
使用积分变换、分离变量

欧拉法、梯形法和龙格_库塔解微分方程

欧拉法、梯形法和龙格_库塔解微分方程

欧拉法、梯形法和龙格-库塔一、解方程:= 8x(2-y)y(0)=1二、算出方程的解析解为:y= 2 -三、实验原理:1.欧拉法原理:将区间[a,b]分成n段.那么方程在第x i点有y'(x i) = f(x i,y(x i)).再用向前差商近似代替导数则为:.在这里.h是步长.即相邻两个结点间的距离。

因此可以根据xi点和yi点的数值计算出y i+1来:.i=0,1,2,n这就是欧拉格式.若初值y i+ 1是已知的.则可依据上式逐步算出数值解y1,y2……..yn2.梯形法原理:将向前欧拉公式中的导数f(xi,yi)改为微元两端f(xi,yi)和f(xi+1,yi+1)的平均.即梯形公式。

3.龙格-库塔方法的基本思想:在区间[xn,xn+1]内多取几个点.将他们的斜率加权平均.作为导数的近似。

令初值问题表述如下。

则.对于该问题的RK4由如下方程给出:其中这样.下一个值(y n+1)由现在的值(y n)加上时间间隔(h)和一个估算的斜率的乘积决定。

该斜率是以下斜率的加权平均:k1是时间段开始时的斜率;k2是时间段中点的斜率.通过欧拉法采用斜率k1来决定y在点tn + h/2的值;k3也是中点的斜率.但是这次采用斜率k2决定y值;k4是时间段终点的斜率.其y值用k3决定。

当四个斜率取平均时.中点的斜率有更大的权值:RK4法是四阶方法.也就是说每步的误差是h5阶.而总积累误差为h4阶。

四、欧拉法、梯形法和龙格-库塔的实现代码:h=0.1;x=0:h:1;y1=zeros(size(x));y1(1)=1;y2=zeros(size(x));y2(1)=1;y3=zeros(size(x));y3(1)=1;for i1=2:length(x)y1(i1) = y1(i1-1) + h*8*x(i1-1)*(2-y1(i1-1));%欧拉法 m1= 8*x(i1-1)*(2-y2(i1-1));%梯形法m2 =8*x(i1)*(2-y2(i1-1)+h*m1);y2(i1)=y2(i1-1)+h*(m1+m2)/2;%梯形法公式k1=8*x(i1-1)*(2-y2(i1-1)); %龙格-库塔k2=8*(x(i1-1)+h/2)*(2-(y2(i1-1)+h*k1/2));k3=8*(x(i1-1)+h/2)*(2-(y2(i1-1)+h*k2/2));k4=8*(x(i1-1)+h)*(2-(y2(i1-1)+h*k3));y3(i1)=y3(i1-1)+(k1+2*k2+2*k3+k4)*h/6; %龙格-库塔公式endy4=2-exp(-4*(x.^2));%解析解plot(x,y1,x,y2,x,y3,x,y4)%解析解与数值解图像legend('y1','y2','y3','y4')plot(x,y4-y1,x,y4-y2,x,y4-y3)% 解析解与数值解误差图像legend('y4-y1','y4-y2','y4-y3')五、图像:1.解析解y4与各个数值解y1,y2,y3的图像:(1)当步长h=0.1时:(2)当步长h=0.05时:(3)当步长h=0.01时:结论:三个图中.方程的解析解都是y4。

《微分方程的数值解法maab四阶龙格—库塔法》PPT模板课件

《微分方程的数值解法maab四阶龙格—库塔法》PPT模板课件

k1 f (tn , yn )
k2
f (tn
1 2
h,
yn
h 2 k1)
k3
f (tn
1 2
h,
yn
h 2
k2
)
k 4 f (tn h , y n hk 3 )
四 阶 Runge-Kutta 法计算流程图
开始
h 初始条件:t
迭代次数:
;y
0
N
0
积分步长:
tn t0
for i = 1 : N
解析解: x x x1 3 2(((ttt))) 0 .0 8 1 1 2 P 8 k 0siw n t) (2 .6 3 0 3 3 P k 0siw n t) (0 .2 12 2 2 P k 0siw n t)(
第一个质量的位移响应时程
各种solver 解算指令的特点
解法指令 解题类 型
特点
ode45 非刚性 采用4、5阶Runge-Kutta法
适合场合 大多数场合的首选算法
ode23 非刚性 采用Adams算法
较低精度(10-3)场合
ode113 非刚性
ode23t ode15s
适度刚 性
刚性
ode23s 刚性 ode23tb 刚性
y2
(0)
(2.2) (2.3)
例:著名的Van der Pol方程
y (y21)y y0

y1y,y2y
Y
y y
1 2
降为一阶 Yyy12(y12y12)y2y1
初始条件
Y0
y1(0) y2(0)
y10 y20
3. 根据式(2.2)编写计算导数的M函数文件ODE文件

matlab龙格库塔法解微分方程组

matlab龙格库塔法解微分方程组

matlab龙格库塔法解微分方程组
一、引言
龙格库塔法是数值计算中常用的一种求解微分方程的方法,其具有较高的精度和稳定性。

在MATLAB中,可以使用ode45函数来实现龙格库塔法求解微分方程组。

二、龙格库塔法简介
龙格库塔法是一种常用的数值积分方法,也可用于求解微分方程。

该方法将微分方程转化为一个初值问题,并采用逐步逼近的方式计算出数值解。

三、使用ode45函数求解微分方程组
在MATLAB中,可以使用ode45函数来求解微分方程组。

该函数使用了龙格库塔法进行数值计算,并提供了较高的精度和稳定性。

四、MATLAB代码实现
以下是一个使用ode45函数求解微分方程组的示例代码:
function dydt = myfun(t,y)
dydt = zeros(2,1);
dydt(1) = y(2);
dydt(2) = -sin(y(1));
end
[t,y] = ode45(@myfun,[0 10],[0;1]);
plot(t,y(:,1),'-o',t,y(:,2),'-o')
xlabel('Time')
ylabel('Solution')
legend('y_1','y_2')
五、总结
龙格库塔法是一种常用的数值计算方法,可以用于求解微分方程。

在MATLAB中,可以使用ode45函数来实现龙格库塔法求解微分方程组。

通过以上示例代码,我们可以看到MATLAB提供了较为简单的方式来实现龙格库塔法求解微分方程组,并且具有较高的精度和稳定性。

matlab_常微分方程数值解法【爆款】.ppt

matlab_常微分方程数值解法【爆款】.ppt

dx
f (x,
y)
y(x0 ) y0
节点: x0 , x1, , xi , , xn , 步长: h xi1 xi
积分法求欧拉公式时,矩形法采用前一点函数值求积,
若利用后一点,即为向后的欧拉方法。
.精品课件.
21

y
x
dy f (x, y)dx
y0
x0
x
y(x) y0
f (x, y)dx
x0
y0 f y(x0 ), x0 h
.精品课件.
16
同样,在[x0,x2] ,积分采用矩形近似,得:
y(x2 ) y0
x2 f y(x), x dx
x0
y0
x1 f y(x), x dx
x0
x2 f y(x), x dx
x1
y(x1) f y(x1), x1 h
非刚性 多步法;Adams算法;高低精 计算时间比 ode45 短 度均可到 10-3~10-6
适度刚性 采用梯形算法
适度刚性情形
ode15s
刚性 多步法;Gear’s 反向数值微分;若 ode45 失效时,可尝
精度中等
试使用
ode23s
ode23tb
刚性 刚性
单步法;2 阶Rosebrock 算法;当精度较低时,计算时
.精品课件.
29
3 改进的欧拉方法 取两点斜率平均值,即:
yn1
yn
h 2
k1
k2
k1 f (xn , yn )
k2 f (xn1, yn1)
整体截断误差: O(h2)
.精品课件.
30
欧拉方法(前、后)和改进的欧拉方法优点是算法简 单,但计算精度较低,不能满足实际问题求解对精度的要 求,所以使用较少。

数值分析Matlab作业龙格库塔欧拉方法解二阶微分方程

数值分析Matlab作业龙格库塔欧拉方法解二阶微分方程

Matlab 应用使用Euler 和Rungkutta 方法解臂状摆的能量方程背景 单摆是常见的物理模型,为了得到摆角θ的关于时间的函数,来描述单摆运动。

由角动量定理我们知道εJ M =化简得到0sin 22=+θθl g dt d 在一般的应用和计算中,只考虑摆角在5度以内的小摆动,因为可以吧简化为,这样比较容易解。

实际上这是一个解二阶常微分方程的问题。

θ在这里的单摆是一种特别的单摆,具有均匀的质量M 分布在长为2的臂状摆上,使用能量法建立方程W T =h mg ∆=2J 21ω化简得到四阶龙格库塔方法使用四级四阶经典显式Rungkutta公式稳定性很好,RK4法是四阶方法,每步的误差是h5阶,而总积累误差为h4阶。

所以比欧拉稳定。

运行第三个程序:在一幅图中显示欧拉法和RK4法,随着截断误差的积累,欧拉法产生了较大的误差h=0.01h=0.0001,仍然是开始较为稳定,逐渐误差变大总结:RK4是很好的方法,很稳定,而且四阶是很常用的方法,因为到五阶的时候精度并没有相应提升。

通过这两种方法计算出角度峰值y=3.141593,周期是1.777510。

三个程序欧拉法clear;clch=0.00001;a=0;b=25;x=a:h:b;y(1)=0;z(1)=0;for i=1:length(x)-1 % 欧拉y(i+1)=y(i)+h*z(i);z(i+1)=z(i)+h*7.35499*cos(y(i));endplot(x,y,'r*');xlabel('时间');ylabel('角度');A=[x,y];%y(find(y==max(y)))%Num=(find(y==max(y)))[y,T]=max(y);fprintf('角度峰值等于%d',y) %角度的峰值也就是πfprintf('\n')fprintf('周期等于%d',T*h)%周期legend('欧拉');龙格库塔方法先定义函数rightf_sys1.mfunction w=rightf_sys1(x,y,z)w=7.35499*cos(y);clear;clc;%set(0,'RecursionLimit',500)h=0.01;a=0;b=25;x=a:h:b;RK_y(1)=0; %初值%RK_z(1)=0;初值for i=1:length(x)-1K1=RK_z(i); L1=rightf_sys1(x(i),RK_y(i),RK_z(i));%K1 and L1K2=RK_z(i)+0.5*h*L1;L2=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K1,RK_z(i)+0.5*h*L1);K3=RK_z(i)+0.5*h*L2;L3=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K2,RK_z(i)+0.5*h*L2);K4=RK_z(i)+h*L3;% K4L4=rightf_sys1(x(i)+h,RK_y(i)+h*K3,RK_z(i)+h*L3);and L4RK_y(i+1)=RK_y(i)+1/6*h*(K1+2*K2+2*K3+K4);RK_z(i+1)=RK_z(i)+1/6*h*(L1+2*L2+2*L3+L4);endplot(x,RK_y,'b+');xlabel('Variable x');ylabel('Variable y');A=[x,RK_y];[y,T]=max(RK_y);legend('RK4方法');fprintf('角度峰值等于%d',y) %角度的峰值也就是πfprintf('\n')%周期fprintf('周期等于%d',T*h)两个方法在一起对比使用跟上一个相同的函数rightf_sys1.mclear;clc; %清屏h=0.0001;a=0;b=25;x=a:h:b;Euler_y(1)=0;%欧拉的初值Euler_z(1)=0;RK_y(1)=0;%龙格库塔初值RK_z(1)=0;for i=1:length(x)-1%先是欧拉法Euler_y(i+1)=Euler_y(i)+h*Euler_z(i);Euler_z(i+1)=Euler_z(i)+h*7.35499*cos(Euler_y(i));%龙格库塔K1=RK_z(i); L1=rightf_sys1(x(i),RK_y(i),RK_z(i)); % K1 andL1K2=RK_z(i)+0.5*h*L1;L2=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K1,RK_z(i)+0.5*h*L1);% K2 and L2K3=RK_z(i)+0.5*h*L2;L3=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K2,RK_z(i)+0.5*h*L2);% K3 and L3K4=RK_z(i)+h*L3; L4=rightf_sys1(x(i)+h,RK_y(i)+h*K3,RK_z(i)+h*L3); K4 and L4RK_y(i+1)=RK_y(i)+1/6*h*(K1+2*K2+2*K3+K4);RK_z(i+1)=RK_z(i)+1/6*h*(L1+2*L2+2*L3+L4);endplot(x,Euler_y,'r-',x,RK_y,'b-');[y,T]=max(RK_y);%角度的峰值也就是πfprintf('角度峰值等于%d',y)fprintf('\n')%周期fprintf('周期等于%d',T*h)xlabel('时间');ylabel('角度');legend('欧拉','RK4');。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


左平成 S14060663 储建研14-2 理论力学专业
2. 问题

现在求解的是一个类似的问题,在这里的单摆是一种特别 的单摆,具有均匀的质量M分布在长为2的臂状摆上。 使用能量法(动能定理)建立方程

T W
1 2 J mg h 2

化简得到
d 2 7.35499 cos (重力加速度取9.80665m/s2) 2 dt
计算

边值条件y(0)=0,y'(0)=0.
计算

运行第三个程序:在一幅图中显示欧拉法和RK4法,随 着截断误差的积累,欧拉法产生了较大的误差 h=0.01 h=0.0001

总结

通过这两种方法计算出角度峰值y=3.141593,周期是 1.777510。 Euler方法结构简单,但是由于截断误差,使误差较大。 RK4是很好的方法,很稳定,由于到五阶的时候精度并 没有相应提升,所以四阶是很常用的方法。
Matlab 应用
使用Euler和Rungkutta方法解 臂状摆的能量方程Βιβλιοθήκη 1. 背景
单摆
求解单摆的运动一般使用角动量定 理
M J

化简得到
d 2 g sin 0 2 dt l

这样在小于5度的时候容易 简 sin 化为 ,这样比较容易解。实际上 这是一个解二阶常微分方程的问题。


1. 使用Euler方法
精度随着h的减小而更高,因为向前欧拉方法的整体截 断误差与h同阶,(因为用了泰勒公式)所以欧拉方法 的稳定区域并不大。通过减小h增加了稳定性。
h=0.01 h=0.0001
计算

2.RK4-四阶龙格库塔方法

使用四级四阶经典显式Rungkutta公式
误差很小:RK4法是四阶方法,每步的 误差是h5阶,而总积累误差为h4阶。 所以在同样步长h时候比欧拉方法准确。 接下来进行对比
相关文档
最新文档