matlab 中点法,中点法解常微分方程(组)
 
 
 
 
 
 
 
预备知识 常微分方程(组)的数值解
我们先来尝试用欧拉法解一阶微分方程
\begin{equation}
y'(t) = y
\end{equation}
令初始条件为 $y(0) = 1$.令步长为 $h = 0.5$,步数为 $5$,结果如图 1 所示(代码见词条最后).
图 1:欧拉法数值解(蓝)和解析解(红)
我们知道该方程的解析解为 $y = \mathrm{e} ^{t}$.对比数值解和解析解,不难分析出误差产生的原因:我们仅用每段步长区间左端的导数预测整个区间的曲线增量.如果我们能利用每个区间中点的导数计算整个区间的增量,这个预测将会比欧拉法更精确.
考虑微分方程 $y'(t) = f(y, t)$ 在区间 $[t_n, t_{n+1}]$ 的曲线,若我们已知区间左端的函数值为 $y_n$,我们可以先用微分近似估计曲线中点的函数值为
\begin{equation}
y \left(t_n + \frac h2 \right) = y_n + \frac h2 f(y_n, t_n)
\end{equation}
然后再求出这个近似中点的导数为
\begin{equation}
y' \left(t_n + \frac h2 \right) = f \left[y_n + \frac h2 f(t_n, y_n), t_n + \frac h2 \right]
\end{equation}
最后我们利用这个导数估算该区间的曲线增量
\begin{equation}
y_{n+1} = y_n + hy' \left(t_n + \frac h2 \right) = y_n + h f \left[y_n + \frac h2 f(t_n, y_n), t_n + \frac h2 \right]
\end{equation}
这就是解常微分方程的中点法.
我们再来用中点法取同样的步长计算式 1,结果如图 2 所示.
图 2:中点法数值解(蓝)和解析解(红)
可见虽然中点法每一步的计算过程比欧拉法稍微复杂一些,但精度却大大地提高了.
中点法同样适用于微分方程组,例如对于常微分方程组
\begin{equation}
\begin{cases}
x'(t) = f(x, y, t)\\
y'(t) = g(x, y, t)
\end{cases}
\end{equation}
首先计算近似中点为
\begin{equation}
\begin{cases}
x_{n+1/2} = x_n + \frac{h}{2} f(x_n, y_n, t_n)\\
y_{n+1/2} = y_n + \frac{h}{2} g(x_n, y_n, t_n)
\end{cases}
\end{equation}
然后有
\begin{equation}
\begin{cases}
x_{n+1} = x_n + h f \left(x_{n+1/2}, y_{n+1/2}, t_n + h/2 \right) \\
y_{n+1} = y_n + h g \left(x_{n+1/2}, y_{n+1/2}, t_n + h/2 \right)
\end{cases}
\end{equation}
代码 1:odeMid.m
matlab 中点法,中点法解常微分方程(组)相关推荐
- 用python的scipy中的odeint来解常微分方程中的一些细节问题(适用于小白)
用python的scipy中的odeint来解常微分方程中的一些细节问题(适用于小白) 写在前面 最近有些需要解决常微分方程的问题,网上查了很多教程都不是很明晰,便自己研究了一段时间,写一点小白初次接 ...
- 用python实现解常微分方程组的简单示例以及用odeint解常微分方程的范例
背景: 包括两个部分,一个是演示怎么自己写代码解常微分方程,另一部分就是示范python怎么调用解常微分方程的函数. 下面的方程组给出洛仑兹引子在三个方向上的速度,求解运动轨迹 软件: python3 ...
- matlab中常微分方法,MATLAB解常微分方程组的解法(好东西要共享)
1:问题 常微分方程的初值问题的标准数学表述为:y'=f(t,y),a<=t<=b,y(a)=y(0) :我们要求解的任何高阶常微分方程都可以用替换法化为上式所示的一阶形式,其中y为向量, ...
- 用sympy库解常微分方程
1. sympy库简介:Sympy是一个数学符号运算库.能解决积分.微分方程等各种数学运算方法,用起来也是很简单,可以和Matlab想媲美. 2. 解常微分方程举例:比如解下面这道常微分方程 Pyth ...
- 中点法 matlab,中点法解常微分方程(组)
              预备知识 常微分方程(组)的数值解 我们先来尝试用欧拉法解一 ...
- matlab中lambertw,MATLAB解常微分方程
在MATLAB中,由函数dsolve()解决常微分方程(组)的求解问题,其具体格式如下: X=dsolve('eqn1','eqn2',-) 函数dsolve用来解符号常微分方程.方程组,如果没有初始 ...
- MATLAB中lsqnonlin多元,Matlab中lsqnonlin对常微分方程组进行参数拟合以后 怎样用nlparci查看参数的置信区间...
我用fminsearch 进行了常微分方程组参数优化 现想知道参数置信区间 所以改用lsqnonlin进行单参数拟合 初值是我已经得到的优化结果 但是拟合显示local minimum 而且ci = ...
- matlab中使用ode方法解范德波尔微分方程的数值解
微分方程的解析解要求比较严苛,只有在特定的条件下才能写出解析解表达式,而在现实的科研问题当中,绝大多数情况我们会采用数值解(numeric solution)的方法来求解微分方程.这个时候就要用到od ...
- matlab中xcorr函数详解
Matlab中xcorr函数详解 引言 在matlab中查找相关函数时,找到了xcov函数和xcorr函数,仔细看了帮助文档,发现虽然计算公式不一样,但是两个函数用法相同,计算出的值也相同,于是在翻了 ...
最新文章
- PetShop之表示层设计 - 《解剖PetShop》系列之六
- quick-cocos2d-x游戏开发【3】——display.newSprite创建向导
- 线上直播丨Hinton等6位图灵奖得主、百余位顶级学者邀你群聊AI
- RuoYi-Vue————权限管理
- 「软件测试基础」理论篇之软件测试概论
- .NET 6 Preview 3 发布
- NumPy快速入门--基础知识
- 博士生录取采用审核制,存在的一些明显问题!
- c# datetime._C#| DateTime.AddTicks()方法与示例
- Redis实现计数器---接口防刷---升级版(Redis+Lua)
- bzoj3545: [ONTAK2010]Peaks 主席树合并
- Nginx 除了负载均衡,还能做什么?
- CentOS 7安装Mysql并设置开机自启动
- hive启动debug问题
- [ProblemSolving]教育网下载速度慢,如何解决?
- 支付宝接口http请求及sign加密
- 【Python打印图形问题】利用print打印一些规则的图形(通过特殊符号比如*和空格组成)
- DiscuzX3.n系列域名转向问题的解决
- 我的专业作文300字计算机,以我的专业为题的作文(以我写一篇作文300字)
- Help Hanzo LightOJ - 1197(素数筛法)