zoukankan      html  css  js  c++  java
  • 解微分方程+ode求解器

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

    求精确解

    1.微分方程

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

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

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

    x^3 + 2

     2.微分方程组

    >> [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.求解微分方程组在初始条件x (= 0)= 1, y (=0 )= 0 下的特解,并画出解函数的图像。

    >> [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)
    

     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无需数据准备,直接画出函数图形

    求近似解

    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] 。

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

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

    >> f=inline('a*x+b','a','b','x');
    >> f(1,2,3)
    
    ans =
    
         5
    

     求常微分方程的数值解,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输入绝对误差。

    参考:https://wenku.baidu.com/view/b4a6fecc6aec0975f46527d3240c844768eaa06f.html

  • 相关阅读:
    世界充满神秘的不平衡:创业中的“二八”法则
    树立个人品牌:从名字开始
    房子,心中的痛
    今生,谁会是我最美丽的新娘
    失败不是创业的结束,因为有了你们,这世界才璀璨(转载)
    再等五百年
    名字作诗:为您的名字增添一份色彩
    揭开爱情的外衣
    李子楠(帮客户名字作诗)
    爱上你,早已是命中注定
  • 原文地址:https://www.cnblogs.com/zuiaimiusi/p/11329549.html
Copyright © 2011-2022 走看看