没有对比就没有伤害,本文先给出很多时候直接采用的矩形法,然后与四阶龙格库塔法做比较,着重说明四阶龙格库塔法。


一、矩形法


1.1 原理

设微分方程

y˙=f(y)(1.1)\dot y=f(y) \tag{1.1}y˙​=f(y)(1.1)

求yyy。

使用数值方法,离散化得每一步的增量

Δy=f(y)Δt(1.2)\Delta y = f(y)\Delta t \tag{1.2}Δy=f(y)Δt(1.2)

易得

yn+1=yn+f(yn)Δt(1.3)y_{n+1} =y_n + f(y_{n}) \Delta t \tag{1.3}yn+1​=yn​+f(yn​)Δt(1.3)

实际上,这就是矩形法计算积分。当 Δt→0\Delta t \to 0Δt→0时,可以得出很高精度的yny_nyn​,但实际工程中未必能够取很小的Δt\Delta tΔt。


1.2 例子


y˙=e−yy0=0(1.4)\begin{aligned} \dot y &= e^{-y} \\ y_0 &= 0 \tag{1.4} \end{aligned}y˙​y0​​=e−y=0​(1.4)

为例,时间取1~10s,分别取 Δt=0.1,Δt=1\Delta t =0.1,\Delta t =1Δt=0.1,Δt=1,查看不同精度下的运算结果。式(1.4)可求出解析解为y=ln⁡(t+1)y=\ln(t+1)y=ln(t+1),用于比较求解精度。

%% 不同步长下的矩形法比较dt1 = 0.1;                % 步长1
dt2 = 1.0;                 % 步长2t1 = 0:dt1:10;            % 时间1
t2 = 0:dt2:10;             % 时间2y1 = ode_rect(t1, 0);         % 精度1下计算结果
y2 = ode_rect(t2, 0);          % 精度2下计算结果plot(t1,log(t1+1),t1,y1,t2,y2);
legend('理论值', 'dt=0.1', 'dt=1');
grid on;grid minor;xlabel 't';ylabel 'y'%% 导数方程
function dy=f(y)dy = exp(-y);
end%% 矩形法
function y = ode_rect(t, y0)N = length(t);y = zeros(N,1);y(1) = y0;for n = 1:N - 1dt = t(n+1) - t(n);             % 计算步长 dty(n+1) = y(n) + f(y(n)) * dt;   % 累加计算 yend
end


可见,当步长为0.1时,矩形法的精度较高,但步长为1时,矩形法误差大。


二、龙格库塔法


2.1 y˙=f(y)\dot y=f(y)y˙​=f(y) 形式

经过多年潜心研究,龙格库塔站在前人的肩膀上,发现了一种高精度的方法。那就是把式(1.3)的计算改为

yn+1=yn+h6(k1+2k2+2k3+k4)k1=f(yn)k2=f(yn+k1h2)k3=f(yn+k2h2)k4=f(yn+k3h)(2.1)\begin{aligned} y_{n+1} &=y_n + \frac{h}{6} (k_1 + 2k_2 + 2k_3 + k_4) \\ k_1 &= f(y_n) \\ k_2 &= f(y_n + k_1 \frac{h}{2}) \\ k_3 &= f(y_n + k_2 \frac{h}{2}) \\ k_4 &= f(y_n + k_3 h) \end{aligned} \tag{2.1}yn+1​k1​k2​k3​k4​​=yn​+6h​(k1​+2k2​+2k3​+k4​)=f(yn​)=f(yn​+k1​2h​)=f(yn​+k2​2h​)=f(yn​+k3​h)​(2.1)

此处,采用习惯上的符号hhh,上面的例子中,h=Δth=\Delta th=Δt。

依旧对于式(1.4),步长取1,分别使用矩形法和四阶龙格库塔法求解,结果如下

%% 矩形法与龙格库塔法比较
dt = 1.0;
t = 0:dt:10;
y1 = ode_rect(t, 0);       % 矩形法计算
y2 = ode_rk(t, 0);         % 龙格库塔法计算plot(0:0.01:10,log([0:0.01:10]+1),t,y1,t,y2);
legend('理论值', '矩形法', '龙格库塔法');
grid on;grid minor;xlabel 't';ylabel 'y'%% 导数方程
function dy=f(y)dy = exp(-y);
end%% 矩形法
function y = ode_rect(t, y0)N = length(t);y = zeros(N,1);y(1) = y0;for n = 1:N - 1dt = t(n+1) - t(n);             % 计算步长 dty(n+1) = y(n) + f(y(n)) * dt;   % 累加计算 yend
end%% 四阶龙格库塔法
function y = ode_rk(t, y0)N = length(t);y = zeros(N,1);y(1) = y0;for n = 1:N-1h = t(n+1) - t(n);              % 步长(即时间间隔)k1 = f(y(n));                   % k1k2 = f(y(n) + h/2*k1);          % k2k3 = f(y(n) + h/2*k2);          % k3k4 = f(y(n) + h*k3);            % k4y(n+1) = y(n) + h/6 * (k1 + 2*k2 + 2*k3 + k4);  % 累加计算yend
end

可见,四阶龙格库塔法很好地接近真实值。


2.2 y˙=f(t)\dot y=f(t)y˙​=f(t) 形式

y˙=f(t)(2.2)\dot y = f(t) \tag{2.2} y˙​=f(t)(2.2)

从理论计算微分方程的角度,式(1.1) 和式(2.2)有着截然不同的求解方式。但是使用数值方法,只不过是把 yyy变为ttt。四阶龙格库塔法求解式(2.2)的方法如下

yn+1=yn+h6(k1+2k2+2k3+k4)k1=f(tn)k2=f(tn+h2)k3=f(tn+h2)k4=f(tn+h)(2.3)\begin{aligned} y_{n+1} &=y_n + \frac{h}{6} (k_1 + 2k_2 + 2k_3 + k_4) \\ k_1 &= f(t_n) \\ k_2 &= f(t_n +\frac{h}{2}) \\ k_3 &= f(t_n + \frac{h}{2}) \\ k_4 &= f(t_n + h) \end{aligned} \tag{2.3}yn+1​k1​k2​k3​k4​​=yn​+6h​(k1​+2k2​+2k3​+k4​)=f(tn​)=f(tn​+2h​)=f(tn​+2h​)=f(tn​+h)​(2.3)

一个简单的例子是

y˙=sin⁡(t)y0=0(2.4)\begin{aligned} &\dot y = \sin(t) \\ &y_0 = 0 \end{aligned} \tag{2.4}​y˙​=sin(t)y0​=0​(2.4)

其解析解为y=1−cos⁡(t)y=1-\cos(t)y=1−cos(t)。设步长分别为1,0.1,使用四阶龙格库塔法发求解如下

%% 龙格库塔法步长差异比较
dt1 = 1;                % 步长为1
dt2 = 0.1;              % 步长为0.1
T = 10;                 % 总时间10st1 = 0:dt1:T;           % 时间t1
y1 = ode_rk(t1, 0);     % 解y1
t2 = 0:dt2:T;           % 时间t2
y2 = ode_rk(t2, 0);     % 解y2figure(1)
plot(0:0.01:T, 1-cos(0:0.01:T));hold on                 % 解析解计算值
plot(t1,y1, '-o', t2,y2, '--');hold off                             % 数值解计算值
legend('理论值','dt=1', 'dt=0.1');title('龙格库塔法');
grid on;grid minor;xlabel 't';ylabel 'y'%% 导数方程
function dy=f(t)dy = sin(t);
end%% 四阶龙格库塔法
function y = ode_rk(t, y0)N = length(t);y = zeros(N,1);y(1) = y0;for n = 1:N-1h = t(n+1) - t(n);              % 步长(即时间间隔)k1 = f(t(n));                   % k1k2 = f(t(n) + h/2);          % k2k3 = f(t(n) + h/2);          % k3k4 = f(t(n) + h);            % k4y(n+1) = y(n) + h/6 * (k1 + 2*k2 + 2*k3 + k4);  % 累加计算yend
end

从例子中可见,步长为1时,龙格库塔法依旧得到精确的结果。


2.3 y˙=f(y,t)\dot y=f(y, t)y˙​=f(y,t) 形式


y˙=f(y,t)\dot y=f(y, t)y˙​=f(y,t)

求解yyy。不过是多了一个变量,使用四阶龙格库塔法计算方法为

yn+1=yn+h6(k1+2k2+2k3+k4)k1=f(yn,tn)k2=f(yn+k1h2,tn+h2)k3=f(yn+k2h2,tn+h2)k4=f(yn+k3h,tn+h)(2.5)\begin{aligned} y_{n+1} &=y_n + \frac{h}{6} (k_1 + 2k_2 + 2k_3 + k_4) \\ k_1 &= f(y_n,t_n) \\ k_2 &= f(y_n + k_1 \frac{h}{2}, t_n + \frac{h}{2}) \\ k_3 &= f(y_n + k_2 \frac{h}{2}, t_n + \frac{h}{2}) \\ k_4 &= f(y_n + k_3 h, t_n + h) \end{aligned} \tag{2.5}yn+1​k1​k2​k3​k4​​=yn​+6h​(k1​+2k2​+2k3​+k4​)=f(yn​,tn​)=f(yn​+k1​2h​,tn​+2h​)=f(yn​+k2​2h​,tn​+2h​)=f(yn​+k3​h,tn​+h)​(2.5)

更多变量,以此类推,不再赘述。

四阶龙格库塔法的计算例子相关推荐

  1. 四阶龙格库塔法-实现异步电机模型仿真

    序言 龙格库塔法是求解线性.非线性微分方程数值解的经典方法.具有计算精度高,稳定性好的特点.由于该方法在基于现代控制理论的观测器应用中十分重要,因此有必要通过一个经典的例子实现该方法的仿真应用. 关键 ...

  2. 二阶偏微分方程组 龙格库塔法_1、经典四阶龙格库塔法解一阶微分方程组

    1.经典四阶龙格库塔法解一阶微分方程组 陕 西 科 技 大 学 数值计算课程设计任务书 理学院信息与计算科学/应用数学专业信息08/数学08 班级 学生: 题目:典型数值算法的C++语言程序设计 课程 ...

  3. 四阶龙格库塔法求解一次常微分方程组(python实现)

    四阶龙格库塔法求解一次常微分方程组 一.前言 二.RK4求解方程组的要点 1. 将方程组转化为RK4求解要求的标准形式 2. 注意区分每个方程的独立性 三.python实现RK4求解一次常微分方程组 ...

  4. 四阶龙格库塔法的基本思想_经典四阶龙格库塔法解一阶微分方程组讲义.doc

    1.经典四阶龙格库塔法解一阶微分方程组 1.1运用四阶龙格库塔法解一阶微分方程组算法分析 , 经过循环计算由 推得 -- 每个龙格-库塔方法都是由一个合适的泰勒方法推导而来,使得其最终全局误差为,一种 ...

  5. 四阶龙格库塔法的基本思想_Runge-Kutta法求四元数微分方程

    Runge-Kutta法求四元数微分方程 Runge-Kutta法求四元数微分方程 文章目录一.背景知识1. 坐标系 2. 四元数四元数的矩阵形式 四元数与旋转的关系 二.数学模型1. 四元数微分方程 ...

  6. 四阶龙格库塔法的基本思想_四阶龙格库塔实验报告.docx

    四阶龙格库塔实验报告 三.四阶Runge-Kutta法求解常微分方程一.龙格库塔法的思想根据第九章的知识可知道,Euler方法的局部截断误差是,而当用Euler方法估计出再用梯形公式进行校正,即采用改 ...

  7. 用四阶龙格库塔法(RK4)求解二阶微分方程

    import math import matplotlib.pyplot as plt# 龙格-库塔法的定义 def runge_kutta(y, h, f):k1 = h * f(t, x1, x2 ...

  8. python解常微分方程龙格库_excel实现四阶龙格库塔法runge-kutta解二阶常微分方程范例.xls...

    excel实现四阶龙格库塔法runge-kutta解二阶常微分方程范例,rungekutta,四阶rungekutta法,rungekuttamatlab,四阶rungekutta,rungekutt ...

  9. 欧拉法、预估校正法(改进的欧拉法)与四阶龙格库塔法求解常微分方程的数值解C++程序

    以y'=x+y,0<x<1,y(0)=1为例,取步长h=0.1,已知精确值为y=-x-1+2e^x,用来进行精度比较 #include<stdio.h> using names ...

  10. 四阶龙格库塔法的基本思想_利用龙格库塔法求解郎之万方程.doc

    利用龙格库塔法求解郎之万方程.doc 利用龙格-库塔法求解朗之万方程1. 待解问题布朗颗粒是非常微小的宏观颗粒,其直径的典型大小为10-710-6m.颗粒不断受到液体介质分子的碰撞,在任一瞬间,一个颗 ...

最新文章

  1. 2016 CVPR 德州仪器 ADAS Tutorial
  2. SpringSecurity关闭csrf拦截
  3. mysql share mode_mysql锁:mysql lock in share mode 和 select for update
  4. 服务器修改地址,服务器修改管理地址
  5. 微信小程序销毁某一注册函数_微信小程序 生命周期函数详解
  6. ViewPager与Tab结合使用
  7. 分布式搜索elasticsearch 索引文档的增删改查 入门
  8. POJ 3468 线段树+lazy标记
  9. yylabel支持html ios,iOS简单高性能标签TagView(巧用YYLabel)
  10. 浅谈通过抢注域名获取好域名的小技巧
  11. 学mysql后的收获_数据库课程学习的收获和心得体会
  12. cdr怎么抠图轮廓线条_CDR怎么抠图?CorelDRAW快速抠图方法
  13. day29 | 黑马程序员Java全程笔记 | 第二阶段MySQL高级事务-索引-视图-触发器-存储过程
  14. 华为MatePad Pro和华为MatePad区别
  15. 只有两种直播:淘宝直播和其它直播
  16. knex.js中文文档
  17. pox.xml有些包下载不了的原因
  18. 通信里 星座图 到底是什么
  19. 西电计算机考研833试题,西电考研辅导班:西安电子科技大学833“计算机学科专业基础综合”复习参考提纲...
  20. 拓扑排序在实际项目中应用

热门文章

  1. 合成PDF(多文件变一文件、多页变一页)
  2. VoIP服务器Asterisk安装及部署
  3. Windows上搭建SFTP服务器
  4. 游戏开发中的脚本语言
  5. SM3算法 (python)
  6. 支持免费的PCB计算机辅助设计软件eagle
  7. 高数下学习笔记——思维导图
  8. MT6757_MT6763处理器资料分享
  9. python怎么解微分方程组_python能解微分方程吗
  10. 访问共享打印机报错:0x00000bcb