【计算方法笔记】四阶Runge-Kutta法
四阶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−1xky′(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−1xkf(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法相关推荐
- 第四周读书笔记《构建之法》
第四周读书笔记<构建之法> 第四周读书笔记<构建之法> 沈三景 PB15061249 软件工程 读书笔记 前言 本周接着读了构建之法(上周读了<程序员的修炼之道>) ...
- 《统计学习方法》读书笔记——朴素贝叶斯法(公式推导+代码实现)
传送门 <统计学习方法>读书笔记--机器学习常用评价指标 <统计学习方法>读书笔记--感知机(原理+代码实现) <统计学习方法>读书笔记--K近邻法(原理+代码实现 ...
- 四阶魔方玩法总结V1.0
四阶魔方玩法总结V1.0 1.引言 今写此文,我主要是为了方便自己再次玩其魔方的时候,可以快速的想起,避免又从头学起.毕竟自己学会的,理解的,写出来的东西,再次玩魔方的时候,仅仅是回顾和追忆的过程,不 ...
- 4阶显式Runge-Kutta法解常微分方程的通用程序--python实现
对于常微分方程,RK方法速度快,精度高,代码简单,是最为实用的数值方法之一.RK方法很简单,类似梯形法,RK法也是根据前一步点的值推算后一步点.具体算法见以下链接 https://wenku.baid ...
- 方根法公式_仓储管理笔记之库存分析法:ABC分析法、区域合并法......
导读 国内有庞大的仓储物流从业人员队伍(根据中国物流与采购联合会的调查,2016年底我国物流从业人员5012万,是人员增速最快的行业),很多人只是想深入了解仓库从无序到有序,从源头开始应该如何管理.如 ...
- 学习笔记 | Heckman两阶段法介绍
最近看的两篇VC文献,都是有使用到Heckman两阶段法,所以就借此机会系统学习了Heckman两阶段法 本篇内容主要学习了如下文章: 1 CJAR的带你了解Heckman两步法 2 计量经济圈的He ...
- 多变量微积分笔记6——拉格朗日乘数法
基本的拉格朗日乘子法(又称为拉格朗日乘数法),就是求函数 f(x1,x2,...) 在 g(x1,x2,...)=C 的约束条件下的极值的方法.其主要思想是引入一个新的参数 λ (即拉格朗日乘子),将 ...
- 【学习笔记】费曼学习法
写在前面: 个人学习[费曼学习法]的过程的总结 目录 学习的本质 运动类处理 思考类处理 知识的可加性 记忆的反复性 学习的反复性 学习需要方法 费曼学习法 学习的本质 此处的处理指思考类处理 获得有 ...
- java学习笔记之折半查找法(二分法)
2019独角兽企业重金招聘Python工程师标准>>> package Xhe.com; //折半查找法(二分法) public class halfSearch { pub ...
最新文章
- 创建一个类 new 与 不加new 有什么区别?
- python数组的切片操作_对Python 数组的切片操作
- 对未来计算机的畅想初中英语,初中英语期中考试,作文停电一小时,在北京……在上海……在威海…….doc...
- Etcd集群的介绍和选主应用
- linux 混杂模式 收包,Linux下使用混杂模式抓包(2)
- No space left on device 磁盘空间提示不足解决办法
- (Abstract Factory)抽象工厂模式的Java实现
- 常用的远程连接Linux工具有哪些??
- 如何用python下载图片_Python之如何优雅的下载一堆小哥哥图片
- 2022-2028全球针织捆包网行业调研及趋势分析报告
- Python_day01-----day07
- phpstorm 报 expecting statement
- 字典遍历时不能修改字典元素
- 各大程序员兼职平台靠谱嘛?这一篇文章就够了
- 微信小程序里面的单步调试和变量查看
- 接口转换器故障与解决办法
- 时间轴:确保ADAM电影如期进行
- Discuz论坛系统
- linux平台性能监控系统,如何使用top命令监控Linux系统性能
- win下禁用光标闪烁 记录
热门文章
- 2017 ACM Arabella Collegiate Programming Contest A. Sherlock Bones GYM101350A
- 微信小程序将组件中的文字放置在正中间的方法
- 【代理工具使用必备知识汇总】:vpn、socks5、代理客户端使用
- Python编程基础 第七章 编程练习 用户从键盘上输入一个字符串,如果该字符串的内容不是有效的数值,则输出invalid;如果是有效的数值,再判断其是否是整数,如果是整数则输出yes,否则输出no。
- 走近“领域特定语言”
- 中国首份国际贸易企业信息化发展白皮书发布,小满科技后劲十足
- 【大数据开发】SparkSQL——Spark对接Hive、Row类、SparkSQL函数、UDF函数(用户自定义函数)、UDAF函数、性能调优、SparkSQL解决数据倾斜
- java课程 数独 文库_通俗易懂的数独算法(java版)
- pyqt win32发送QQ消息
- RISC-V Debug Introduction