zoukankan      html  css  js  c++  java
  • MATLAB求解常微分方程:ode45函数与dsolve函数

    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的常微分方程初值问题,返回自变量和函数的若干个值.

    若不写返回值,则会自动作出函数随自变量的变化图像.

    ode45(@(t,y)y-2*t/y,[0,4],1);


    ②求解一阶微分方程组

    x’ = -x^3-y,x(0)=1

    y’ = x-y^3,y(0)=0.5.

    自变量为t,且0<t<30.

    求解过程如下.

    第一步,在M函数文件中将函数x和函数y写成向量形式.

    function f = fun(t,x);

    f(1) = -x(1)^3 – x(2);

    f(2) = x(1) – x(2)^3;

    f = f(:);%确保f为列向量.

    第二步,在M脚本文件中求解.

    [t,x] = ode45(@fun,[0,30],[1;0.5]);

    subplot(1,2,1);plot(t,x(:,1),t,x(:,2),':');xlabel('t');ylabel('x/y');%作x和y随t变化图

    subplot(1,2,2);plot(x(:,1),x(:,2));xlabel('x');ylabel('y');%作x和y的相位图

    第三步,在命令窗口运行M脚本文件中的代码.


    ③求解高阶常微分方程组

    将高阶常微分方程组通过变量替换转化为一阶的常微分方程组,然后用ode45求解.


    2.      dsolve函数

    ①求解析解

    y’ = a*x + b;

    s = dsolve('D2y=a*y+b*x','x');

    D2y用以表示y的二阶导数,默认是以t为自变量的,所以最好指明自变量为x.


    ②初值问题

    y’ = y – 2*t / y , y(0) = 1;

    s = dsolve('Dy == y - 2*t / y','y(0) ==1');


    ③边值问题

    x*y’’ – 3*y’ = x^2 , y(1) = 0 , y(5) = 0;

    s = dsolve('x*D2y - 3*Dy ==x^2','y(1)=0','y(5) == 0','x');

    函数最后一个参数指明自变量为x.


    ④高阶方程

    求解y’’ = cos(2x) – y , y(0) = 1 , y’(0) = 0;

    s=dsolve('D2y == cos(2*x) - y','y(0) =1','Dy(0) = 0','x');

    simplify(s);


    ⑤方程组问题

    f’ = f + g , g’ = -f + g,f(0) = 1, g(0) =2;

    [f,g]= dsolve('Df == f + g','Dg = -f + g','f(0)==1','g(0) == 2','x');
  • 相关阅读:
    RPC
    动词 or 名词 :这是一个问题 【转载】
    js 如何清除setinterval
    封装动画特效
    飞入特效
    建字段_添加数据_生成json.php
    mybatis由浅入深day02_9.3.5使用生成的代码_9.4逆向工程注意事项
    mybatis由浅入深day02_9逆向工程
    mybatis由浅入深day02_8spring和mybatis整合
    mybatis由浅入深day02_7.4mybatis整合ehcache_7.5二级缓存应用场景_7.6二级缓存局限性
  • 原文地址:https://www.cnblogs.com/tensory/p/6590783.html
Copyright © 2011-2022 走看看