zoukankan      html  css  js  c++  java
  • 求解高阶微分方程

    ODE45 求解高阶微分方程

    最近困惑我一周的高阶微分方程求解,特地来总结一下,给有需要的同志们!

    (特此说明,官网有纰漏, 存在问题, 需要修改, 我最后会说哪里出问题了)

    ode45是什么

    ​ 所有 MATLAB ODE 求解器都可以解算 y′=f(t,y) 形式的方程组,或涉及质量矩阵 M(t,y)y′=f(t,y) 的问题。求解器都使用类似的语法。ode45 是一个通用型 ODE 求解器,是您解算大多数问题时的首选。但是,对于刚性问题或需要较高准确性的问题,其他 ODE 求解器可能更适合。

    ode45能干什么

    ​ 求解几乎能遇到的大多数微分方程, 一阶,二阶,三阶甚至多阶微分方程

    ode45怎么用

    语法

    [t,y] = ode45(odefun,tspan,y0)
    [t,y] = ode45(odefun,tspan,y0,options)
    [t,y,te,ye,ie] = ode45(odefun,tspan,y0,options)
    

    只知道语法远远不够, 因为里面各个项都不知道是什么,先简要介绍,下面给个demo:

    odefun就是使用代换法,将你高阶方程转化为一阶方程对应的函数;
    tspan就是微分的解范围, 尽量缩小, 不然电脑要爆炸;

    y0是你能计算的方程解;

    高阶 ODE通用解法

    MATLAB ODE 求解器仅可解算一阶方程。您必须使用常规代换法,将高阶 ODE 重写为等效的一阶方程组

    y1=y

    y2=y

    y3=y′′

    这些代换将生成一个包含 n 个一阶方程的方程组

    y′1=y2

    y′2=*y3          *

    y′n=f(t,y1,y2,...,y**n*).

    Demo1

    考虑三阶 ODE

    y′′′−y′′y+1=0.

    使用代换法

    y1=y

    y2=y

    y3=y′′

    生成等效的一阶方程组

    y′1=y2y′2=y3y′3=y*1 y3−1.

    此方程组的代码则为

    function dydt = f(t,y)
    dydt(1) = y(2);
    dydt(2) = y(3);
    dydt(3) = y(1)*y(3)-1;
    

    问题来了

    上面demo这样定义函数不能用; 正确做法你得先定义向量解, 毕竟高阶方程化为一阶以后, 解应该是以向量的形式出现的; 所以, 这一步非常关键;

    则以上方程组代码应该修改为:

    function dydt = f(t,y)
    dy = zeros(3,1);  %记住这里要添加哦; 
    dydt(1) = y(2);
    dydt(2) = y(3);
    dydt(3) = y(1)*y(3)-1;
    

    行吧, 其余的计算可以去参考官网了, 可以很方便的获得方程的各个解哦;

    matlab真的是除了不能生孩子,啥都能干;

    ps: 吐槽一点,matlab太费电了。mac满电正常续航六个小时以上,跑matlab这个程序半个多小时就会没电, 所以大家还是连接电源再去跑matlab;

    结果图展示

    image-20200306224911284

  • 相关阅读:
    移动web图片高度自适应的解决方案
    高性能滚动 scroll 及页面渲染优化
    Web学习之跨域问题及解决方案
    apply和call用法
    ES6学习之箭头函数
    JS 对象封装的常用方式
    为Array对象添加一个去除重复项的方法
    最全的常用正则表达式大全
    前端如何实现图片懒加载(lazyload) 提高用户体验
    菜鸟教程 Missing parentheses in call to 'print'
  • 原文地址:https://www.cnblogs.com/liguo-wang/p/12431557.html
Copyright © 2011-2022 走看看