计算方法上机作业——龙格库塔法matlab程序

合集下载

四阶龙格-库塔法求解常微分方程的初值问题-matlab通用程序

四阶龙格-库塔法求解常微分方程的初值问题-matlab通用程序

参考教材《数值分析》李乃成.梅立泉clearclcformat longm=input('请输入常微分方程的阶数m=');a=input('请输入x下限a=');b=input('请输入x上限b=');h=input('请输入步长h=');ym=input('令y(1,1)=y,y(2,1)=y’,y(3,1)=y’’...请输入ym=','s'); %输入的时候必须按照这个形式输入y1=y(1,1);if m==1 %一阶初值问题单独求解mm=(b-a)/h;y(1,1)=input('请输入在初值点的函数值f(a)=');x=a;y11(1)=y(1,1);for k1=2:(mm+1)y1=y(1,1);K(1,1)=h*(eval(ym)); %计算K1x=x+h/2;y(1,1)=y1+K(1,1)/2;y1=y(1,1);K(1,2)=h*(eval(ym)); %计算K2x=x;y(1,1)=y1+K(1,2)/2-K(1,1)/2;y1=y(1,1);K(1,3)=h*(eval(ym)); %计算K3x=x+h/2;y(1,1)=y1+K(1,3)-K(1,2)/2;y1=y(1,1);K(1,4)=h*(eval(ym)); %计算K4y11(k1)=y11(k1-1)+(K(1,1)+2*K(1,2)+2*K(1,3)+K(1,4))/6; y(1,1)=y11(k1);x=a+(k1-1)*h;endy11else %高阶初值问题mm=(b-a)/h; %一共要求解mm个数据点for k2=1:m %读取初值条件fprintf('请输入%d阶导数的初值f(%d)(a)=\n',(k2-1),(k2-1));y(k2,1)=input('=');endfor k2=1:my22(1,k2)=y(k2,1); %先把初值保存在矩阵y22(m,n)中,m表示第几个所求点,n表示第n阶初值endx=a;for k4=2:(mm+1) %求解mm个数据点的循环for k=1:(m-1) %计算K1,包括每一阶的K1 K(k,1)=h*y(k+1,1); %y(k+1,1)中k+1表示第k+1阶,1表示第一个点;K(k,1)中k表示阶数,1表示K1endK(m,1)=h*(eval(ym));x=x+h/2; %求解K1之前,先重新对x和y赋值for k3=1:my(k3,1)=y(k3,1)+K(k3,1)/2;endfor k=1:(m-1) %计算K2K(k,2)=h*y(k+1,1);endK(m,2)=h*(eval(ym));x=x;for k3=1:my(k3,1)=y(k3,1)-K(k3,1)/2+K(k3,2)/2;endfor k=1:(m-1) %计算K3K(k,3)=h*y(k+1,1);endK(m,3)=h*(eval(ym));x=x+h/2;for k3=1:my(k3,1)=y(k3,1)+K(k3,3)-K(k3,2)/2; %这里容易出错endfor k=1:(m-1) %计算K4K(k,4)=h*y(k+1,1);endK(m,4)=h*(eval(ym));for k5=1:my22(k4,k5)=y22(k4-1,k5)+(K(k5,1)+2*K(k5,2)+2*K(k5,3)+K(k5,4))/6; %这里,除了要求出下一个点的数值,还要求出相应的导数值endfor k6=1:m %除了对y(1,1)重新赋值外,还要对y(2,1)等重新赋值y(k6,1)=y22(k4,k6);endx=a+(k4-1)*h;endy22(:,1) end。

内弹道 龙格库塔 计算 matlab

内弹道 龙格库塔 计算 matlab

内弹道是指射程较短的导弹或火箭弹在飞行过程中受到大气阻力和重力等作用的飞行轨迹。

内弹道理论研究的是导弹或火箭弹在发射后到离开大气层再进入大气层末时的飞行过程。

内弹道包括导弹或火箭弹在发射后的加速、稳定、制导、飞行以及飞行过程中的动力学性能仿真等诸多内容。

内弹道有着复杂的飞行特性和动力学方程,在实际工程中需要进行准确的计算和仿真。

内弹道的计算中,龙格库塔(Runge-Kutta)法是一种常用的数值积分方法,在求解微分方程等领域有着广泛的应用。

龙格库塔法是由数学家奥特翁格(C. W. Runge)和马丁庫塔(M. W. J. Kutta)于1900年提出的,用于求解常微分方程初值问题,其优点是精度较高,适用范围广。

在内弹道计算中,可以利用龙格库塔法对导弹或火箭弹的飞行轨迹进行数值模拟和计算,得到较为准确的飞行轨迹数据。

在实际工程中,为了方便进行内弹道的计算,可以使用Matlab等数学建模和仿真软件。

Matlab是一种常用的科学计算软件,具有强大的数值计算和仿真功能,可以用于内弹道计算中的龙格库塔法数值模拟。

在Matlab中,可以编写相应的程序,利用龙格库塔法对导弹或火箭弹的飞行过程进行仿真和计算,得到准确的飞行轨迹和动力学性能数据。

内弹道计算是导弹或火箭弹研究设计中的重要内容,龙格库塔法是一种常用的数值积分方法,Matlab是一种常用的科学计算软件,它们的应用能够有效地进行内弹道的计算和仿真,为导弹或火箭弹的研制提供重要的技术支持。

随着技术的不断发展,内弹道计算已经成为导弹或火箭弹研究设计中不可或缺的一部分。

在内弹道计算中,龙格库塔法是一种常用的数值积分方法,可以对导弹或火箭弹的飞行轨迹进行数值模拟和计算,提供准确的飞行轨迹数据。

而Matlab作为一种强大的科学计算软件,对于内弹道的计算和仿真也有着重要的应用价值。

在实际工程中,使用Matlab编写程序,利用龙格库塔法对导弹或火箭弹的飞行轨迹进行数值模拟和计算,将为导弹或火箭弹的研制提供重要的技术支持。

matlab龙格库塔法程序,给出实例

matlab龙格库塔法程序,给出实例

一、介绍龙格库塔法龙格库塔法(Runge-Kutta method)是一种数值计算方法,用于求解常微分方程的数值解。

它通过多步迭代的方式逼近微分方程的解,并且具有较高的精度和稳定性。

二、龙格库塔法的原理龙格库塔法采用迭代的方式来逼近微分方程的解。

在每一步迭代中,计算出当前时刻的斜率,然后根据这个斜率来求解下一个时刻的值。

通过多步迭代,可以得到微分方程的数值解。

三、龙格库塔法的公式龙格库塔法可以表示为以下形式:k1 = f(tn, yn)k2 = f(tn + h/2, yn + h/2 * k1)k3 = f(tn + h/2, yn + h/2 * k2)k4 = f(tn + h, yn + h * k3)yn+1 = yn + h/6 * (k1 + 2k2 + 2k3 + k4)其中,k1、k2、k3、k4为斜率,h为步长,tn为当前时刻,yn为当前时刻的解,yn+1为下一个时刻的解。

四、使用matlab实现龙格库塔法在MATLAB中,可以通过编写函数来实现龙格库塔法。

下面是一个用MATLAB实现龙格库塔法的简单例子:```matlabfunction [t, y] = runge_kutta(f, tspan, y0, h)t0 = tspan(1);tf = tspan(2);t = t0:h:tf;n = length(t);y = zeros(1, n);y(1) = y0;for i = 1:n-1k1 = f(t(i), y(i));k2 = f(t(i) + h/2, y(i) + h/2 * k1);k3 = f(t(i) + h/2, y(i) + h/2 * k2);k4 = f(t(i) + h, y(i) + h * k3);y(i+1) = y(i) + h/6 * (k1 + 2*k2 + 2*k3 + k4);endend```以上就是一个简单的MATLAB函数,可以利用该函数求解给定的微分方程。

微分方程的数值解法matlab(四阶龙格—库塔法)

微分方程的数值解法matlab(四阶龙格—库塔法)

解析解: x x x1 3 2(((ttt))) 0 .0 8 1 1 2 P k 8 0siw n t) (2 .6 3 0 3 3 P k 0siw n t) (0 .2 12 2 2 P k 0siw n t)(
第一个质量的位移响应时程
Y (t)A(Y t)P(t)
(2)
Y (t)A(Y t)P(t)
3. Matlab 程序(主程序:ZCX)
t0;Y0;h;N;P0,w; %输入初始值、步长、迭代次数、初始激励力;
for i = 1 : N
t1 = t0 + h
P=[P0*sin(w*t0);0.0;0.0]
%输入t0时刻的外部激励力
Van der Pol方程
% 子程序 (程序名: dYdt.m ) function Ydot = dYdt (t, Y) Ydot=[Y(2);-Y(2)*(Y(1)^2-1)-Y(1)];
或写为
function Ydot = dYdt (t, Y) Ydot=zeros(size(Y)); Ydot(1)=Y(2); Ydot(2)=-Y(2)*(Y(1).^2-1)-Y(1)];
Solver解算指令的使用格式
说明:
t0:初始时刻;tN:终点时刻 Y0:初值; tol:计算精度
[t, Y]=solver (‘ODE函数文件名’, t0, tN, Y0, tol);
ode45
输出宗量形式
y1 (t0 )
Y
y1
(t1
)
y
1
(t
2
)
y2 (t0 )
y
2
(
t1
)
y
2
(
t

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');。

常微分方程组的四阶RUNGEKUTTA龙格库塔法MATLAB实现

常微分方程组的四阶RUNGEKUTTA龙格库塔法MATLAB实现

常微分方程组的四阶RUNGEKUTTA龙格库塔法MATLAB实现欢迎使用 Python 版的实现!数值解常微分方程组的四阶 Runge-Kutta 方法(也被称为 RK4 方法)可以通过迭代的方式逐步逼近精确解。

对于一阶常微分方程组:dy/dt = f(t, y)我们可以通过下面的公式来计算下一个时间步长上的近似解:y(n+1)=y(n)+(1/6)(k1+2k2+2k3+k4)其中k1=h*f(t(n),y(n))k2=h*f(t(n)+h/2,y(n)+k1/2)k3=h*f(t(n)+h/2,y(n)+k2/2)k4=h*f(t(n)+h,y(n)+k3)这里,h代表时间步长,t(n)代表当前时间,y(n)代表当前解。

f(t,y)是给定的方程组。

对于四阶 Runge-Kutta 方法的 MATLAB 实现,可以按照以下步骤进行。

1.首先,定义需要求解的常微分方程组。

function dydt = equations(t, y)dydt = zeros(2, 1);dydt(1) = y(2); % 根据方程组的具体形式修改dydt(2) = -y(1); % 根据方程组的具体形式修改end2.定义RK4方法的求解函数。

function [t, y] = rk4_solver(equations, tspan, y0, h) t = tspan(1):h:tspan(2);y = zeros(length(y0), length(t));y(:,1)=y0;for i = 1:length(t)-1k1 = h * equations(t(i), y(:, i));k2 = h * equations(t(i) + h/2, y(:, i) + k1/2);k3 = h * equations(t(i) + h/2, y(:, i) + k2/2);k4 = h * equations(t(i) + h, y(:, i) + k3);y(:,i+1)=y(:,i)+(k1+2*k2+2*k3+k4)/6;endend3. 调用 rk4_solver 函数求解常微分方程组。

计算方法上机作业——龙格库塔法

计算方法上机作业——龙格库塔法

1 yi 1 yi 6 K1 2 K 2 2 K 3 K 4 K hf x , y i i 1 K1 h K 2 hf xi , yi 2 2 K2 h K 3 hf xi 2 , yi 2 K hf x h, y K 4 i i 3 1 y j ,i 1 y j ,i 6 K j1 2 K j 2 2 K j 3 K j 4 K hf x ; y , y , , y i 1i 2i ni j1 K K11 K h , y2i 21 , , yni n1 K j 2 hf xi ; y1i 2 2 2 2 Kn2 K12 K 22 h K j 3 hf xi 2 ; y1i 2 , y2i 2 , , yni 2 K hf x h; y K , y K , , y K j4 i 1i 13 2i 23 ni n3
四阶龙格库塔法求解常微分方程的初值问题18图19标准四级四阶龙格库塔法程序框图42程序使用说明标准四级四阶龙格库塔法求解常微分方程初值问题的matlab程序见附录程序可以用来求解一阶常微分方程组和高阶常微分方程的初值问题运行程序按照命令窗口的提示输入相关变量直至得到结果
计算方法上机报告
4 四阶龙格-库塔法求解常微分方程的初值问题
4.1 算法原理及程序框图 一阶常微分方程(组)和高阶常微分方程的初值问题最终都可以转化为一阶常微 分方程组的初值问题,其向量形式为式(17)。
y x f x, y x , y a y0
a xb
(17)
式(17)在形式上与单个微分方程的初值问题完全相同, 只是将数量函数变成了向量 函数。 因此, 标准四级四阶龙格—库塔法的向量形式和分量形式分别为式(18)和式(19)。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
28
计算方法上机报告 for mm=1:n fprintf('%9c%.f','y',mm) end for nn=1:N fprintf('\n%10.5f',x(nn)); for ll=1:n fprintf('%10.5f',y(ll,nn)); end if nn==N fprintf('\n'); end tlab 程序
附录 5 龙格—库塔法求解常微分方程初值问题的 matlab 程序
clear;clc; %======需要输入的=======% n = input('\n 请输入一阶微分方程组的个数或者高阶方程组的阶数 n:\n'); a = input('\n 请输入求解区间的下限 a:\n'); b = input('\n 请输入求解区间的上限 b:\n'); h = input('\n 请输入求解步长 h:\n'); fprintf('\n 请依次输入%.f 个方程的右端函数 fi(x,y(x)):\n',n) s = cell(n,1); for p=1:n fprintf('f%.f(x,y(x)) =',p) r = input(' ','s'); s{p} = r; end fprintf('\n 请依次输入%.f 个初值 yi(%.f):\n',n,a) y0 = zeros(n,1); for q=1:n fprintf('y%.f(%.f) =',q,a); y0(q) = input(' '); end %======需要输入的=======% N = (b-a)/h+1; x = a:h:b; K = zeros(n,4); y = zeros(n,N); y(:,1) = y0; for i=1:N-1 for a=1:n f = inline(char(s(a)),'x','y'); K(a,1) = h*f(x(i),y(:,i)); end for b=1:n f = inline(char(s(b)),'x','y'); K(b,2) = h*f(x(i)+h/2,y(:,i)+K(:,1)/2); end for c=1:n f = inline(char(s(c)),'x','y'); K(c,3) = h*f(x(i)+h/2,y(:,i)+K(:,2)/2); end for d=1:n f = inline(char(s(d)),'x','y'); K(d,4) = h*f(x(i)+h,y(:,i)+K(:,3)); end for j=1:n y(j,i+1) = y(j,i)+1/6*(K(j,1)+2*K(j,2)+2*K(j,3)+K(j,4)); end plot(x(i),y(1,i),'.k','markersize',15) hold on; end grid; fprintf('\n%10c','x')
29
相关文档
最新文档