求解微分方程的意思就是,已知导函数,求原函数。

先声明一点,欧拉法、中值法、龙哥库塔法求解微分方程,得出的结果不是表达式,而是一系列离散点。

一、欧拉法递推

问题描述:已知y'=f(x,y),求y(x)。

例题:已知y'=y,y(0)=1,求y(x)。

解:这个题目高数知识很容易求解,答案是y=e^x。但是这里我们不使用解析法,而使用迭代递推法去求y(x)。

把y(x)在x0处泰勒展开到一阶,有y(x0+h)=y(x0)+y'(x0)h,有了这个式子,我们就能根据y(0)递推出y(0+h)的值,进而推出y(0+h+h)、y(0+h+h+h)的值····。根据这一原理就能很容易的写出递推程序了:

clear;
euler(0.1);%减小步长可以提高运算精度function euler(h)
%欧拉法解微分方程:y'=y     真实解为y=e^t
%形参:自变量的步长h
hold on;
idx = 1: 1: 10/h;x(1)=0;
y(1)=1;for i = idxx(i+1) = x(i) + h;dy = y(i);    y(i+1) = y(i) + h * dy;  %y1 = y0 + h * y0'
endplot(x, exp(x), 'r');
plot(x, y, 'b');
legend('真实解','递推解');
end

运行结果如下:

我们可以发现,递推的精度有点差,不过下面我们还有更好的递推方法。

二、中值法递推

该方法是对欧拉法的改进,原理就是拉格朗日中值定理,y(x0+h)=y(x0)+h*y'(a),其中a∈[x0, x0+h],虽然a不是区间的中点,但是这里我们认为用[x0, x0+h]区间中点处x0+h/2的导数来递推,比单纯用左端点的导数做递推,精度更高。该方法所用的递推公式为:

中值法有两种,第二种是这样的:用区间左右端点处的导数的平均值来递推,本质上就是左右端点各预测一个增量△y,这两个增量权重各占50%。

该方法的递推公式:

在接下来的章节中,我们将会看到,这两种中值方法,本质上都是二阶龙格库塔方法的特例。

下面是第一种中值法的程序:

clear;center(0.1);function center(h)
%中点法解微分方程:y'=y     真实解为y=e^t
%形参:自变量的步长h
hold on;idx = 1: 1: 10/h;x(1)=0;
y(1)=1;for i = idx    x(i+1) = x(i) + h;dy = y(i);    y_center = y(i) + h/2 * dy;%预测y(xi+h/2)函数值    dy = y_center;%中点的导数代替左端点的导数进行迭代y(i+1) = y(i) + h * dy;
endplot(x, exp(x), 'r');
plot(x, y, 'b');
legend('真实解','递推解');
end

可以发现,几乎重合,这个方法跟前面的欧拉法相比,步长相等的情况下,递推精度大幅提高,红蓝曲线几乎重合!

三、龙格库塔法(RungeKutta)求解

上面的方法2,看起来几乎重合,实际上放大以后还是能看到误差的,我们还有精度更高的方法。

https://wenku.baidu.com/view/d69e8f1f77c66137ee06eff9aef8941ea76e4b2c.html

推导过程会用到一元函数泰勒公式、复合函数求导公式。

泰勒公式:

复合函数求导公式(全导数公式):

我们如果用泰勒二阶截断式来做递推,效果肯定比欧拉法要好,因为欧拉法的本质就是用的泰勒一阶截断式。

还是用前面的例题:已知y'=f(x,y),y(0)=1,求y(x)。

用泰勒二阶递推公式能提高精度是显而易见的,但是由泰勒公式可见,其缺点是,通过提高阶次来运算时,需要用到二阶导、三阶导.....,有些高阶导并不是那么好求的,龙格库塔递推法就是对这一问题进行优化,用低阶导的泰勒展开来避免掉求高阶导。

龙格库塔(runge-kutta,RK)法求解微分方程相关推荐

  1. 龙格-库塔(Runge-Kutta)法解微分方程

    龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法.由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂.该算法是构建在数学支持的基础之上的. 对于一阶精度的欧 ...

  2. 阿当姆斯方法求解微分方程初值问题:四阶龙格库塔提供出发值(C语言)

    #include<stdio.h>float f1(float x,float y) //第一问 {return y*y;//方程 }float f2(float x,float y)// ...

  3. MATLAB从入门到精通-欧拉法与梯形法求解微分方程(含MATLAB源码)

    前言 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! MATLAB-30天带你从入门到精通 MATLAB深入理解高级教程(附源码) tableau可视化数据 ...

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

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

  5. matlab求微分方程同届,Matlab学习——求解微分方程(组)

    介绍: 1.在 Matlab 中,用大写字母 D 表示导数,Dy 表示 y 关于自变量的一阶导数,D2y 表示 y 关于自变量的二阶导数,依此类推.函数 dsolve 用来解决常微分方程(组)的求解问 ...

  6. 四阶龙格库塔(Runge-Kutta)求解微分方程-多种编程语言

    前期是分享了matlab下面实现四阶龙格库塔(Runge-Kutta)求解微分方程,这期分享一下C++.C.Java.Python下面的四阶龙格库塔(Runge-Kutta)求解微分方程. 前文传送门 ...

  7. matlab 龙格-库塔 法求解常微分方程

    最近学习分室模型,里面碰到了用matlab 龙格-库塔 法求解常微分方程 研究了一阵子终于明白到底怎么实现了: 1. matlab 新建.m文件,编写龙格-库塔法求解函数 function [x,y] ...

  8. C#,数值计算,解微分方程的龙格-库塔二阶方法与源代码

    微分方程 含有导数或微分的方程称为微分方程,未知函数为一元函数的微分方程称为常微分方程. 微分方程的阶数 微分方程中导数或微分的最高阶数称为微分方程的阶数. 微分方程的解 使得微分方程成立的函数称为微 ...

  9. [常微分方程的数值解法系列五] 龙格-库塔(RK4)法

    龙格-库塔法 简介 基本思想 具体方法 一阶 二阶 求解参数 特殊二阶 三阶 高阶 步长选择 例子 在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其 ...

最新文章

  1. 用模板来进行类型检查。
  2. 事务框架之声明事务(自动开启,自动提交,自动回滚)Spring AOP 封装
  3. python图片二进制流转换成图片_python将图片二进制数据转换成Django file对象
  4. 如何学习linux设备驱动
  5. docker在Centos上的安装
  6. MySQL之表的约束
  7. linux收发outlook的邮件,Linux邮箱服务器配置:如何让outlook收发邮件,怎么样控制中继...
  8. 小鹏汽车副总裁纪宇:坚持智能化技术自研,打造最深的护城河
  9. handler和thread之间如何传输数据_HTTP和TCP之间的关系
  10. 热点素材在哪找?5年自媒体人,我推荐这3个平台
  11. assert有什么作用
  12. net中winform教程 ListView控件如何实现分组?
  13. 全国高校恋爱关系图谱:北大受宠爱,浙大最孤独
  14. 最新版!国内IT软件外包公司汇总~
  15. java mysql 订单表设计
  16. 表连接on 和where的区别
  17. jupyter 启动后能打开页面 ,页面提示‘连接失败以及 TensorBoard的打开方法
  18. 计算机提示网络不可用,网络连接不可用,教您电脑网络连接不可用怎么办
  19. 计算机辅助设计阀体,快速阀的计算机辅助设计毕业设计精选.doc
  20. 如何将你的 ThinkJS 项目部署到 ZEIT 上

热门文章

  1. 断点续传(视频进度条拖动以及flv.js需要断点续传)
  2. Java验证中文汉字、英文字母、标点符号一个字符占多少字节
  3. JAVA毕业设计花卉网站计算机源码+lw文档+系统+调试部署+数据库
  4. 软件开发为什么失败?
  5. C++学习笔记:三种智能指针【Share、Unique、Weak】【Cherno】
  6. Java基于内存的消息队列实现
  7. HDU 1873 优先队列
  8. 如何在微信h5拉起支付宝支付界面
  9. 洛谷题解——P1873:砍树
  10. 短视频源码APP开发——短视频的功能