精华内容
下载资源
问答
  • Matlab ode45 解微分方程

    万次阅读 2013-09-19 18:48:09
    在用odesolver(ode45, ode15s, …)来解微分方程的时候,最基本的用法是: [t, y] = odesolver(odefun, tspan, y0);  这里的odefun是待求的微分方程。那么odefun中一般会含有多个系统参数,通常要通过改变参数来观察...

    在用odesolver(ode45, ode15s, …)来解微分方程的时候,最基本的用法是: 

    [t, y] = odesolver(odefun, tspan, y0); 

    这里的odefun是待求的微分方程。那么odefun中一般会含有多个系统参数,通常要通过改变参数来观察系统动态的变化。那么如何在调用odesolver的时候传递参数呢? 
    以前,我都是用全局变量的写法,将参数在主函数和子函数中分别都定义为global,这样做有一个弱点:针对系统不同,参数的表达与数量有变化的时候,程序通常要做变化,通用性不强。那么最好是在调用的时候进行传递,方法如下: 

    实际上很简单,就是将一切其他的参数都写在括号中就可以了!但是要注意的是:odesolver的第四个参数一定是options,也就是对微分方程添加补充功能的参数(类型为structure,要用odeset来定义),那么其他系统参数就只能从第五个参数写起。也就是说,第四个参数不可以为空,一定要定义某种option加进去,或者用使用空白矩阵(placeholder)。这样调用的时候格式就是:

     [t, y] = odesolver(odefun, tspan, y0, options, parameter1, parameter2); 或者 

    [t, y] = odesolver(odefun, tspan, y0, [], parameter1, parameter2);

     然后定义微分方程的时候也要有参数的地方:

     function dydt = odefun(t, y, parameter1, parameter2) dydt = [ eqn-1; eqn-2; …]; 就OK了。 


    另一种用法: 

    [T,Y] = ode45(@(t,y) rigid(t,y,Lambda,Lami,Cs,ionization,Ed),[0 100],[PHI_0,E_0,M_0,Gma_0],options); Lambda,Lami,Cs,ionization,Ed是参数 之前有声明 t y是变量 ,[PHI_0,E_0,M_0,Gma_0],是初始值 

    -------------------------------------------------- 

    function dy = rigid(t,y,Lambda,Lami,Cs,ionization,Ed) dy = zeros(4,1);    % a column vector dy(1) = y(2); 
    dy(2) = exp(y(1))-y(3)/y(4); 
    dy(3)=Lambda*ionization/Cs*exp(y(1)); 
    dy(4) = -y(4)*Lambda/Lami-Lambda*ionization/Cs-y(2)/y(4)-Ed/y(4); 

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     [t,H]=ode45('solitiontry1',tspan,h0,[],m1,epsinon) 

    —————————————————————————————— 

    function solfi=solitiontry1(t,H,flag,m1,epsinon) %m1=1.15; 

    y=(1-epsinon)*(1-exp(H))+epsinon*m1^2*(1-sqrt(1+2*H*m1^-2))+m1^2*(1-sqrt(1-2*H*m1^-2)); solfi=-sqrt(-2*y); 


    注意前面两个函数之间的区别,第二个多了一股flag参数。应该是针对options为空的那个参数的,但是在这里,如果options不为空的话,还不知道有什么区别。

    展开全文
  • 一常微分方程组的符号(4)若边界条件少于方程组的阶数则返回的结果r中会出现任意常数C1C2(6)若没有给定输出参量则在命令窗口显示列表若该命令找不到解析则返回一警告信息同时返回一空的sym对象这时用户可以用...
  • 1.4.8 微分方程 (ordinary differential equation, ODE) 一引言 微分方程求解的数值算法有多种常用的有Euler欧拉法Runge Kutta(龙格-库塔法 Euler法称一步法用于一阶微分方程 0 x0 x1 x2 xn xn+1 当给定步长时 ...
  • Matlab提供了解决包括解微分方程在内的各种类型问题的函数: 1. 常规微分方程(ODEs)的初始值问题 初值问题是用MATLAB ODE求解器解决的最普遍的问题。初始值问题最典型的是对非刚性度(?nonstiff)问题应用...
  • matlab开发-微分方程解45。微分方程Ode45的
  • matlab解微分方程

    2021-03-09 20:19:52
    微分方程ordinary differential equation的缩写,此种表述方式常见于编程,如MATLAB中Simulink求解器solver已能提供了7种微分方程求解方法:ode45(Dormand-Prince),ode23(Bogacki-Shampine),ode113(Adams),ode...
    1. ODE

    常微分方程ordinary differential equation的缩写,此种表述方式常见于编程,如MATLAB中Simulink求解器solver已能提供了7种微分方程求解方法:ode45(Dormand-Prince),ode23(Bogacki-Shampine),ode113(Adams),ode15s(stiff/NDF),ode23s(stiff/Mod. Rosenbrock),ode23t(mod. stiff/Trapezoidal),ode23tb(stiff/TR-BDF2)。

    微分方程、微分方程组

    自标量 因变量 一元  多元  函数  映射 

    一元:只有一个因变量

    多元:有多个因变量

    导数 偏导:谁对谁的导数,因变量对自变量的导数,默认或缺省自变量为t 、x  ?

    一元方程  多元方程  多元方程组  n个方程解n个未知量

    微分方程  一阶  高阶微分方程  一阶微分方程组

    一阶常微分方程:Dx/dt + x = e^t

    高阶常微分方程:d^2x/dt^2+dx/dt+x=e^2t

    一阶微分方程组(多元):

    dy/dt+x=e^2t

    dx/dt+2y-x=e^t

    初始条件:dy/dt0=...  dx/dt0=...  y0=...  x0=... 

    可以解出:y=f(t)=....    x=f(t)=....  两个方程解两个未知数(因变量)

    一个N阶(多元)微分方程可以写成(分解成)N个一阶微分方程(即微分方程组)

    如:

    x.. + 2x. -x = u

    令x.=x2; x=x1  则...

    微分方程的精确解: r=dsolve('eqn1','eqn2',...,'cond1','cond2',...,'var').

    数值解: [t,y]=solver('odefun',tspan,y0,options)

    1. 求精确解

    1.微分方程

    r=dsolve('eqn1','eqn2',...,'cond1','cond2',...,'var').

    该命令中可以用D表示微分符号,其中D2表示二阶微分,D3表示三阶微分,以此类推。

    解释如下:eqni表示第i个微分方程,condi表示第i个初始条件,var表示微分方程中的自变量,默认为t。

    1

    2

    3

    >> dsolve('Dy=3*x^2','y(0)=2','x')

      

    ans = x^3 + 2

     2.微分方程组

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    >> [x,y]=dsolve('Dx=y','D2y-Dy=0','x(0)=2','y(0)=1','Dy(0)=1')

      

    x =

      

    exp(t) + 1

      

      

    y =

      

    exp(t)

    3.求解微分方程组在初始条件(= 0)= 1, y (=0 )= 0 下的特解,并画出解函数的图像。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    >> [x,y]=dsolve('Dx+5*x+y=exp(t)','Dy-x-3*y=0','x(0)=1','y(0)=0','t')

      

    x =

      

    exp(t*(15^(1/2) - 1))*(15^(1/2) - 4)*((13*15^(1/2))/330 - exp(2*t - 15^(1/2)*t)*(15^(1/2)/165 + 1/22) + 1/22) - exp(-t*(15^(1/2) + 1))*(exp(2*t + 15^(1/2)*t)*(15^(1/2)/165 - 1/22) + (15^(1/2)*(15^(1/2) - 13))/330)*(15^(1/2) + 4)

      

      

    y =

      

    exp(-t*(15^(1/2) + 1))*(exp(2*t + 15^(1/2)*t)*(15^(1/2)/165 - 1/22) + (15^(1/2)*(15^(1/2) - 13))/330) + exp(t*(15^(1/2) - 1))*((13*15^(1/2))/330 - exp(2*t - 15^(1/2)*t)*(15^(1/2)/165 + 1/22) + 1/22)

      

    >> ezplot(x,y)

    1. ezplot与plot的区别

    plot(x,y)以x为横坐标,y为纵坐标绘制曲线

    plot(x,y1,x,y2,...)以x为横坐标值,以y1,y2...元素为纵坐标值绘制多条曲线

    plot中x,y的表达式是已知的或者是形如y=f(x)的表达式

    ezplot是画出隐函数图形,是形如f(x,y)=0这种不能写出像y=f(x)这种函数的图形,explot无需数据准备,直接画出函数图形

    1. 求近似解

    ode求解器

    求解器

    问题类型

    精度

    何时使用

    ode45

    非刚性

    大多数情况下,您应当首先尝试求解器 ode45

    ode23

    对于容差较宽松的问题或在刚度适中的情况下,ode23 可能比 ode45 更加高效。

    ode113

    低到高

    对于具有严格误差容限的问题或在 ODE 函数需要大量计算开销的情况下,ode113 可能比 ode45 更加高效。

    ode15s

    刚性

    低到中

    若 ode45 失败或效率低下并且您怀疑面临刚性问题,请尝试 ode15s。此外,当解算微分代数方程 (DAE) 时,请使用 ode15s

    ode23s

    对于误差容限较宽松的问题,ode23s 可能比 ode15s 更加高效。它可以解算一些刚性问题,而使用 ode15s 解算这些问题的效率不高。

    ode23s 会在每一步计算 Jacobian,因此通过 odeset 提供 Jacobian 有利于最大限度地提高效率和精度。

    如果存在质量矩阵,则它必须为常量矩阵。

    ode23t

    对于仅仅是刚度适中的问题,并且您需要没有数值阻尼的解,请使用 ode23t。 

    ode23t 可解算微分代数方程 (DAE)。

    ode23tb

    与 ode23s 一样,对于误差容限较宽松的问题,ode23tb 求解器可能比 ode15s 更加高效。

    ode15i

    完全隐式

    对于完全隐式问题 f(t,y,y’) = 0 和微分指数为 1 的微分代数方程 (DAE),请使用 ode15i

     

    1. 求解微分方程初值问题的数值解,求解范围为区间 [0,0.5] 。

    1. inline()通俗的来说就是用于定义函数,使用inline定义一个函数

    给a,b,x赋值即可得到y

    1

    2

    3

    4

    5

    6

    >> f=inline('a*x+b','a','b','x');

    >> f(1,2,3)

     

    ans =

     

         5

     

    1. 求常微分方程的数值解,MATLAB的命令格式为:
      [t,y]=solver('odefun',tspan,y0,options)
      其中solver选择ode45等函数名,odefun为根据待解方程或方程组编写的m文件名,tspan为自变量的区间[t0,tf],即准备在那个区间上求解,y0表示初始值,options用于设定误差限制。命令格式为:
      options=odeset('reltol',rt,'abstol',at)
      rt输入相对误差,at输入绝对误差。

     

    数值解是采用如有限元方法、数值逼近方法、插值方法等计算方法得到的解。只能利用数值计算的结果,而不能随意给出自变量并求出计算值。

    当无法藉由微积分技巧求得解析解时,这时便只能利用数值分析的方式来求得其数值解了。实际情况下,常微分方程往往只能求解出其数值解。

    在数学中,刚性方程是指一个微分方程,其数值分析的解只有在时间间隔很小时才会稳定,只要时间间隔略大,其解就会不稳定。

    目前很难去精确地去定义哪些微分方程是刚性方程,但是大体的想法是:这个方程的解包含有快速变化的部分。

    1. 解析解能求出x=f(t);数值解则需要制定t的某个值,如只能解出x在t=某个常数时的值,不能解出关于t的表达式。
    2.  

    y=dsolve('el,e2,..?,'c1,c2,..?,'v')

    其中’e1,e2,..'为微分方程或微分方程组;

    ’c1,c2,...’,是初始条件或边界条件;

    ’v'是独立变量,默认的独立变量是’t’;

    y返回解析解。如果没有初始条件,则求出通解,如

    果有初始条件,则求出特解。

    用字符串表示常微分方程,自变量缺省时为t,导数用

    D表示微分。y的2阶导数用D2y表示,依此类推。[T,Y,TE,YE,IE]=solver('odefun',tspan,y0,options)

    其中solver为ode23、ode45、ode113、ode15s、ode23s、

    ode23t、ode23tb函数;

    odefun是函数句柄;

    tspan微分定义区间;

    y0为初值行矩阵;

    T值是t序列(为列向量);

    Y值是微分方程的解Y在各点t的值(为列向量);

    TE表示事件发生时间,可缺省;

    YE表示事件解决时间,可缺省;

    IE表示事件消失时间,可缺省;

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

     

    1. 在微分方程的解析解法中,我们着重强调dsolve有很大的局限性,一般没法解决非线性微分方程,由此我们有了ODEs的数值解法
      其中
      微分方程的转化是解决所有问题的关键点,必须掌握了它,才能过使用ode**求解器
      在这里我们具体介绍下面的几种微分方程的数值解法
      1ODE解算器简介(ode**)   
      http://www.matlabsky.com/thread-528-1-1.html
      2微分方程转换  http://www.matlabsky.com/thread-534-1-1.html
      3刚性/非刚性问题(Stiff/Nonstiff)  http://www.matlabsky.com/thread-530-1-1.html
      4隐式微分方程(IDE)  http://www.matlabsky.com/thread-529-1-1.html
      5微分代数方程(DAE)  http://www.matlabsky.com/thread-531-1-1.html
      6延迟微分方程(DDE)  http://www.matlabsky.com/thread-532-1-1.html
      7边值问题(BVP)  http://www.matlabsky.com/thread-533-1-1.html
      在介绍上面其中常微分方程之前,我们有必要了解下Matlab中提供的求解ODEs的解算器ode**,知道这些函数的调用和参数意义。

     

    好,上面我们把MATLAB中的常微分方程(ODE)的解算器讲解的差不多了,下面我们就具体开始介绍如何使用上面的知识吧!
    现实总是残酷的,要得到就必须先付出,不可能所有的ODE一拿来就可以直接使用,因此,在使用ODE解算器之前,我们需要做的第一步,也是最重要的一步,
    借助状态变量将微分方程组化成Matlab可接受的标准形式(一阶显示常微分方程)!
    如果ODEs由一个或多个高阶微分方程给出,则我们应先将其变换成一阶显式常微分方程组
    下面我们以两个高阶微分方程构成的ODEs为例介绍如何将之变换成一个
    一阶显式常微分方程组
    step1.将微分方程的最高阶变量移到等式的左边,其他移到右边,并按阶次从低到高排列,假如说两个高阶微分方程最后能够显式的表达成如下所示:

    我们说过现实总是残酷的,有时方程偏偏是隐式的,没法写成上面的样子,不用担心Matlab早就为我们想到了,这个留在后面的隐式微分方程数值求解中再详细讲解!
    step2.为每一阶微分式选择状态变量,最高阶除外

    从上面的变换,我们注意到,ODEs中所有因变量的最高阶次之和就是需要的状态变量的个数最高阶的微分式(比如上面的x (m)和y(n))不需要给它一个状态变量
    step3.根据上面选用的状态变量,写出所有状态变量的一阶微分的表达式


    注意到,最高阶次的微分式的表达式直接就是step1中的微分方程
    ,到此为止,一阶显式常微分方程组,变化顺利结束,接下来就是Matlab编程了。请记住上面的变化很重要,Matla中所有微分方程的求解都需要上面的变换。
    下面通过一个实例演示ODEs的转换和求解

    【解】真是万幸,该ODEs已经帮我们完成了step1,我们只需要完成step2和step3了
    (1)选择一
    组状态变量

    (2)写出所有状态变量的一阶微分表达式

    (4)有了数学模型描述,则可以立即写出相应的Matlab代码了(这里我们优先选择ode45)

    1. x0=[1.2;0;0;-1.04935751];%x0(i)对应与xi的初值
    2. options=odeset('reltol',1e-8);%该命令的另一种写法是options=odeset;options.reltol=1e-8;
    3. tic
    4. [t,y]=ode45(@appollo,[0,20],x0,options);%t是时间点,y的第i列对应xi的值,t和y的行数相同
    5. toc
    6. plot(y(:,1),y(:,3))%绘制x1和x3,也就是x和y的图形
    7. title('Appollo卫星运动轨迹')
    8. xlabel('X')
    9. ylabel('Y')
    10.  
    11. function dx=appollo(t,x)
    12. mu=1/82.45;
    13. mustar=1-mu;
    14. r1=sqrt((x(1)+mu)^2+x(3)^2);
    15. r2=sqrt((x(1)-mustar)^2+x(3)^2);
    16. dx=[x(2)
    17.     2*x(4)+x(1)-mustar*(x(1)+mu)/r1^3-mu*(x(1)-mustar)/r2^3
    18.     x(4)
    19. -2*x(2)+x(3)-mustar*x(3)/r1^3-mu*x(3)/r2^3];
    20.  

     

     

     

    1. ode 是专门用于解微分方程的功能函数,他有ode23,ode45,ode23s等等,采用的是Runge-Kutta算法。ode45表示采用四阶,五阶runge-kutta单步算法,截断误差为(△x)^3。解决的是Nonstif(非刚性)的常微分方程。是解决数值解问题的首选方法若长时间没结果,应该就是刚性的,换用ode23来解。

     

    1. 例子

    展开全文
  • 刚性非刚性微分方程matlab详细解释 不错哦
  • 最近因科研工作需求,要用到Runge-Kutta Method二阶ODE,自己也懒得造轮子了,所以干脆就直接使用Matlab的内置函数ode45来解决(该内置函数基于Explicit Runge-Kutta Method)。于此处记录一下ode45的一些比较有效...

    ea7068323f8bcbdd7e54db81505e157b.png

    最近因科研工作需求,要用到Runge-Kutta Method解二阶ODE,自己也懒得造轮子了,所以干脆就直接使用Matlab的内置函数ode45来解决(该内置函数基于Explicit Runge-Kutta Method)。于此处记录一下ode45的一些比较有效的使用方法(主要是关于如何传入额外参数)。

    现用ode45求以下初始值问题的数值解,注意该方程组含有一个参数a(该参数a需要提前计算好,然后才能求解此方程组),

    equation?tex=y%27%27%2Bayy%27t%3D0%5C%5C+y%280%29%3D1%2Cy%27%280%29%3D2

    首先转化成一阶微分方程组,令

    equation?tex=y_1+%3D+y%5C%5C+y_2+%3D+y%27

    便得到

    equation?tex=y_1%27%3Dy_2%5C%5C+y_2%27%3D-ay_1y_2t

    初始条件为

    equation?tex=y_1%280%29%3D1%5C%5C+y_2%280%29%3D2

    相应的Matlab代码如下:

    sysODE.m - 该文件用来描述需要求解的一阶微分方程组。

    function [dydt] = sysODE(t,y,a)
    
    dydt = [y(2); -a*y(1)*y(2)*t];
    end

    demo.m - 该文件为主脚本,负责调用ode45以及sysODE这两个函数

    a = 10;
    [t,y] = ode45(@(t,y) sysODE(t,y,a), [0,1],[1,2]);
    
    plot(t,y(:,1))

    注意这里为了使表述简洁,直接给a赋值了,在许多实际问题中像a这样的参数可能需要经过很多计算步骤才能得到,这也是为什么需要这种传入参数的方法。

    运行demo.m得到该方程组的数值解:

    0905da4758eaf40a1cd6bad3cad67ddc.png
    数值解

    Reference

    [1] Differential Equations An Introduction to Modern Methods and Applications by James R. Brannan, William E. Boyce.

    [2] Matlab Help Center - ode45: https://www.mathworks.com/help/matlab/ref/ode45.html

    展开全文
  • 本人需要用ODE15s解一个微分方程组,形式如图中圈出来的。看过matlab help文件后还是不知道具体怎么使用,参数怎么设置。有没有大神能举个类似例子让我看一下。(我要的方程质量矩阵里面不是常数,包含了y) 看图...
  • 本文主要介绍matlab中求解常微分方程(组)的dsolve和ode系列函数,并通过例子加深读者的理解。 一、符号介绍  D: 微分符号;D2表示二阶微分,D3表示三阶微分,以此类推。 二、函数功能介绍及例程 1、dsolve ...

    本文主要介绍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。即可理解为步长

    odeMatlab专门用于解微分方程的功能函数。该求解器有变步长(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算法;其他采用相同算法的变步长求解器还有ode23ode45表示采用四阶-五阶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符号建立微分方程,并用龙格库塔法 ode45()直接进行数据计算 %SH760小轿车空载主要参数 clear; m=1340; a=1.54; b=1.29; l=a+b; Ic=2395;%绕质...
  • Matlab求常微分方程组的数值

    千次阅读 多人点赞 2020-03-08 09:50:50
    上篇博客介绍了Matlab求解常微分方程组解析的方法:博客地址 微分方程组复杂时,无法求出解析时,就需要求其数值,这里来介绍。 以下内容按照Matlab官方文档提供的方程来展开(提议多看官方文档) 介绍一下...
  • ode45解微分方程matlab运行 如何画dy(变化量的图),而不是y的图?
  • matlab解微分方程

    2020-02-11 23:15:55
    解微分方程组: x’=-x^3-y,x(0)=1 y’=x-y^3,y(0)=0.5 0<t<30 编辑器窗口: %M函数eg6_3fun.m function f=eg6_3fun(t,x) f(1)=-x(1)^3-x(2); f(2)=x(1)-x(2)^3; f=f(????;%注意要保证f为列向量 指令窗口: ...
  • 在数学建模中我遇到了两个数学学习中常见的两个问题,即解常微分方程与数值积分。下面我们来看这两个问题怎么在... 【例】解微分方程 初值条件为p(70)=0.8384 【解】 druo=@(p,ruo)(ruo/(0.0001*p^3-0.00...
  • 如图所示的方程时:![图片说明](https://img-ask.csdn.net/upload/202007/15/1594789822_485207.jpg) 求解x在[0 1]范围内的数值。 直接使用ode45函数时,未知C(0)值。 使用bvp4c函数时,又不知道如何...
  • MATLAB代码clear; %% 赋值及调用 tspan = [-50,50]; x0 = [0;0;0]; %初值 a = 0.2; b = 0.2; c = 2.5; %options = odeset('RelTol',1e-10,'AbsTol',[1e-10 1e-10 1e-10]); [t,x] = ode45(@myODE45,tspan,x0,[],a,b,...
  • 练习代码。使用四阶龙格库塔法求解常微分方程,分为了用户定义步长和自动变步长两种。并有一个使用案例,这两种算法的结果与ode45对比。
  • 本文主要介绍matlab中求解常微分方程(组)的dsolve和ode系列函数,并通过例子加深读者的理解。 一、符号介绍    D: 微分符号;D2表示二阶微分,D3表示三阶微分,以此类推。 二、函数功能介绍及例程 1、...
  • ode45函数无法求出解析,dsolve可以求出解析(若有),但是速度较慢. 1.      ode45函数 ①求一阶常微分方程的初值问题 [t,y] = ode45(@(t,y)y-2*t/y,[0,4],1); plot(t,y); ...
  • 微分方程的解析要求比较严苛,只有在特定的条件下才能写出解析表达式,而在现实的科研问题当中,绝大多数情况我们会采用数值(numeric solution)的方法来求解微分方程。这个时候就要用到ode方法了,ode是常...
  • MATLAB解一阶微分方程

    万次阅读 2018-05-09 20:16:54
    MATLABode45命令用4阶龙格-库塔解一阶微分方程(常系数/变系数)都能。 首先把微分方程化为dx/dt = f(x)的标准形式写成函数放在一个文件里,再写主程序用ode45调用这个文件。举例如下: 函数文件:方程的定义...
  • matlab求解常微分方程数值

    千次阅读 2017-08-16 19:06:27
    求解如下常微分方程组,其中有s和i两个变量 首先声明这个函数文件 function y=infect(t,x) lamp=11; u=3; y=[lamp*x(1)*x(2)-u*x(1),-lamp*x(1)*x(2)]'; x(1)代表i x(2)代表s 利用ode45对其求数值 ode...
  • matlab中的微分方程

    千次阅读 2013-11-11 22:01:18
    Matlab提供了解决包括解微分方程在内的各种类型问题的函数:  1. 常规微分方程(ODEs)的初始值问题  初值问题是用MATLAB ODE求解器解决的最普遍的问题。初始值问题最典型的是对非刚性度(?nonstiff)问题应用...
  • ode45函数无法求出解析,dsolve可以求出解析(若有),但是速度较慢.1.ode45函数①求一阶常微分方程的初值问题[t,y] = ode45(@(t,y)y-2*t/y,[0,4],1);plot(t,y);求解 y’ – y + 2*t / y且初值y(0) = 1的常微分...
  • MATLAB - 微分方程

    2020-04-19 11:37:36
    Solving Ordinary Differential Equations with MATLAB Solving Ordinary Differential Equation Numerically ode45 with two outputs [tSol,ySol] = ode45(@odefun,tspan,y0) Outputs tSol A vector con...
  • matlab求解微分方程ode23

    千次阅读 2020-08-20 09:08:34
    1.ode23: 显式的单步Runge-Kutta低阶(2阶到3阶)解法。适用具有一定难度对精度要求不高,或者f(t,y)...Tspan = [t0,tN]是常微分方程求解区域;或具体节点. 例:linspace(a,b,step) y0是表示初始条件 例1: function t

空空如也

空空如也

1 2 3 4 5 6
收藏数 117
精华内容 46
关键字:

matlabode解微分方程

matlab 订阅