精华内容
下载资源
问答
  • 1) 该程序使用内置函数 ode23。 2) 用于求解简单的一阶 ODE。 3) 它使用了一个包含示例的函数。
  • Matlab求常微分方程组的数值

    万次阅读 多人点赞 2020-03-08 09:50:50
    上篇博客介绍了Matlab求解常微分方程组解析的方法:博客地址 微分方程组复杂时,无法求出解析时,就需要求其数值,这里来介绍。 以下内容按照Matlab官方文档提供的方程来展开(提议多看官方文档) 介绍一下...

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

    介绍一下核心函数ode45()

    一般形式:[t,y] = ode45(odefun,tspan,y0) 其中 tspan = [t0 tf]
    功能介绍:求微分方程组 y′=f(t,y) 从 t0 到 tf 的积分,初始条件为 y0。解数组 y 中的每一行都与列向量 t 中返回的值相对应。

    1. 一阶微分方程求解(简单调用即可)

    方程:y’=2*t
    代码

    tspan=[1 6]; %定义自变量x的取值空间为1-6
    y0=0;%定义因变量的初值,当x=1(x取值空间的第一个数)时,y0=0
    [t,y]=ode45(@(t,y) 2*t,tspan,y0); %定义函数y'=2*t,使用ode45求解
    plot(t,y,'-o'); %绘制求得的数值曲线
    

    说明:简单的odefun参数就是这个形式,@(x,y) fun 中间是空格,不能用逗号
    结果
    在这里插入图片描述

    2. 二阶微分方程求解(引入函数文件)

    方程:范德波尔方程 y1’’-u(1-y1²)*y1’+y1=0;(这里设u=1)
    代码
    定义输入的方程,以函数形式定义

    function dydt=odefun(t,y)
    %二阶方程为y1''-(1-y1²)*y1'+y1=0;
    %降阶为两个方程:y1'=y2; 
    %               y2'=(1-y1²)*y2-y1;
    %t虽然没有使用,但必须要作为参数写入
    dydt=[y(2);(1-y(1)^2)*y(2)-y(1)];
    

    求解作图

    tspan=[0 20]; %定义自变量x的取值空间为0-20
    y0=[2;0];%定义因变量的初值,当x=0时,y1=2,y2=y1'=0;
    [t,y]=ode45(@odefun,tspan,y0); %使用ode45求解
    %%下面为作图过程,不解释
    plot(t,y(:,1),'-o',t,y(:,2),'-o')
    title('Solution of van der Pol Equation (\mu = 1) with ODE45');
    xlabel('Time t');
    ylabel('Solution y');
    legend('y_1','y_2')
    

    说明:先进行降阶,使y2=y1’,这时候y2’=y1’’,然后把两个方程写成列向量形式就行了
    结果
    在这里插入图片描述

    3. 求解微分方程组(和2类似)

    这里就和求解二阶方程类似的,只不过不需要降阶,仍旧需要一个函数来定义方程组。我们这里不用官方文档的例子,用同学的循坏摆问题来进行演示。
    方程在这里插入图片描述
    给定的初值(w接近0,但实际上不能设置为0):
    在这里插入图片描述
    代码
    定义输入的方程

    function dRvw=func(t,Rvw)
    %% 函数功能:为ode45提供微分方程
    %输入:t:时间序列,就是θ;Rvw:因变量,Rvw(1)代表R,Rvw(2)代表v,Rvw(3)代表w
    %输出:dRvw:因变量的一阶微分,dRvw(1)代表dR,dRvw(2)代表dv,dRvw(3)代表dw
    %% 初始化因变量的一阶微分,3×1的向量
    dRvw=zeros(3,1);
    %% 参数初始化
    r=0.01;u=0.1;g=9.8;M=10;m=1;
    %% 输入微分方程式
    dRvw(1)=-Rvw(2)/Rvw(3)-r;
    dRvw(2)=(M*g-(m*Rvw(3)^2*Rvw(1)+m*g*sin(t)) *exp(u*(t+pi/2)))/(Rvw(3)*(M+m));
    dRvw(3)=Rvw(3)*r/Rvw(1)+2*Rvw(2)/Rvw(1)+g*cos(t)/(Rvw(3)*Rvw(1));
    

    求解作图

    %% 参数初始化 start_Theta是θ的初始值 end_Theta是θ的结束值
    %R是半径初值;v是线速度初值;w是角速度初值
    start_Theta=0;end_Theta=2*pi;R=1;v=0;w=1e-5;
    %% 使用ode45方法计算微分方程组func的数值解
    %func是带有方程组的函数 
    %[start_Theta end_Theta]是自变量范围
    %[R;v;w]是方程初值
    %T是自变量的数组,Rvw是对应的因变量的数值。Rvw(:,1)=R;Rvw(:,2)=v;Rvw(:,3)=w;
    [T,Rvw]=ode45(@func,[start_Theta end_Theta],[R;v;w]);
    %% 组合自变量和因变量。TRvw(:,1)=θ;TRvw(:,2)=R;TRvw(:,3)=v;Trvw(:,4);
    TRvw=[T,Rvw];
    %% 绘制自变量-因变量图像.figure1是R-θ,figure2是v-θ,figure3是w-θ
    plot(T,Rvw(:,1),'-o',T,Rvw(:,2),'-o',T,Rvw(:,3),'-o')
    title('自变量-因变量图像');
    xlabel('Angle θ');
    ylabel('Solution');
    legend('R','v','w')
    

    说明:注释的应该是比较清楚的,把三个方程写成列向量的形式就行

    PS:有些人和我说不能运行,然后我看了他们出错的原因,有点儿哭笑不得。出错的基本上都是运行上面的dRvw=func(t,Rvw)这个函数的。说明一下,这是有参数的函数,不给参数不能直接运行的。下面的求解作图脚本才是需要运行的哈,它调用了函数,才得到的结果。如果大家还发现什么问题,欢迎私戳或评论。

    PS+ 有了PS之后,还是很多人问我参数的问题,我在这里直接把文件给大家:cupt.zip
    提取码:6k8n。
    解压后,有两个文件,大家直接运行cupt.m即可。

    结果
    在这里插入图片描述

    4. 更多形式

    讲到这里,大部分我们用到的微分方程形式都可以求解了,Matlab还支持带有时变项和额外参数的微分方程求解,这里不再赘述,大家可以自行参阅官方文档。

    展开全文
  • %% 学习目标:使用MATLAB求解常微分方程 数值 %% 求微分方程的通 clear all; f1=dsolve(‘Dy-y=sin(x)’) %默认情况下以t为自变量求解 求出的C2为积分常数 f2=dsolve(‘Dy-y=sin(x)’,‘x’) % 以x为...

    %% 学习目标:使用MATLAB求解常微分方程 通解 特解 数值解
    %% 求微分方程的通解
    clear all;
    f1=dsolve(‘Dy-y=sin(x)’) %默认情况下以t为自变量求解 求出的C2为积分常数
    f2=dsolve(‘Dy-y=sin(x)’,‘x’) % 以x为自变量求解
    %% 求微分方程的特解
    clear all;
    dsolve(‘Dy=a*y’,‘y(0)=b’) %求微分方程的特解
    %% 求微分方程组
    clear all;
    z=dsolve(‘Dx=y’,‘Dy=-x’) % 默认t为自变量
    z.x
    z.y
    %% 求解常微分方程组的数值解
    clear all;
    close all;
    options=odeset(‘RelTol’,1e-4,‘AbsTol’,[1e-4 1e-4 1e-5]); %设置参数
    [t,y]=ode45(@rigid,[0 12],[0 1 1],options);
    % 时间范围0到12,rigid是方程组,变量的初始值是 0 1 1
    figure;
    plot(t,y(:,1),’-’,t,y(:,2),’–’,t,y(:,3),’:’);
    xlabel(‘Time’);
    legend(‘y1’,‘y2’,‘y3’);
    % odeset 结构体
    ……
    ……
    ……
    (省略部分代码,完整代码可以下载)
    ……
    ……
    ……
    (完整代码及资料下载地址)
    8一节课精通matlab入门求微分方程组的通解特解数值解.zip-CSDN下载 https://download.csdn.net/download/weixin_44356700/11856003

    新上线了一门视频课程——二十八天精通matlab基础编程-在线视频教程-CSDN学院 https://edu.csdn.net/course/detail/24947

    展开全文
  • MATLAB利用ode求解二阶微分方程

    千次阅读 2020-12-17 15:02:10
    MATLAB利用ode求解二阶微分方程 求解微分方程为: MATLAB的m文件代码如下: function xp=order1(t,x) xp=zeros(2,1); %x1=y,x2=y' xp(1)=x(2); xp(2)=(200*t-0.5*(x(2))^2)/(20*t); end 在命令行中调用代码如下:...

    MATLAB利用ode45求解二阶微分方程

    ==================================================

    求解微分方程为:
    在这里插入图片描述

    ==================================================
    MATLAB的m文件代码如下:

    function xp=order1(t,x)
    xp=zeros(2,1);          %x1=y,x2=y'
    xp(1)=x(2);
    xp(2)=(200*t-0.5*(x(2))^2)/(20*t);
    end
    
    

    ==================================================

    在命令行中调用代码如下:

    [t,x]=ode45(‘order1’,[1 40],[0 0]);
    figure;
    plot(t,x(:,1),‘r’);

    ==================================================

    这是一套固定思路,因ode45只能对y’=f(t,y)形式的函数求解,故做变化:
    在这里插入图片描述
    这样变化以后,就可以求解二阶微分方程了。

    plot(t,x(:,1))plot(t,x(:,2)) 可以分别显示 y’y’’ 的解,这里不一一列出,具体过程参考程序

    ==================================================

    运行结果如下:
    在这里插入图片描述

    展开全文
  • PAGE / NUMPAGES Matlab微分方程ode45分析 该文章讲述了Matlab微分方程ode45分析. ode是专门用于解微分方程的功能函数他有ode23,ode45,ode23s等等采用的是Runge-Kutta算法ode45表示采用四阶五阶...
  • Matlab提供了解决包括解微分方程在内的各种类型问题的函数: 1. 常规微分方程(ODEs)的初始值问题 初值问题是用MATLAB ODE求解器解决的最普遍的问题。初始值问题最典型的是对非刚性度(?nonstiff)问题应用...
  • matlab求解常微分方程组——dsolve与ode45

    千次阅读 多人点赞 2020-02-08 22:12:49
    本文主要介绍matlab中求解常微分方程(组)的dsolve和ode系列函数,并通过例子加深读者的理解。 一、符号介绍    D: 微分符号;D2表示二阶微分,D3表示三阶微分,以此类推。 二、函数功能介绍及例程 1、...

    本文主要介绍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系列函数,并通过例子加深读者的理解。 一、符号介绍  D: 微分符号;D2表示二阶微分,D3表示三阶微分,以此类推。 二、函数功能介绍及例程 1、dsolve ...
  • 这个想法是将微分方程写为某个“基函数”的总和(例如,作为正弦和的傅立叶级数),然后选择总和中的系数以满足微分任何给定精度的方程。 谱方法可用于求解常微分方程 (ODE)、偏微分方程 (PDE) 和涉及微分方程的...
  • 龙格-库塔方法是一种经典方法具有很高的精度它间接的利用了泰勒级数展开避免了高阶偏导数的...取步长h=0.1此处由数学知识可得该方程的精确为 在这里利用MATLAB编程计算数值并与精确相比代码如下 (1)写出微分方程
  • matlab解微分方程

    2021-03-09 20:19:52
    微分方程ordinary differential equation的缩写,此种表述方式常见于编程,如MATLAB中Simulink求解器solver已能提供了7种微分方程求解方法:ode45(Dormand-Prince),ode23(Bogacki-Shampine),ode113(Adams),ode...
  • 练习。使用四阶龙格库塔法求解常微分方程组,通用性较佳。附加一个振动方程求解的案例。振动方程是一个二阶微分方程,转化为两个方程组以后用编写的代码求解。
  • 一常微分方程组的符号(4)若边界条件少于方程组的阶数则返回的结果r中会出现任意常数C1C2(6)若没有给定输出参量则在命令窗口显示列表若该命令找不到解析则返回一警告信息同时返回一空的sym对象这时用户可以用...
  • matlab 多次求解偏微分方程 ode45

    千次阅读 2019-04-27 20:39:47
    师兄和我讨论了一个问题,就是在matlab中求解偏微分方程, 其中,偏微分方程中有的常数是一直变化的,要求很多次,而不是一个固定的常数求一次就行了。 其中,A1和A2是要求的因变量,x是自变量,其他为...
  • 利用MATLAB求解一阶微分方程,输入信号为单位阶跃脉冲信号,代码绘制了系统脉冲响应的计算结果。
  • ODE(ordinary differential equations)23和ODE45求解微分方程 ODE(ordinary differential equations)23 通过使用二阶和三阶隆哥-库塔方法积分微分方程得出
  • MATLAB官网ode45函数介绍中有一下四种用法。[t,y] = ode45(odefun,tspan,y0)https://www.mathworks.com/help/releases/R2020b/matlab/ref/ode45.html?doclanguage=zh-CN&nocookie=true&prodfilter=ML%20SL...
  • 本文主要介绍matlab中求解常微分方程(组)的dsolve和ode系列函数,并通过例子加深读者的理解 matlab求解常微分方程(组)---dsolve、ode系列函数详解(含例程)
  • 练习代码。使用四阶龙格库塔法求解常微分方程,分为了用户定义步长和自动变步长两种。并有一个使用案例,这两种算法的结果与ode45对比。
  • matlab求解偏微分方程,相比较把偏微分转成长分为方程再调用ode函数,利用离散差分法,使用迎风格式迭代求解数值
  • 本人需要用ODE15s解一个微分方程组,形式如图中圈出来的。看过matlab help文件后还是不知道具体怎么使用,参数怎么设置。有没有大神能举个类似例子让我看一下。(我要的方程质量矩阵里面不是常数,包含了y) 看图...
  • MATLAB求解微分方程

    2021-05-23 20:48:31
    下面介绍如何用 Matlab 来计算微分方程(组)的数值。 Euler折线法 微分方程的基本数值解法——Euler折线法。 步骤: 分割求解区间,差商代替微商,代数方程 例子: : 等距剖分:a=x0<x1<x2<⋯&l
  • matlab解微分方程

    万次阅读 多人点赞 2018-02-07 16:07:01
    一般来说,在matlab微分方程有两种方法,一种是符号解法,另一种是数值解法。在本科阶段的微分数学题,基本上可以通过符号解法解决。 用matlab解决常微分问题的符号解法的关键命令是dslove命令。该命令中可以...
  • 使用 matlab 自带的 ode45 ,方程组用句柄表示。
  • 4.8 微分方程微分方程是数值计算中常见的问题,MATLAB提供了多种函数来计算微分方程。4.8.1 常微分方程众所周知,对一些典型的常微分方程,能求解出它们的一般表达式,并用初始条件确定表达式中的任意常数。但...
  • Matlab ode45 解微分方程

    万次阅读 2013-09-19 18:48:09
    在用odesolver(ode45, ode15s, …)来解微分方程的时候,最基本的用法是: [t, y] = odesolver(odefun, tspan, y0);  这里的odefun是待求的微分方程。那么odefun中一般会含有多个系统参数,通常要通过改变参数来观察...
  • MATLAB四阶龙格库塔法 求解微分方程数值 部分源码 clear;clc;close all h=0.2; t=0:h:3; x(1)=1; %使用Runge-Kutta方法,计算微分方程的数值
  • MATLAB与高等数学--常微分方程(ODE)的求解
  • matlab开发-微分方程解45。微分方程Ode45的解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,584
精华内容 633
关键字:

matlabode解微分方程

matlab 订阅