本文主要介绍matlab中求解常微分方程(组)的dsolveode系列函数,并通过例子加深读者的理解。

一、符号介绍

D: 微分符号;D2表示二阶微分,D3表示三阶微分,以此类推。

二、函数功能介绍及例程

1、dsolve 函数

dsolve函数用于求常微分方程组的精确解,也称为常微分方程的符号解。如果没有初始条件或边界条件,则求出通解;如果有,则求出特解。

1)函数格式

Y = dsolve(‘eq1,eq2,…’ , ’cond1,cond2,…’ , ’Name’)

其中,‘eq1,eq2,…’:表示微分方程或微分方程组;

’cond1,cond2,…’:表示初始条件或边界条件;

‘Name’:表示变量。没有指定变量时,matlab默认的变量为t;

2)例程

例1.1(dsolve 求解微分方程)

求解微分方程:

在命令行输入: dsolve('Dy=3*x^2','x') ,摁下enter键后输出运行结果。

例1.2(加上初始条件)

求解微分方程:

只需要在命令行添加初始条件即可,此时求出的即为方程的特解。可以看到上例中的C9变为了2。

例2(dsolve 求解微分方程组)

求解微分方程组:

由于x,y均为t的导数,所以不需要在末尾添加’t’。

2、ode函数

在上文中我们介绍了dsolve函数。但有大量的常微分方程,虽然从理论上讲,其解是存在的,但我们却无法求出其解析解,此时,我们需要寻求方程的数值解。

怎么理解数值求解呢?数值分析是一门专门的学科,在此不过多介绍。我主要想通过一个简单的例子来向大家阐述数值求解的思想。

比如,求解微分方程  。我们就可以转化为,那么。因此,我们可以通过迭代的方式来求解y。即可理解为步长

ode是Matlab专门用于解微分方程的功能函数。该求解器有变步长(variable-step)和定步长(fixed-step)两种类型。不同类型有着不同的求解器,具体说明如下图。

非刚性ode求解命令

求解器solver

功能

说明

ode45

一步算法:4、5阶龙格库塔方程:累计截断误差(Δx)^5

大部分尝试的首选算法

ode23

一步算法:2、3阶龙格库塔方程:累计截断误差(Δx)^3

适用于精度较低的情形

ode113

多步算法:Adams

计算时间比ode45短

刚性ode求解命令

ode23t

梯形算法

适度刚性情形

ode15s

多步法:Gear’s反向数值微分:精度中等

若ode45失效时,可以尝试使用

ode23s

一步法:2阶Rosebrock算法:精度低

当精度较低时,计算时间比ode15s短

ode23tb

梯形算法:精度低

当精度较低时,计算时间比ode15s短

其中,ode45求解器属于变步长的一种,采用Runge-Kutta算法;其他采用相同算法的变步长求解器还有ode23。ode45表示采用四阶-五阶Runge-Kutta算法,它用4阶方法提供候选解,5阶方法控制误差,是一种自适应步长(变步长)的常微分方程数值解法,其整体截断误差为(Δx)^5。解决的是Nonstiff(非刚性)常微分方程。

ode45是解决数值解问题的首选方法,若长时间没结果,应该就是刚性的,可换用ode15s试试。

下面将以ode45为例具体介绍函数的使用方法。

1)函数格式

[T,Y] = ode45(‘odefun’,tspan,y0)

[T,Y] = ode45(‘odefun’,tspan,y0,options)

[T,Y,TE,YE,IE] = ode45(‘odefun’,tspan,y0,options)

sol = ode45(‘odefun’,[t0 tf],y0...)

其中: odefun是函数句柄,可以是函数文件名,匿名函数句柄或内联函数名;

tspan 是求解区间 [t0 tf],或者一系列散点[t0,t1,...,tf];

y0 是初始值向量

T 返回列向量的时间点

Y 返回对应T的求解列向量

options 是求解参数设置,可以用odeset在计算前设定误差,输出参数,事件等

TE 事件发生时间

YE 事件发生时之答案

IE 事件函数消失时之指针i

2)微分方程标准化

利用ode45求解高阶微分方程时,需要做变量替换。下面说明替换的基本思路。

微分方程为

初始条件

首先做变量替换

原微分方程可以转换为下面的微分方程组的格式:

下面就可以利用转换好的微分方程组来编写odefun函数。

3)例程

例3.1(编写odefun函数)

在matlab中新建脚本文件,编写函数如下:

本例中只需在例3.1的基础上编写主函数,加上求解区间和边值条件即可。需要注意的是,ode45的运行结果以列向量形式给出。因此在本例中,x的第一列为y,第二列为y’。如果遇到变量不是列向量形式的,可以考虑利用reshape函数做矩阵变换。

则,plot(t,x(:,1))画出来的是x的第一列数据,即为y;

plot(t,x(:,2))画出来的是x的第二列数据,即为y’;

三、总结

在使用matlab中,如遇到命令格式记不清楚等情况,建议直接在命令行输入指令’help+函数名称’,如,在matlab命令窗口输入help dsolve后,显示如下:

参考:

1、https://jingyan.baidu.com/article/e52e36154448e940c60c51aa.html

2、https://baike.baidu.com/item/ode45/6674723?fr=aladdin

3、https://wenku.baidu.com/view/45a0a0b54b73f242326c5f7f.html

matlab求解常微分方程(组)---dsolve、ode系列函数详解(含例程)相关推荐

  1. php output详解,PHP输出缓冲控制Output Control系列函数详解,output函数详解

    PHP输出缓冲控制Output Control系列函数详解,output函数详解 概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到 ...

  2. openssl之EVP系列之4---EVP_Encrypt系列函数详解(一)

    EVP_Cipher系列包含了很多函数,我将他们大概分成两部分来介绍,一部分是基本函数系列,就是本文要介绍的,另一个部分是设置函数系列,将在后面的文章进行介绍.基本系列函数主要是进行基本的加密和解密操 ...

  3. dlopen系列函数详解

    Linux提供了一套API来动态装载库.下面列出了这些API: dlopen:该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添 ...

  4. matlab求解常微分方程组/传染病模型并绘制SIR曲线

    看了很多关于传染病模型的matlab程序,大都是绘制出两条曲线(I.S)的,本文最大的不同是绘出SIR三条曲线. 先给出SIR微分方程组 函数文件: run的程序:

  5. str系列函数详解(包会)

    1.strlen 字符串向后依次遍历,直到找到'\0'为止,返回数字不计入'\0'. 2.strcpy 输入两个字符串作为参数,例如strcpy(arr1,arr2),函数将arr2中的每个字符依次替 ...

  6. R语言中apply系列函数详解

    文章目录 apply lapply, sapply, vapply rapply tapply mapply R语言系列: 编程基础

  7. MATLAB求解常微分方程

    MATLAB求解微分方程_Falcon的博客-CSDN博客_matlab微分方程求解 matlab求解常微分方程(组)---dsolve.ode系列函数详解(含例程)_假电工的真的博客-CSDN博客_ ...

  8. Matlab求常微分方程组的数值解

    上篇博客介绍了Matlab求解常微分方程组解析解的方法:博客地址 微分方程组复杂时,无法求出解析解时,就需要求其数值解,这里来介绍. 以下内容按照Matlab官方文档提供的方程来展开(提议多看官方文档 ...

  9. fick第二定律matlab求解,(最新整理)实验二MATLAB数值计算常微分方程(组)的求解

    <(最新整理)实验二MATLAB数值计算常微分方程(组)的求解>由会员分享,可在线阅读,更多相关<(最新整理)实验二MATLAB数值计算常微分方程(组)的求解(19页珍藏版)> ...

  10. matlab求解常微分方程——从原理到实践(代码详解)

    目录 理论知识 一.概念 二.解法 matlab微分方程求解 一.解析解 1.1 解析解的存在 1.2 解析解的解法 1.3 实例 二.数值解 2.1 概述 2.2 优化措施 2.3 解法 2.4 检 ...

最新文章

  1. android中的数据库操作(SQLite)
  2. (进阶篇_01)Oracle数据同步3种场景
  3. leetcode 283 Move Zeros; 27 Remove Elements; 26 Remove Duplicated from Sorted Array;
  4. 重要性采样(Importance Sampling)简介和简单样例实现
  5. 放弃 PHP,选择 Node.JS 的 8 个理由!
  6. Test from Windows Live Writer
  7. securecrt批量登录linux,SecureCRT批量配置使用会话key
  8. 推荐系统专利:一种信息推荐方法、系统及存储介质和终端设备
  9. FbinstTool万能启动超级简单教程
  10. plc控制伺服电机 四轴攻丝机案例 该程序为plc控制伺服电机的工程案例程序,包含伺服电机接线图,包含程序流程的详细解释说明
  11. 输入法那个烦人的托盘图标怎么隐藏或者去掉
  12. Java计算文件MD5值
  13. 若依RuoYi-Vue 入门零接触超详细(一)
  14. grpc编译问题:“C++ versions less than C++11 are not supported.
  15. P2123 皇后游戏
  16. java email bean_JavaWeb学习笔记-第四章JavaBean技术
  17. 06-08 无人机怎么拍摄VR全境图?
  18. %I64d 和%lld 的区别
  19. java集合list方法吗_关于集合:将List转换为Java集合的最简单方法
  20. Gin框架使用Zap接收日志

热门文章

  1. Android 微信高性能日志存储库Xlog的使用
  2. bessel 函数乘以指数函数的积分
  3. 什么是token以及token的原理
  4. 幼儿园调查过程怎么写_(完整版)幼儿园调查报告
  5. GNU autotools 下载和安装
  6. 成长笔记之博客统计第一篇
  7. CISSP知识点汇总(已完结并通过考试)
  8. Choerodon猪齿鱼实践之角色管理
  9. nn.module 看图搭建网络
  10. Multi-Layered Gradient Boosting Decision Trees