四阶Runge-Kutta法用于求常微分方程的较高精度的数值解。在高等数学里是用解析法来求解常微分方程问题,如下

y′(x)=f(x,y),a≤x≤by'(x)=f(x,y),a\leq x\leq by′(x)=f(x,y),a≤x≤b
y(a)=y0y(a)=y_0y(a)=y0​

而在计算方法里,只要常微分方程解存在并唯一,即可求解数值解:
就是求y(x)y(x)y(x)在区间[a,b]中一系列离散点上y(xk)y(x_k)y(xk​)的近似值yky_kyk​.
具体步骤是,从已知条件y(a)=y0y(a)=y_0y(a)=y0​出发,先求y1y_1y1​,在求y2y_2y2​,以此类推直至求出yny_nyn​.这种顺着节点的排列顺序一步步向前步进的方法称为步进法。步进法又有单步法和多步法。

欧拉公式

首先将求导区间[a,b]分为n等分,b−an=h\frac{b-a}{n}=hnb−a​=h,则xi=a+ihx_i=a+ihxi​=a+ih
欧拉公式分为前进欧拉公式和后退欧拉公式

欧拉公式是基于数值微分的两点公式计算而来的,前进欧拉公式是利用了前进差分公式,后退欧拉公式使用了向后差分的公式。而且利用后退欧拉公式得到的是隐函数,还需要再解方程。

所以通常情况下,我们要采用显示和隐示结合起来,即通过显示求出的值带入隐式中,求得最终的结果。

y‾=yk−1+hf(xk−1,yk−1)\overline{y}=y_{k-1}+hf(x_{k-1},y_{k-1})y​=yk−1​+hf(xk−1​,yk−1​),预测值
yk=yk−1+hf(xk,y‾)y_k=y_{k-1}+hf(x_k,\overline{y})yk​=yk−1​+hf(xk​,y​),校正值
y(x0)=y0,k=1,2,....y(x_0)=y_0,k=1,2,....y(x0​)=y0​,k=1,2,....

改进的欧拉法具有二阶精度

对于最开始提到的常微分方程的解法,也可以表示为积分的形式

∫xk−1xky′(x)dx=y(xk)−y(xk−1)\int_{x_{k-1}}^{x_k}y'(x)dx=y(x_k)-y(x_{k-1})∫xk−1​xk​​y′(x)dx=y(xk​)−y(xk−1​)
y(xk)=y(xk−1)+∫xk−1xkf(x,y(x))dxy(x_k)=y(x_{k-1})+\int_{x_{k-1}}^{x_k}f(x,y(x))dxy(xk​)=y(xk−1​)+∫xk−1​xk​​f(x,y(x))dx

而对于积分可以利用梯形法来求,然后因为梯形法是隐式的所以我们需要显化,就如同上述的欧拉法建立预测校正系统。

Runge-Kutta法

上述的改进欧拉法为二阶的R-K法,同时可对Simpson公式进行显化得到更高精度的R-k法。

四阶的R-K法

题目:求y′(x)=12(−y+x2+4x−1)y'(x)=\frac{1}{2}(-y+x^2+4x-1)y′(x)=21​(−y+x2+4x−1),y(0)=0y(0)=0y(0)=0,x属于[0.0.5]区间内。求y(x)在xi=ih(h=0.05)处的数值解,并于解析解进行比较

下面为python代码,根据公式进行简单计算即可

import numpy as np
import math
import matplotlib.pyplot as plt
plt.style.use("seaborn-whitegrid")def F(x,y):#定义函数tem=0.5*(-y+x**2+4*x-1)return tem
n=10
h=0.5/n
y=np.zeros(n+1,dtype='float32')#这样定义可以用y[i]访问,若定义为(1,n),则要用y[0][i]访问,因为维度问题
x=np.arange(0,0.5+0.05,0.05,dtype='float32')# test=np.zeros((1,8))
# test[0][1]#right
# test[1]#wrong
for i in range(1,n+1,1):K1=F(x[i-1],y[i-1])K2=F(x[i-1]+h/2,y[i-1]+(h*K1)/2)K3=F(x[i-1]+h/2,y[i-1]+(h*K2)/2)K4=F(x[i-1]+h,y[i-1]+h*K3)y[i]=y[i-1]+h*(K1+2*K2+2*K3+K4)/6
real=np.zeros(n+1)
for i in range(1,n+1,1):real[i]=math.exp(-x[i]/2)+x[i]**2-1
error=abs(real-y)
plt.figure(1)
# plt.plot(x,real,'b')
# plt.plot(x,y,'r--')#不需要hold on命令
plt.plot(x,error)
plt.show()
#基本上吻合

图片解析解与数值解的曲线图,几乎吻合

画出误差图:

可见四阶的R-K精度比较高的

【计算方法笔记】四阶Runge-Kutta法相关推荐

  1. 第四周读书笔记《构建之法》

    第四周读书笔记<构建之法> 第四周读书笔记<构建之法> 沈三景 PB15061249 软件工程 读书笔记 前言 本周接着读了构建之法(上周读了<程序员的修炼之道>) ...

  2. 《统计学习方法》读书笔记——朴素贝叶斯法(公式推导+代码实现)

    传送门 <统计学习方法>读书笔记--机器学习常用评价指标 <统计学习方法>读书笔记--感知机(原理+代码实现) <统计学习方法>读书笔记--K近邻法(原理+代码实现 ...

  3. 四阶魔方玩法总结V1.0

    四阶魔方玩法总结V1.0 1.引言 今写此文,我主要是为了方便自己再次玩其魔方的时候,可以快速的想起,避免又从头学起.毕竟自己学会的,理解的,写出来的东西,再次玩魔方的时候,仅仅是回顾和追忆的过程,不 ...

  4. 4阶显式Runge-Kutta法解常微分方程的通用程序--python实现

    对于常微分方程,RK方法速度快,精度高,代码简单,是最为实用的数值方法之一.RK方法很简单,类似梯形法,RK法也是根据前一步点的值推算后一步点.具体算法见以下链接 https://wenku.baid ...

  5. 方根法公式_仓储管理笔记之库存分析法:ABC分析法、区域合并法......

    导读 国内有庞大的仓储物流从业人员队伍(根据中国物流与采购联合会的调查,2016年底我国物流从业人员5012万,是人员增速最快的行业),很多人只是想深入了解仓库从无序到有序,从源头开始应该如何管理.如 ...

  6. 学习笔记 | Heckman两阶段法介绍

    最近看的两篇VC文献,都是有使用到Heckman两阶段法,所以就借此机会系统学习了Heckman两阶段法 本篇内容主要学习了如下文章: 1 CJAR的带你了解Heckman两步法 2 计量经济圈的He ...

  7. 多变量微积分笔记6——拉格朗日乘数法

    基本的拉格朗日乘子法(又称为拉格朗日乘数法),就是求函数 f(x1,x2,...) 在 g(x1,x2,...)=C 的约束条件下的极值的方法.其主要思想是引入一个新的参数 λ (即拉格朗日乘子),将 ...

  8. 【学习笔记】费曼学习法

    写在前面: 个人学习[费曼学习法]的过程的总结 目录 学习的本质 运动类处理 思考类处理 知识的可加性 记忆的反复性 学习的反复性 学习需要方法 费曼学习法 学习的本质 此处的处理指思考类处理 获得有 ...

  9. java学习笔记之折半查找法(二分法)

    2019独角兽企业重金招聘Python工程师标准>>> package Xhe.com; //折半查找法(二分法) public class halfSearch {     pub ...

最新文章

  1. 创建一个类 new 与 不加new 有什么区别?
  2. python数组的切片操作_对Python 数组的切片操作
  3. 对未来计算机的畅想初中英语,初中英语期中考试,作文停电一小时,在北京……在上海……在威海…….doc...
  4. Etcd集群的介绍和选主应用
  5. linux 混杂模式 收包,Linux下使用混杂模式抓包(2)
  6. No space left on device 磁盘空间提示不足解决办法
  7. (Abstract Factory)抽象工厂模式的Java实现
  8. 常用的远程连接Linux工具有哪些??
  9. 如何用python下载图片_Python之如何优雅的下载一堆小哥哥图片
  10. 2022-2028全球针织捆包网行业调研及趋势分析报告
  11. Python_day01-----day07
  12. phpstorm 报 expecting statement
  13. 字典遍历时不能修改字典元素
  14. 各大程序员兼职平台靠谱嘛?这一篇文章就够了
  15. 微信小程序里面的单步调试和变量查看
  16. 接口转换器故障与解决办法
  17. 时间轴:确保ADAM电影如期进行
  18. Discuz论坛系统
  19. linux平台性能监控系统,如何使用top命令监控Linux系统性能
  20. win下禁用光标闪烁 记录

热门文章

  1. 2017 ACM Arabella Collegiate Programming Contest A. Sherlock Bones GYM101350A
  2. 微信小程序将组件中的文字放置在正中间的方法
  3. 【代理工具使用必备知识汇总】:vpn、socks5、代理客户端使用
  4. Python编程基础 第七章 编程练习 用户从键盘上输入一个字符串,如果该字符串的内容不是有效的数值,则输出invalid;如果是有效的数值,再判断其是否是整数,如果是整数则输出yes,否则输出no。
  5. 走近“领域特定语言”
  6. 中国首份国际贸易企业信息化发展白皮书发布,小满科技后劲十足
  7. 【大数据开发】SparkSQL——Spark对接Hive、Row类、SparkSQL函数、UDF函数(用户自定义函数)、UDAF函数、性能调优、SparkSQL解决数据倾斜
  8. java课程 数独 文库_通俗易懂的数独算法(java版)
  9. pyqt win32发送QQ消息
  10. RISC-V Debug Introduction