目录

  • 1/ 欧拉法(Euler Method)[^2]
  • 2/ 龙格-库塔法(Runge-Kutta Method)
    • 2.1/ 四阶 Runge-Kutta 方法
    • 2.2/ Runge-Kutta 的一般形式
  • 参考

常微分方程组的求解比较麻烦,通常在计算机上使用数值计算的方式去进行。

假设一阶常微分方程组(ODEs)由下式给出

dxdt=fi(x),i=1,2,…,n\frac{dx}{dt}=f_i(x),~i=1,2,\dots,n dtdx​=fi​(x), i=1,2,…,n
其中 xxx 是一个变量构成的向量 x=[x1,x2,…,xn]x=[x_1,x_2,\dots,x_n]x=[x1​,x2​,…,xn​]。任意高阶微分方程都可以通过变量替换变成一阶微分方程组。

求解 ODE 的数值方法有很多种:欧拉法(Euler)、龙格-库塔法(Runge-Kutta)、Adams 线性多步法、Gear 法等 1

1/ 欧拉法(Euler Method)2

在数学和计算科学中,欧拉方法(也叫前向欧拉方法)是一种用于求解给定初值的 ODE 的一阶数值过程,是对常微分方程进行数值积分的最基本的显式方法,也是最简单的 Runge-Kutta 方法。

欧拉方法以列昂哈德·欧拉(Leonhard Euler)的名字命名,在他的《计算积分学》(1768-1870年出版)一书中首次提出。

欧拉方法是一阶方法,它的局部误差(每步误差)与步长的平方成正比,全局误差(给定时间的误差)与步长成正比。 欧拉方法通常作为构造更复杂方法的基础,例如预测器-校正器(Predictor-Corrector)方法。

假设有一个 ODE:
y′(t)=f(t,y(t)),y(t0)=y0,y^{\prime}(t)=f(t,y(t)),\quad y(t_0)=y_0, y′(t)=f(t,y(t)),y(t0​)=y0​,
尽管曲线是未知的,但是起点是已知的。根据微分方程,可以计算出 A0A_0A0​ 点的斜率,因此可以计算出切线,我们根据该切线走一小步到 A1A_1A1​ 点。然后再根据 A1A_1A1​ 点得到该位置的斜率,根据这个斜率走一小步去下一个点 A2A_2A2​…

如此反复,如果步长取足够的小,那么得到的结果将会很接近确切解。

Euler 方法的迭代公式为:
yn+1=yn+hf(tn,yn)tn+1=tn+h\begin{aligned} y_{n+1}&=y_n+hf(t_n,y_n)\\ t_{n+1}&=t_n+h \end{aligned} yn+1​tn+1​​=yn​+hf(tn​,yn​)=tn​+h​

2/ 龙格-库塔法(Runge-Kutta Method)

2.1/ 四阶 Runge-Kutta 方法

在数值分析中,Runge-Kutta 方法是一组隐式和显式迭代方法,其中包括欧拉方法,用于时间离散化中的常微分方程的近似解。由国数学家卡尔 • 朗格(Carl Runge)和威廉 • 库塔(Wilhelm Kutta)于 1900 年左右开发。

设一个初值问题如下定义:
dydt=y′(t)=f(t,y),y(t0)=y0\frac{dy}{dt}=y^{\prime}(t)=f(t,y),\quad y(t_0)=y_0 dtdy​=y′(t)=f(t,y),y(t0​)=y0​
其中 yyy 是一个关于时间 ttt 的未知函数(标量或向量),也是需要近似的函数。已知 y′(t)y^{\prime}(t)y′(t) 是关于 ttt 和 yyy 自身的函数,在时间 t0t_0t0​ 对应的 yyy 值为 y0y_0y0​。 函数 fff 和初始条件 t0,y0t_0,y_0t0​,y0​ 已经给出。选择一个步长 h>0h>0h>0 并且对于 n=0,1,2,3,…,n=0,1,2,3,\dots,n=0,1,2,3,…, 定义:
yn+1=yn+16h(k1+2k2+2k3+k4)tn+1=tn+h\begin{aligned} y_{n+1}&=y_{n}+\frac{1}{6} h\left(k_{1}+2 k_{2}+2 k_{3}+k_{4}\right)\\ t_{n+1}&=t_{n}+h \end{aligned} yn+1​tn+1​​=yn​+61​h(k1​+2k2​+2k3​+k4​)=tn​+h​
其中,
k1=f(tn,yn),k2=f(tn+h2,yn+hk12),k3=f(tn+h2,yn+hk22),k4=f(tn+h,yn+hk3).\begin{aligned} k_{1}&=f\left(t_{n}, y_{n}\right),\\ k_{2}&=f\left(t_{n}+\frac{h}{2}, y_{n}+h \frac{k_{1}}{2}\right),\\ k_{3}&=f\left(t_{n}+\frac{h}{2}, y_{n}+h \frac{k_{2}}{2}\right),\\ k_{4}&=f\left(t_{n}+h, y_{n}+h k_{3}\right). \end{aligned} k1​k2​k3​k4​​=f(tn​,yn​),=f(tn​+2h​,yn​+h2k1​​),=f(tn​+2h​,yn​+h2k2​​),=f(tn​+h,yn​+hk3​).​

在不同的资料中可能会有不同的但是等价的公式表示。

其中 yn+1y_{n+1}yn+1​ 为 y(tn+1)y(t_{n+1})y(tn+1​) 的四阶 Runge-Kutta (RK4)近似,下一个值 (yn+1)(y_{n+1})(yn+1​) 由当前值 (yn)(y_n)(yn​) 加上四个增量的加权平均确定,每个增量为间隔大小 hhh 和微分方程右侧的函数 fff 指定的估计斜率的乘积。

  • k1k_1k1​ 是间隔开始处的斜率,依赖于 yyy(这第一步是欧拉法);
  • k2k_2k2​ 是间隔中点处的斜率,依赖于 yyy 和 k1k_1k1​;
  • k3k_3k3​ 依旧是间隔中点处的斜率,只是依赖于 yyy 和 k2k_2k2​ 了;
  • k4k_4k4​ 是间隔终点处的斜率,依赖于 yyy 和 k3k_3k3​.

RK4 是四阶的方法,意味着局部截断误差的阶数为 O(h5)\mathcal{O}(h^5)O(h5),总积累误差的阶数为 O(h4)\mathcal{O}(h^4)O(h4).

在实际应用的时候,特别是在物理上,函数 fff 与 ttt 无关,即所谓的自治系统(Autonomous system)或者时不变系统,它们的增量不会被计算,也不会传递给函数 fff,而仅仅使用 tn+1t_{n+1}tn+1​ 的最终公式。

2.2/ Runge-Kutta 的一般形式

上面介绍的是 RK4,它只是 Runge-Kutta 的其中一种。实际上,Runge-Kutta 有很多种,如果把它写成一般的形式,有
yn+1=yn+h∑j=1sbzkiy_{n+1}=y_{n}+h \sum_{j=1}^{s} b_{\mathbf{z}} k_{i} yn+1​=yn​+hj=1∑s​bz​ki​
其中
k1=f(tn,yn)k2=f(tn+c2h,yn+h(a21k1)),k3=f(tn+c3h,yn+h(a31k1+a32k2)),⋮ks=f(tn+csh,yn+h(as1k1+as2k2+⋯+as,s−1ks−1)).\begin{aligned} k_{1} &=f\left(t_{n}, y_{n}\right) \\ k_{2} &=f\left(t_{n}+c_{2} h, y_{n}+h\left(a_{21} k_{1}\right)\right), \\ k_{3} &=f\left(t_{n}+c_{3} h, y_{n}+h\left(a_{31} k_{1}+a_{32} k_{2}\right)\right), \\ & \vdots \\ k_{s} &=f\left(t_{n}+c_{s} h, y_{n}+h\left(a_{s 1} k_{1}+a_{s 2} k_{2}+\cdots+a_{s, s-1} k_{s-1}\right)\right) . \end{aligned} k1​k2​k3​ks​​=f(tn​,yn​)=f(tn​+c2​h,yn​+h(a21​k1​)),=f(tn​+c3​h,yn​+h(a31​k1​+a32​k2​)),⋮=f(tn​+cs​h,yn​+h(as1​k1​+as2​k2​+⋯+as,s−1​ks−1​)).​
从公式中可以知道,如果要指定某个特定的方法,就需要提供一个整数 sss(代表级数的项数),还有系数 aij,for 1≤j<i≤sa_{ij},~\text{for }1\le j<i\le saij​, for 1≤j<i≤s, bi,for i=1,2,…,sb_i,~\text{for }i=1,2,\dots,sbi​, for i=1,2,…,s 和 cifor i=2,3,…,sc_i~\text{for }i=2,3,\dots,sci​ for i=2,3,…,s.

其中矩阵 [aij][a_{ij}][aij​] 称为 Runge-Kutta 矩阵,而 bib_ibi​ 和 cic_ici​ 是权重和节点。

Taylor 级数展开式表明,Runge-Kutta 方法是一致的,当且仅当
∑i=1sbi=1\sum_{i=1}^s b_i=1 i=1∑s​bi​=1

参考


  1. 知乎:常微分法数值计算方法 ↩︎

  2. Wikipedia: Euler method ↩︎

常微分方程(ODE)的数值计算方法相关推荐

  1. 计算方法(六):常微分方程初值问题的数值解法

    文章目录 常微分方程初值问题的数值解法 欧拉(Euler)方法与改进欧拉方法 欧拉方法 欧拉公式的局部截断误差与精度分析 改进欧拉方法 龙格-库塔(Runge-Kutta)法 构造原理 经典龙格-库塔 ...

  2. 数值计算方法在计算机的应用,数值计算方法在计算机科学中的应用和误差序列实验推荐.doc...

    数值计算方法在计算机科学中的应用和误差序列实验推荐 数值计算方法在计算机科学中的应用和误差序列实验 [摘要]计算数学也叫做数值计算方法或数值分析.主要内容包括代数方程.线性代数方程组.微分方程的数值解 ...

  3. matlab的数值计算方法,数值计算方法中的一些常用算法的Matlab源码

    数值计算方法中的一些常用算法的Matlab源码,这些程序都是原创,传上来仅供大家参考,不足之处请大家指正,切勿做其它用途-- 说明:这些程序都是脚本函数,不可直接运行,需要创建函数m文件,保存时文件名 ...

  4. 计算物理学(数值分析)上机实验答案5、常微分方程初值问题的数值解法

    实验五.常微分方程初值问题的数值解法 ​ 常微分方程的求解问题在实践中经常遇到,因此研究常微分方程的数值解法就很有必要.欧拉方法是最简单.最基本的方法,利用差商代替微商,就可得到一系列欧拉公式.这些公 ...

  5. 数值计算方法-算法设计及其MATLAB实现

    数值计算方法是一种用于解决数学问题的方法,涉及到数值近似.数值逼近.数值积分.数值微分等等.算法设计是数值计算方法的核心,它包括了数值方法的数学原理和计算机实现的算法,能够有效地解决各种数学问题. M ...

  6. 数值计算方法上机c语言编程,数值计算方法上机实验报告.doc-资源下载在线文库www.lddoc.cn...

    <数值计算方法>上机实验报告.doc 华 北 电 力 大 学实 验 报 告实验名称 数值计算方法上机实验 课程名称 数值计算方法 专业班级电力实 08 学生姓名李超然学 号20080100 ...

  7. 数值计算方法与c语言工程函数库 pdf,数值计算方法和算法.PDF

    数值计算方法和算法 张韵华 奚梅成 陈效群 编著 2 0 0 2 内 容 简 介 本书介绍各种常用的数值计算方法,简述计算方法的计算对象.计算原 理和计算步骤,给出部分数值方法的算法描述,并附有一些用 ...

  8. 数值计算方法与c语言工程函数库 pdf,数值计算方法与C语言工程函数库

    目 录 第一章 绪论 1.1计算机与计算方法 1.2数值计算的特点及本书的特色 1.3误差.稳定性和收敛性 1.4C语言与数值计算方法 第二章 线性代数方程组的数值解法 2.1引言 2.2高斯-约当消 ...

  9. 数值计算方法计算机,数值计算方法

    常见"问题" 1.如何认识数值计算课程?它与数学学科的其它分支以及计算机的关系如何? 2.何为算法?如何判断数值算法的优劣? 3.数值计算方法中最关注哪些误差?为什么? 4.什么是 ...

最新文章

  1. JSON http://www.cnblogs.com/haippy/archive/2012/05/20/2509329.html
  2. KWrite 和 Kate 在 Linux 上的应用
  3. 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践...
  4. 如何查询当前手机的cpu架构,so库导入工程又出异常了?
  5. 郑州网络推广浅谈网站首页在优化时都需要注意哪些细节呢?
  6. Android 系统中 Location Service 的实现与架构
  7. bootstrap -- 一个标签中,同时有 col-xs , col-sm , col-md , col-lg
  8. es6添加删除class_ES6中常用的10个新特性讲解
  9. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用...
  10. feign直接走熔断_121 SpringCloud之服务熔断、隔离、Hystrix、 Dashboard和turbine
  11. hyperscan cmake .. 报错
  12. 移动APP切图术语解读:什么是@1x @2x和@3x
  13. 怎样使表格中的数字自动计算机,直观:Excel电子表格一次打印入场数据-Excel如何将数字设置为每次打印时自动递增...
  14. python出现SyntaxError: Non-ASCII character '\xe6' in file错误
  15. 02 QEMU默认支持的所有开发板、芯片列表
  16. 正确安装破解后,打开Matlab R2018a 报错License Manager Error-8
  17. 使用cpolar配置内网访问(内网穿透)教程(超详细,简单)
  18. b站网页版改html,网页版b站怎么设置弹幕?网页bilibili怎么设置停止播放和调倍速?...
  19. 使Twitter数据对百事可乐和可口可乐进行客户情感分析
  20. 比尔盖茨10句至理名言

热门文章

  1. 让AI玩俄罗斯方块 UCL ENGF2 CA4.1 作业
  2. java Eclipes配置黑色框架
  3. OSG读取obj模型坐标变化的问题
  4. cors数据类型_详解如何解决CORS账号连接RTK无法获得固定解的问题
  5. navicat创建oracle数据表,使用navicat创建Oracle数据库
  6. 创建一个vue-cli项目到运行的完整流程
  7. PHONEGAP BUILD
  8. JAVA如何对字符串去重
  9. 5G接入网架构及应用场景
  10. Oledcomm——全球5G/LiFi技术领航者