• 【Matlab】一、解常微分方程ODE


    求解常微分方程 ODE

    ​ 在matlab中,我们可以求解常微分方程的解析解,和数值解,一般使用dsolve来求解常微分方程的解析解,使用类似于ode45的求解器来求解常微分方程的数值解。

    (1)求解解析解

    求解解析解,例如求解该方程的解析解
    d y d x = 3 x 2 + 1 \frac{dy}{dx}=3x^2 + 1 dxdy=3x2+1
    只需要在命令行中输入

    dsolve('Dy=3*x^2+1', 'x')
    
    • 1

    或者是加上初始条件,求该方程在该初始条件下的解
    d y d x = 3 x 2 , y ∣ x = 0 = 2 \frac{dy}{dx}=3x^2, y|_{x=0}=2 dxdy=3x2,yx=0=2
    在命令行输入

    dsolve("Dy = 3*x^2", "y(0)=2", "x")
    
    • 1

    例如求一个常微分方程组
    { x ˙ = y , y ¨ − y ˙ = 0 , x ∣ t = 0 = 1 ; y ˙ ∣ t = 0 = 1 \left\{

    x˙=y,y¨y˙=0,x|t=0=1;y˙|t=0=1" role="presentation">x˙=y,y¨y˙=0,x|t=0=1;y˙|t=0=1
    \right. {x˙=y,y¨y˙=0,xt=0=1;y˙t=0=1
    在命令行输入

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

    (2)求解数值解

    求数值解,有一些非线性的常微分方程是不能求出解析解的,我们一般求取其在一段区间内的数值解,采用迭代的方式来求解数值解,ode是matlab专门用于解微分方程的功能函数,具体的说明如下:

    ode45是解决问题的首选,如果长时间没有结果,那么则采用ode15s试试。下面介绍ode45的函数格式

    %函数格式  
    %[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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    首先得将微分方程标准化,类似于选择状态变量写状态空间表达式,对于一般的微分方程

    { F ( y , y ˙ , y ¨ , … , y ( n − 1 ) , t ) = 0 y ( t 0 ) = c 0 , y ˙ ( t ) = c 1 , … , y ( n − 1 ) ( t 0 ) = c n − 1 \left\{

    F(y,y˙,y¨,,y(n1),t)=0y(t0)=c0,y˙(t)=c1,,y(n1)(t0)=cn1" role="presentation">F(y,y˙,y¨,,y(n1),t)=0y(t0)=c0,y˙(t)=c1,,y(n1)(t0)=cn1
    \right. {F(y,y˙,y¨,,y(n1),t)=0y(t0)=c0,y˙(t)=c1,,y(n1)(t0)=cn1

    首先选择选择一组微分作为状态变量

    x = [ x 1 x 2 x 3 ⋮ x n ] = [ y y ˙ y ¨ ⋮ y ( n − 1 ) ] \bold x =

    [x1x2x3xn]" role="presentation">[x1x2x3xn]
    =
    [yy˙y¨y(n1)]" role="presentation">[yy˙y¨y(n1)]
    x=x1x2x3xn=yy˙y¨y(n1)

    然后将待求解的微分方程 F ( y , y ˙ , y ¨ , … , y ( n − 1 ) , y n , t ) = 0 F(y,\dot{y},\ddot{y},\dots,y^{(n-1)},y^n,t)=0 F(y,y˙,y¨,,y(n1),yn,t)=0,写成 y n = G ( y , y ˙ , y ¨ … , y n − 1 , t ) = G ( x 1 , x 2 , x 3 … , x n , t ) y^{n}=G(y,\dot{y},\ddot{y} \dots,y^{n-1}, t)=G(x_1,x_2,x_3 \dots,x_{n},t) yn=G(y,y˙,y¨,yn1,t)=G(x1,x2,x3,xn,t)的形式,然后写出 x ˙ \dot{\bold x} x˙

    x ˙ = [ x 1 ˙ x 2 ˙ x 3 ˙ ⋮ x n ˙ ] = [ y ˙ y ¨ ⋮ y ( n − 1 ) y ( n ) ] = [ x 2 x 3 x 4 ⋮ G ( x 1 , x 2 , x 3 … , x n , t ) ] \bold{\dot{x}} =

    [x1˙x2˙x3˙xn˙]" role="presentation">[x1˙x2˙x3˙xn˙]
    =
    [y˙y¨y(n1)y(n)]" role="presentation">[y˙y¨y(n1)y(n)]
    =
    [x2x3x4G(x1,x2,x3,xn,t)]" role="presentation">[x2x3x4G(x1,x2,x3,xn,t)]
    x˙=x1˙x2˙x3˙xn˙=y˙y¨y(n1)y(n)=x2x3x4G(x1,x2,x3,xn,t)

    上述步骤便是我们需要在odefun中完成的,举一个示例:在时间区间 t = [ 3.9 , 4 ] t=[3.9,4] t=[3.9,4],求解微分方程

    y ′ ′ = − t y + e t y ′ + 3 s i n 2 t , y ∣ t = 3 = 8 , y ′ ∣ t = 3 = 2 y''=-ty+e^ty'+3sin2t, y|_{t=3}=8, y'|_{t=3}=2 y=ty+ety+3sin2t,yt=3=8,yt=3=2
    那么即
    x ˙ = [ x [ 1 ] − t ∗ x [ 1 ] + e t ∗ x [ 2 ] + 3 s i n 2 t ] \bold{\dot{x}} =

    [\boldx[1]t\boldx[1]+et\boldx[2]+3sin2t]" role="presentation">[\boldx[1]t\boldx[1]+et\boldx[2]+3sin2t]
    x˙=[x[1]tx[1]+etx[2]+3sin2t]

    %在odefun.m脚本文件中完成以下内容
    function dxdt = odefun(t, x)
    	dxdt = zeros(2, 1);  %初始化为 2 x 1的零矩阵
    	dxdt(1) = x(2);
    	dxdt(2) = -t*x(1)+exp(t)*x(2)+3*sin(2*t);
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    %在main.m脚本文件中完成以下内容
    tspan = [3.9, 4];
    y0 = [8, 2];
    [t, y] = ode45('odefun', tspan, y0);	%x的第一列为y,第二列为y’。如果遇到变量不是列向量形式的,可以考虑利用reshape函数做矩阵变换。
    plot(t, y(:,1), '-o', t, y(:,2), '-*');
    legend('y', "y'");
    xlabel('t');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    MFC 学习笔记
    mysql内存会持续上涨,每天增加一点,一直到100%
    C++ 多态
    JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来2 —— Ehcache的各种项目集成与使用初体验
    项目实践《小说网站数据爬取》
    CDGA考试-2022年最新模拟题一套100道题(含答案)
    掌动智能:UI自动化测试工具的五大功能
    SpringMVC 学习(六)乱码问题
    nodejs+Vue+python电子商务电商后台管理系统java
    操作系统——内存扩容:覆盖技术、交换技术(王道视频p44)
  • 原文地址:https://blog.csdn.net/qq_44940689/article/details/128175950