龙格库塔方法matlab实现
- 格式:doc
- 大小:63.50 KB
- 文档页数:1
matlab四阶龙格库塔法解方程组摘要:1.MATLAB 与四阶龙格- 库塔法简介2.四阶龙格- 库塔法求解方程组的原理3.MATLAB 中实现四阶龙格- 库塔法的方法4.四阶龙格- 库塔法在MATLAB 中的应用实例5.总结与展望正文:一、MATLAB 与四阶龙格- 库塔法简介MATLAB 是一种广泛应用于科学计算、数据分析和可视化的编程语言,它为用户提供了丰富的函数库和工具箱,使得各种数学运算和工程计算变得简单易行。
在MATLAB 中,求解方程组是工程和技术领域中常见的问题,而四阶龙格- 库塔法(RK4)是一种高效的数值求解方法。
二、四阶龙格- 库塔法求解方程组的原理四阶龙格- 库塔法是一种基于分步法的四阶数值积分方法,用于求解常微分方程初值问题。
它通过将求解区间分为若干个小区间,然后在每个小区间内,对导数进行四次评估,最后以加权平均的方式获取区间内函数的平均斜率,从而近似求得该区间内函数的值。
通过这种方式,可以逐步求解出方程组的解。
三、MATLAB 中实现四阶龙格- 库塔法的方法在MATLAB 中,可以使用自定义函数和循环结构实现四阶龙格- 库塔法求解方程组。
以下是一个简单的示例:```matlabfunction dXdt = rk4(t, X, f, dt)% 计算k1k1 = f(t, X);% 计算k2k2 = f(t + dt/2, X + 0.5*dt*k1);% 计算k3k3 = f(t + dt/2, X + 0.5*dt*k2);% 计算k4k4 = f(t + dt, X + dt*k3);% 计算四阶龙格- 库塔法导数dXdt = (k1 + 2*k2 + 2*k3 + k4) / 6;end```四、四阶龙格- 库塔法在MATLAB 中的应用实例假设我们要求解如下方程组:```x" = 2*y - zy" = x + 2*zz" = -x + y```我们可以使用MATLAB 中的四阶龙格- 库塔法求解该方程组,具体步骤如下:1.定义方程组的函数形式:```matlabfunction f = example_function(t, X)f(1, X) = [2*X(2) - X(3); X(1) + 2*X(3); -X(1) + X(2)];end```2.设置求解参数:```matlabtspan = [0, 10];dt = 0.01;```3.初始化解:```matlabX0 = [1; 1; 1];```4.使用四阶龙格- 库塔法求解方程组:```matlab[~, X] = ode45(@(t, X) example_function(t, X), tspan, X0, dt);```5.绘制解的曲线:```matlabplot3(X(:, 1), X(:, 2), X(:, 3));xlabel("x");ylabel("y");zlabel("z");title("四阶龙格- 库塔法求解示例");```五、总结与展望四阶龙格- 库塔法作为一种高效的数值积分方法,在MATLAB 中得到了广泛的应用。
常微分方程组的四阶Runge-Kutta方法1.问题:1.1若用普通方法-----仅适用于两个方程组成的方程组编程实现:创建M 文件:function R = rk4(f,g,a,b,xa,ya,N)%UNTITLED2 Summary of this function goes here% Detailed explanation goes here%x'=f(t,x,y) y'=g(t,x,y)%N为迭代次数%h为步长%ya,xa为初值f=@(t,x,y)(2*x-0.02*x*y);g=@(t,x,y)(0.0002*x*y-0.8*y);h=(b-a)/N;T=zeros(1,N+1);X=zeros(1,N+1);Y=zeros(1,N+1);T=a:h:b;X(1)=xa;Y(1)=ya;for j=1:Nf1=feval(f,T(j),X(j),Y(j));g1=feval(g,T(j),X(j),Y(j));f2=feval(f,T(j)+h/2,X(j)+h/2*f1,Y(j)+g1/2);g2=feval(g,T(j)+h/2,X(j)+h/2*f1,Y(j)+h/2*g1); f3=feval(f,T(j)+h/2,X(j)+h/2*f2,Y(j)+h*g2/2); g3=feval(g,T(j)+h/2,X(j)+h/2*f2,Y(j)+h/2*g2); f4=feval(f,T(j)+h,X(j)+h*f3,Y(j)+h*g3);g4=feval(g,T(j)+h,X(j)+h*f3,Y(j)+h*g3);X(j+1)=X(j)+h*(f1+2*f2+2*f3+f4)/6;Y(j+1)=Y(j)+h*(g1+2*g2+2*g3+g4)/6;R=[T' X' Y'];end情况一:对于x0=3000,y0=120控制台中输入:>> rk4('f','g',0,10,3000,120,10)运行结果:ans =1.0e+003 *0 3.0000 0.12000.0010 2.6637 0.09260.0020 3.7120 0.07740.0030 5.5033 0.08860.0040 4.9866 0.11930.0050 3.1930 0.11950.0060 2.7665 0.09510.0070 3.6543 0.07990.0080 5.2582 0.08840.0090 4.9942 0.11570.0100 3.3541 0.1185数据:情况二:对于x0=5000,y0=100命令行中输入:>> rk4('f','g',0,10,5000,100,10)运行结果:ans =1.0e+003 *0 5.0000 0.10000.0010 4.1883 0.11440.0020 3.2978 0.10720.0030 3.3468 0.09220.0040 4.2020 0.08760.0050 4.8807 0.09950.0060 4.2090 0.11260.0070 3.3874 0.10690.0080 3.4011 0.09340.0090 4.1568 0.08890.0100 4.7753 0.0991数据:结论:无论取得初值是哪一组,捕食者与被捕食者的数量总是一个增长另一个减少,并且是以T=5 为周期交替增长或减少的。
题一: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 实现四阶龙格库塔法求解微分方程组。
首先,我们需要定义微分方程组。
假设我们要求解以下微分方程组:y1' = -2*y1 + y2y2' = -y1 + 2*y2可以将这个微分方程组写成向量形式:Y' = f(Y)其中,Y = [y1; y2]f(Y) = [-2*y1 + y2; -y1 + 2*y2]接下来,我们需要编写四阶龙格库塔法的代码。
具体步骤如下:1. 定义初始值 Y0 和时间间隔 dt。
2. 编写 f(Y) 的函数代码。
3. 使用四阶龙格库塔法计算下一个时间步的 Y 值。
4. 重复步骤 3 直到计算到指定的时间点。
以下是完整的 MATLAB 代码:% 定义初始值 Y0 和时间间隔 dtt0 = 0;tf = 10;dt = 0.01;Y0 = [1; 0];% 编写 f(Y) 的函数代码function dy = f(Y)dy = [-2*Y(1) + Y(2); -Y(1) + 2*Y(2)];end% 使用四阶龙格库塔法计算下一个时间步的 Y 值function Y = rk4(Y, f, dt)k1 = dt*f(Y);k2 = dt*f(Y + 0.5*k1);k3 = dt*f(Y + 0.5*k2);k4 = dt*f(Y + k3);Y = Y + (k1 + 2*k2 + 2*k3 + k4)/6;end% 计算 Y 的值Y = Y0;for t = t0:dt:tfY = rk4(Y, @f, dt);disp(Y);end以上代码将输出从 t0 到 tf 时间段内每个时间步的 Y 值。
您可以根据需要修改微分方程组和时间间隔等参数。
龙格库塔法(Runge-Kutta method)和欧拉法(Euler's method)是两种常用的数值求解常微分方程的方法。
这里分别给出它们的MATLAB实现:1. 龙格库塔法(Runge-Kutta method):```matlabfunction [y, t] = runge_kutta(f, y0, t0, tf, h)% f: 微分方程函数,输入为[y, t],输出为dy/dt% y0: 初始值% t0: 初始时间% tf: 结束时间% h: 步长N = round((tf - t0) / h); % 计算迭代次数t = zeros(1, N + 1); % 初始化时间向量y = zeros(size(y0), N + 1); % 初始化解向量t(1) = t0;y(:, 1) = y0;for i = 1:Nk1 = h * f(y(:, i), t(i));k2 = h * f(y(:, i) + k1 / 2, t(i) + h / 2);k3 = h * f(y(:, i) + k2 / 2, t(i) + h / 2);k4 = h * f(y(:, i) + k3, t(i) + h);y(:, i + 1) = y(:, i) + (k1 + 2 * k2 + 2 * k3 + k4) / 6;t(i + 1) = t(i) + h;endend```2. 欧拉法(Euler's method):```matlabfunction [y, t] = euler_method(f, y0, t0, tf, h)% f: 微分方程函数,输入为[y, t],输出为dy/dt% y0: 初始值% t0: 初始时间% tf: 结束时间% h: 步长N = round((tf - t0) / h); % 计算迭代次数t = zeros(1, N + 1); % 初始化时间向量y = zeros(size(y0), N + 1); % 初始化解向量t(1) = t0;y(:, 1) = y0;for i = 1:Ny(:, i + 1) = y(:, i) + h * f(y(:, i), t(i));t(i + 1) = t(i) + h;endend```使用这两个函数时,需要定义一个表示微分方程的函数`f`,例如:```matlabfunction dydt = my_ode(y, t)dydt = -y; % 一个简单的一阶线性微分方程:dy/dt = -yend```然后调用相应的求解函数,例如:```matlaby0 = 1; % 初始值t0 = 0; % 初始时间tf = 5; % 结束时间h = 0.1; % 步长[y_rk, t_rk] = runge_kutta(@my_ode, y0, t0, tf, h);[y_euler, t_euler] = euler_method(@my_ode, y0, t0, tf, h);```。
龙格-库塔法(Runge-Kutta)数值分析中,龙格-库塔法(Runge-Kutta)是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。
这些技术由数学家卡尔·龙格和马丁·威尔海姆·库塔于1900年左右发明。
经典四阶龙格库塔法RK4””或者就是龙格库塔法的家族中的一个成员如此常用,以至于经常被称为“RK4“龙格库塔法”。
令初值问题表述如下。
则,对于该问题的RK4由如下方程给出:其中这样,下一个值(yn+1)由现在的值(yn)加上时间间隔(h)和一个估算的斜率的乘积决定。
该斜率是以下斜率的加权平均:k1是时间段开始时的斜率;k2是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn+h/2的值;k3也是中点的斜率,但是这次采用斜率k2决定y值;k4是时间段终点的斜率,其y值用k3决定。
当四个斜率取平均时,中点的斜率有更大的权值:RK4法是四阶方法,也就是说每步的误差是h5阶,而总积累误差为h4阶。
注意上述公式对于标量或者向量函数(y可以是向量)都适用。
显式龙格库塔法显示龙格-库塔法是上述RK4法的一个推广。
它由下式给出其中(注意:上述方程在不同著述中由不同但却等价的定义)。
要给定一个特定的方法,必须提供整数s(阶段数),以及系数aij(对于1≤j<i≤s),bi(对于i=1,2,2,...,...,s)和ci(对于i=2,3,3,...,...,s)。
这些数据通常排列在一个助记c3a31如果要求方法有精度p则还有相应的条件,也就是要求舍入误差为O(hp+1)时的条件。
这些可以从舍入误差本身的定义中导出。
例如,一个2阶精度的2段方法要求b1+b2=1,b2c2=1/2,以及b2a21=1/2。
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实现龙格库塔解法。
简单公式如下,(详细内容自己百度或者其他来源)
ⅆy
ⅆx
=f(x,y) y(0)=y0
y j+1=y j+1
6
(k1+2k2+2k3+k4)ℎk1=f(x i,y i)
k2=f(x i+1
ℎ,y i+
1
k1ℎ)
k3=f(x i+1
2
ℎ,y i+
1
2
k2ℎ)
k4=f(x i+ℎ,y i+k3ℎ)
其中h为步长
物理问题背景
现在我们假设解决一个简单的RC串联电路,输出选取电容电容两端的电压,
输入电压选取方波,电路图如下所示:
微分方程为
ⅆU c ⅆt =
U i−U c
RC
其中U c为电容两端的电压, U I为输入电压。
MATLAB实现满足下面流程图
MATLAB代码
图1
图2
图3
图1为主程序,图2为龙格库塔法,图3为微分方程。
结果显示
下一篇:二阶常微分方程的龙格库塔法求解及其MATLAB实现。
m a t l a b四阶龙格-库塔法求微分方程Matlab 实现四阶龙格-库塔发求解微分方程从理论上讲,只要函数在某区间上充分光滑,那么它可以展开为泰勒级数,因此在该区间上的函数值可用各阶导数值近似地表示出来,反之其各阶导数值也可用某些函数值的线性组合近似地表示出来。
龙格-库塔法就是将待求函数)(t y 展开为泰勒级数,并用方程函数),(y f t 近似其各阶导数,从而迭代得到)(t y 的数值解。
具体来说,四阶龙格-库塔迭代公式为)22(6143211k 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 way2way1):可以选择直接加载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),'^')%在图形上表示出来补充:改变步长影响数据的准确性。