四阶龙格库塔法的基本思想_数值常微分方程-欧拉法与龙格-库塔法

5f7d210d7aba89911d413d7a6321380a.png

大三时候在跳蚤市场闲逛,从一位数学院的学长那里买了一些闲书,最近翻出来刚好有李荣华、刘播老师的《微分方程数值解法》和王仁宏老师的《数值逼近》,结合周善贵老师的《计算物理》课程,整理一下笔记。

本文整理常微分方程数值求解的欧拉法与龙格-库塔法。

一般地,动力学系统的时间演化可以用常微分方程的初值问题来描述,例如设一维简谐运动的回复力:

,有则运动方程:
。令
,可以将二阶微分方程转化为一阶微分方程组:

因此本文主要整理一阶常微分方程初值问题的数值解法。

一阶常微分方程初值问题

在区域
上连续,对于一个给定的常微分方程
及初值
,求解
。为了保证解
存在、唯一且连续依赖初值
,要求
满足Lipschitz条件:

存在常数L,使得

对所有
成立。

假设

总满足上述条件。常用的近似解法有级数解法等近似解析方法,以及下文整理的数值方法:欧拉法与龙格-库塔法。

欧拉法

将区间

作N等分,每一小区间长度
称为步长,
称为节点。根据初值
,代入微分方程可直接解出
的导数值

推导

1、根据泰勒展开式:

略去二阶小量,得:

以此类推,得到递推公式:

2、数值积分推导

可得:
,使用左矩形积分得:

以此类推,可得到:

为了提高精度,可以使用梯形积分代替矩形积分,即:

以此类推,得到改进的欧拉法:

Python计算实例

为例,其精确解为
,使用欧拉法求解的Python代码如下:
import math
from matplotlib import pyplot as pltt_0 = 0
y_0 = 1
tau = 0.1
i = 1
solve = []
Euler = []
t = []
while i < 100:if i == 1:y_n = y_0t_n = t_0Euler.append(y_n)solve.append(math.exp(t_n))t.append(t_n)func = y_ny_n = y_n + tau * funct_n = t_n + taui += 1plt.plot(t, Euler, c='green', label=' Euler method')
plt.plot(t, solve, c='red', label=' accuracy')
plt.fill_between(t, solve, Euler, facecolor='blue', alpha=0.2)
plt.title('Euler method', fontsize=19)
plt.xlabel('t', fontsize=19)
plt.ylabel('y', fontsize=19)
plt.legend()
plt.show()

cda8ba226be41aa65c6090c27e6287bc.png

作图可以看到,当迭代步数较多后,欧拉法的结果逐渐落后于精确指数解的增长速度。下面分析欧拉法的误差来源。

中,略去了高阶小量
,因此在每一步的递推中,都有局部截断误差
,其阶为

在计算中,我们更关心精确解和数值解之间的误差

,称为整体误差,其满足

根据Lipschitz条件,可得:

,可得:

局部截断误差

的二阶量,设
,得:
,整体误差是
的一阶量。同理可得,改进的欧拉法局部截断误差
的三阶量
,整体误差是
的二阶量

稳定性分析

如果计算的初值不能精确给定,例如存在测量、舍入误差等,在计算过程中,每一步传递的误差连续依赖于初始误差,则称算法稳定,否则该算法不稳定。

对于不同的初值

,有

两式相减,得:

根据Lipschitz条件,可得:

连续依赖于初始误差,欧拉法稳定。同理,改进的欧拉法也稳定。

龙格-库塔法

龙格库塔法的主要思想:在

点的附近选取一些特定的点,然后把这些点的函数值进行线性组合,使用组合值代替泰勒展开中
点的导数值。

泰勒展开:

,根据多元函数求导法则有:

以此类推,可以得到:

同时,我们可以写出泰勒展开的形式解:

其中:

通项为:

基本思路是,利用当前点的函数值

可以计算出
,然后引入参数
和步长
可以计算出
,之后使用
和步长
计算
,以此类推,直到

现在把

展开:

代入得:

代入
可得:

与泰勒展开式

相比较,可知:

2个方程有3个未知数,因此有无穷多个解,可采用

,则:

,可以改写为:

此即为二阶龙格-库塔法。

与上一节的欧拉法公式对比:

,因此二阶龙格-库塔法取参数
时,即为改进的欧拉法。

Python计算实例

仍以

为例,其精确解为
,使用二阶龙格-库塔法求解的Python代码如下:
import math
from matplotlib import pyplot as pltt_0 = 0
y_0 = 1
z_0 = 1
tau = 0.1
i = 1
j = 1
solve = []
Euler = []
R_K = []
t = []
while i < 100:if i == 1:y_n = y_0t_n = t_0R_K.append(y_n)solve.append(math.exp(t_n))t.append(t_n)func_n = y_nfunc_m = y_n + tau * func_ny_n = y_n + 0.5 * tau * (func_n + func_m)t_n = t_n + taui += 1
t = []
while j < 100:if j == 1:z_n = z_0t_n = t_0Euler.append(z_n)t.append(t_n)func = z_nz_n = z_n + tau * funct_n = t_n + tauj += 1plt.scatter(t, R_K, marker='^', c='blue', s=70, label=' R-K method')
plt.plot(t, Euler, c='green', label=' Euler method')
plt.plot(t, solve, c='red', label=' accuracy')
plt.fill_between(t, solve, Euler, facecolor='yellow', alpha=0.2)
plt.title('Euler method & R-K method', fontsize=19)
plt.xlabel('t', fontsize=19)
plt.ylabel('y', fontsize=19)
plt.legend()
plt.show()

f17a23f6060521c23508b39b23f1537e.png

黄色部分表示数值解和精确解的偏离,可以看到,二阶龙格-库塔法(改进的欧拉法)精确度得到了很大的提升。

二阶龙格-库塔法中,泰勒展开到了

阶,通过与泰勒展开系数进行对比,可以得到含3个未知数的2个方程。依次类推,如果泰勒展开到了
阶,对比
可以得到
阶龙格-库塔法。常用经典四阶龙格-库塔法:

Reference:

1、周善贵,《计算物理》课程讲义

2、李荣华,刘播,《微分方程数值解法》

3、王仁宏,《数值逼近》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OC中的类

OC中类 OC中类的定义 在Xcode中创建一个新的类&#xff0c;会自动给你生成两个文件一个是.h另外一个是.m文件,你新创建的类默认继承了NSObject类&#xff0c;因为有一些方法都需要基类中的方法。比如alloc分配内存 OC中用来描述类的使用interface 类名&#xff1a;父类来进行…

装配组件_基于Haption力反馈系统的交互式装配仿真

在一个新工业产品的设计过程中&#xff0c;装配规划是非常重要的任务。如果规划不好将造成很大的资金浪费&#xff0c;致使组件不能正确地集成。例如典型问题&#xff1a;移动一个组件到指定位置但空间不足&#xff1b;使用工具够不到螺丝&#xff1b;操作者没有足够的视域以保…

OC中的基本容器和基本数据类型

基本数据类型 NSRange 是一个结构体&#xff0c;里面有两个数据成员数据类型都为NSUInteger 就是c语言中的无符号整形&#xff0c;一个是location表示集合的起始地址&#xff0c;另外一个变量是length表示从起始地址开始算多少个元素。 NSRange的三种创建方式 //1.NSRange r…

python程序开发总结_python开发总结

两本不错的书&#xff1a;《Python参考手册》&#xff1a;对Python各个标准模块&#xff0c;特性介绍的比较详细。《Python核心编程》&#xff1a;介绍的比较深入&#xff0c;关键是&#xff0c;对Python很多高级特性都有介绍。一个开源代码&#xff1a;openstack&#xff0c;关…

Centos7通过yum安装jsoncpp库

拒绝下载软件包 一堆网上下载安装包&#xff0c;为了编译暗转包又下载插件&#xff0c;是真麻烦 看看有没有jsoncpp的相关库 $ yum list | grep jsoncpp-devel然后执行这两句&#xff0c;就完了 yum install jsoncpp.x86_64 yum install jsoncpp.devel.x86-64多简单

作为唯一索引_Mysql什么情况下不走索引?

本文基于Mysql5.7版本和InnoDB存储引擎。1、InnoDB索引组织表在InnoDB引擎中&#xff0c;表都是按照主键顺序组织存放的&#xff0c;这种存放方式的表称为索引组织表。InnoDB存储引擎中的表&#xff0c;都有主键&#xff0c;如果没有显式声明主键&#xff0c;则采取以下措施&am…

python捕获全局异常统一管理_python中如何用sys.excepthook来对全局异常进行捕获、显示及输出到error日志中...

使用sys.excepthook函数进行全局异常的获取。1. 使用MessageDialog实现异常显示&#xff1b;2. 使用logger把捕获的异常信息输出到日志中&#xff1b;步骤&#xff1a;定义异常处理函数&#xff0c; 并使用该函来替换掉系统的内置处理函数&#xff1b;对于threading.py的异常捕…

r语言系统计算上是奇异的_R语言实现并行计算

Python作为多线程的编程语言在并行方面相对于R语言有很大的优势&#xff0c;然而作为占据统计分析一席之地的R语言自然不能没有并行计算的助力。那么我们来看下在R语言中有哪些并行的包&#xff1a;隐式并行&#xff1a;OpenBLAS&#xff0c;Intel MKL&#xff0c;NVIDIA cuBLA…

cansina 目录_dirmap - 一个高级web目录、文件扫描工具-华盟网

Dirmap一个高级web目录扫描工具&#xff0c;功能将会强于DirBuster、Dirsearch、cansina、御剑需求分析经过大量调研&#xff0c;总结一个优秀的web目录扫描工具至少具备以下功能&#xff1a;并发引擎能使用字典能纯爆破能爬取页面动态生成字典能fuzz扫描自定义请求自定义响应结…

唯有自己变得强大_物竞天择,适者生存,唯有强大自己,方能百毒不侵

物竞天择&#xff0c;适者生存&#xff0c;这是亘古不变的道理。面对生活中的困难&#xff0c;人生路上的挫折&#xff0c;我们只有足够坚强&#xff0c;足够勇敢&#xff0c;足够强大&#xff0c;才能战胜这一切。人活着要明白&#xff0c;你所有的负面&#xff0c;都源于你的…

树莓派c语言运行_树莓派完成简单的编程(四)

在上一篇文章中&#xff0c;我们学习了Vi文本编辑器&#xff0c;那么用它可以实现什么功能呢&#xff1f;树莓派python以及c语言编程这里我选择了最简单和很流行的两种编程语言&#xff1a;C语言和Python。实现最简单的功能&#xff0c;输出hello world。Python编程简介Python是…

mysql 读写引擎_揭秘MySQL存储引擎spider

转自&#xff1a;兴趣部落​buluo.qq.com导读&#xff1a; Spider是为MySQL/MariaDB开发的一个特殊引擎&#xff0c;具有内嵌分片功能。现在它已经被集成到MariaDB10.0及以上版本中&#xff0c;作为MariaDB的一个新的主要性。Spider的主要功能是将数据分散到多个后端节点&#…

python中的与或非_「Python基础」 While 循环语句

Python 编程中 while 语句用于循环执行程序&#xff0c;即在某条件下&#xff0c;循环执行某段程序&#xff0c;以处理需要重复处理的相同任务。其基本形式为&#xff1a;while 判断条件&#xff1a;执行语句……执行语句可以是单个语句或语句块。判断条件可以是任何表达式&…

lamp mysql大小限制_LAMP 调优之:MySQL 服务器调优

关于 MySQL 调优有 3 种方法可以加快 MySQL 服务器的运行速度&#xff0c;效率从低到高依次为&#xff1a;替换有问题的硬件。对 MySQL 进程的设置进行调优。对查询进行优化。替换有问题的硬件通常是我们的第一考虑&#xff0c;主要原因是数据库会占用大量资源。不过这种解决方…

go定时器 每天重复_Go语言学习基础-定时器、计时器

Timer计时器如果希望在将来的某个时间点执行Go代码&#xff0c;或者在某个时间间隔重复执行Go代码&#xff0c;使用Go内置的timer和ticker功能。先看定时器timer&#xff0c;然后再看计时器ticker。定时器代表未来的单个事件。告诉定时器需要等待多长时间&#xff0c;它返回一个…

html类名定义规则_HTML入门笔记1

HTML 是谁发明的?Tim Berners-LeeHTML起手式&#xff1a;HTML起手式 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

mysql主从虚拟机_虚拟机centos7Mysql实现主从配置

环境搭建在虚拟机上和创建两个一模一样的centos7系统&#xff0c;并安装相同版本的mysql(可以先创建一个再克隆)在master上操作登录mysqlmysql -u root -p使用mysqluse mysql;创建用户CREATE USER lystbc1% IDENTIFIED BY Lys135426tbc;给用户授权GRANT REPLICATION SLAVE ON *…

怎样检测mysql5.5安装成功_64位wiN7系统中装配MySQL5.5.17(测试安装成功哦!)

64位wiN7系统中安装mysql5.5.17(测试安装成功哦&#xff01;&#xff01;~~)下载地址&#xff1a;[url] http://www.mysql.com/downloads/mysql/[/url]下载的话需要登录,你只需按照要求注册一个账号,然后下载即可.我下载的是mysql-5.5.17-winx64.msi版本.安装步骤:Step 1. Mysq…

xcode 创建模拟器_Xcode编译WebKit

下载WebKit源码1)进入https://webkit.org/2)点击页面的 Get Started 进入新页面&#xff0c;如下图所示3)点击 Getting the code 进入新页面&#xff0c;如下图所示4)在源码下载页面&#xff0c;有多种下载方式&#xff0c;包括直接下载代码zip包&#xff0c;通过SVN下载&#…

mysql iscsi_iscsi共享存储的简单配置和应用

1、环境介绍SCSI(Small Computer System Interface)是块数据传输协议&#xff0c;在存储行业广泛应用&#xff0c;是存储设备最基本的标准协议。从根本上说&#xff0c;iSCSI协议是一种利用IP网络来传输潜伏时间短的SCSI数据块的方法&#xff0c;ISCSI使用以太网协议传送SCSI命…