• 网志分类
  • » 查看所有日志 (553)
    » 杂记 (108)
    » VC (33)
    » 工控 (7)
    » FPGA (88)
    » Matlab (196)
    » 数值计算 (18)
    » 其他学习 (51)
    » 个人简介 (10)
    » 私人空间 (18)
    » 四方朋友 (11)
    » MATLAB好书推荐 (7)
    » 被遗忘的角落 (6)
  • 站内搜索
  • 友情链接
  • » 我的歪酷 非非共享界
    » 爸妈网
    » 醒醒
    » 圈圈
    » 一溜烟儿
    » 亚丁小屋
    » EDA专业论坛
    » 哈工大萝卜驿站
    » 王茜英语在线翻译
    » 仿真论坛MATLAB板
    » 研学之路-混沌序列建模
    » mathworks的文件交换站
    » MATLAB M-Files DataBase
    » mathtools.net
    » Kernel Machines
    » MATLAB ToolBox
    » Boosting Research
    » Chih-Jen Lin's Libsvm
    » Support vector machine
    » mathworks/support/product/
    » http://www.sciencedirect.com

    订阅 RSS

    歪酷博客

    0808949

    « 上一篇: How do I increase the amount of memory for MATLAB 6.5.1 (R13SP1) on Windows? 下一篇: 从任意个数中选择出指定个数数的组合问题--zz »
    山城棒棒儿军 @ 2004-05-01 10:43

    第8节 方程系统
    I. 一个常规微分方程系统包括一些微分方程,这些方程依赖于其他的方程,例如:

                      
    这是个相当简单的例子,它可能通过解析解法或者数值解法求解。通常情况下,解析方法对很多系统都是不可用的。对于线性系统,将这些方程以矩阵的形式改写,如下所示:


    具体内容请参阅Gilber Strang的“Introduction to Linear Algebra and Its Application"一书获得详细的信息。
    本技术手册着重在于常规微分方程的数值解法。为了用数值解法解决上面方程系统,建立函数定义改变向量y的比率。

    function  dy=exampleode(t,y)
    % function to be integrated
    dy=zeros(2,1);
    dy(1)=y(1)+y(2);
    dy(2)=y(1);   %  选择(?Alternatively)
    % A=[1 1;1 0];  dy=A*y;


    利用MATLAB提供的数值求解器函数,先采用ODE45:
    xspan = [0 10];
    ynot  = [1 0];
    [X,Y]=ode45(@exampleode,xspan,ynot);
    这建立了一个时间向量X(或者X的表达式)以及相应的Y向量,简单地说就是在时间X取得Y。在上面的例子中,Y的第一列为u,第二列是v。plot(X,Y):

    II. 考虑这个二阶系统

         
    第一步:通过引入向量将这个二阶ODEs变成一阶系统  


    第二步:将上面的那个方程系统改写成如下


    将这在MATLAB中写成如下的形式:
       function dy = secondode(x,y)
       % function to be integrated
       dy = zeros(4,1);
       dy(1) = y(2);
       dy(2) = -3*y(1)- exp(x)*y(4) + exp(2*x);
       dy(3) = y(4);
       dy(4) = -y(1) – cos(x)*y(2)+ sin(x);
    注意:记得将变量x改成t(它是简单独立变量)。


    好,现在用ODE45解这个系统,初始状态 u(0) = 1; u'(0) = 2; v(0) = 3; v'(0) = 4;从x = 0 开始迭代到x = 3 。你需要用到下面的命令:
      xspan = [0 3];
      y0 = [1;2;3;4];
      [x,y] ode45(@secondode,xpan,y0); % y的第一列是关于x的u的值,y的第二列
    %是u'的值,如此类推
      plot(x,y); legend('u','u’','v','v’'):

    III. 考虑下面的方程系统


             
      其中,A,B,C与D是矩阵,y是向量。例如:
             
      你可以降低方程的阶次,采用数值求解。首先定义
              
      这样就可以将(1)式改写为
    http://foto.yculblog.com/genial/ode9.JPG.jpg        
    注意:对于隐含(?implicit)求解器,例如ODE15S,ODE23T和ODE23TB,你可以将A表示成质量矩阵(?mass matrix),这是微分代数方程经常做的。
    你可以写成 如下形式。
    http://foto.yculblog.com/genial/ode10.JPG.jpg
    你可以通过这些来链接ODE45或者另外的ODE求解器来求取数值解。例如,假设矩阵A,B,C,D如下:

    可以用ODE45解这个系统如下:
    function dy = matrixode(t,y)
    % function to be integrated
    dy = zeros(4,1);
    dy(1) = y(3);
    dy(2) = y(4);
    dy(3) = -0.5*y(1)-y(2)+0.5*y(3)+y(4);  % 原文此处有小错
    dy(4) = -0.5*y(1)+0.5*y(3)+1;


    带有初识条件 x1(0) = 9, x2(0)=7,x1'(0)=5,x2'(0)=3,时间范围是 t=0到t=5,解决这个系统的命令如下:
     tspan = [0 5];
     x_init = [ 9; 7; 5; 3];
     [t,x] = ode45(@matrixode,tspan,x_init);
    将x(2)的值用红色画出,x2'(t)的值用绿色画出,采用的命令如下:
    plot(t,x(:,2),'r-',t,x(:,4),'g-');
    绘出图形如下页所示。



    补充实例:



    %------------------------------------------------------------------------
    % 根据方程组写微分方程如下:
    %
    function  dudt=changode(t,u)
    dudt=zeros(6,1);  
    dudt(1)=u(4);
    dudt(2)=u(5);
    dudt(3)=u(6);
    dudt(4)=-2*u(1)-u(2)-u(4)+3*sin(t);
    dudt(5)=0.5*u(1)-u(2)+0.5*u(4)-0.5*u(6)+sin(t);
    dudt(6)=(1/3)*(-4*u(3)-u(5))+2*sin(t);
    dudt=dudt(;
    %――――――――――――――――――――――――――――――――――

    调用ode45求解该方程组,并画出结果图:
    function  changpingpin
    u0=[-1;-3;-2;1;2;3];
    tspan=[0 20];
    [t,u]=ode45(@changode,tspan,u0);
    plot(t,u(:,1),t,u(:,2),t,u(:,3));
    legend('u(1)','u(2)','u(3)');
    xlabel('t');
    ylabel('u');
    结果图:



    最新评论 (点击这里查看更早的所有评论...)


    阳伞

    2004-06-05 13:56

    feng的问题我也遇到过。可能是你把function函数定义和最后的数值计算过程(ode45)写在一个M文件里了。建议你把function的定义写在一个M文件中(文件名与函数名保持一致),数值计算过程写在另一个M文件中。



    fengdragon

    2004-07-06 22:04

    山城棒棒儿军,
         你好,我有一个问题困扰很久了。能否帮我看看?
    我要解一个偏微分方程组,用线上求解法空间离散后,得到一组常微分方程组。但这个常微分方程组比较麻烦,它的初值为0,但离散后的空间第一个点的是知道的,相当于是一个边值问题。就是说边值问题与初值问题混到一块。我不好处理。能否将我的程序或者方程发给你呢?



    山城棒棒儿军

    2004-07-07 00:03

    实在抱歉
    我最近也很不爽
    文章还没有搞定
    实在有必要先把我自己的稀饭吹凉了再说

    你可以到水木或者是紫丁香的相应版面去问问看
    祝好运



    南大书艾

    2004-12-01 20:49

    不知道你的第四篇何时才能出炉哪?我想看看你如何介绍“刚性”的问题,因为我被这个东西困扰很久了。在生物过程模拟中,应该用什么ode哪?



    wangyx

    2005-01-04 16:59

    这个地方真得很好,我是第一次来到这里,就被吸引住了,我想请教一下有关刚性的问题,我的模型是一个微分方程组的初值问题,我的初值是一个单位矩阵,想问一下:经过积分后的解是否应该是线性无关的解呢?matlab里面的ode15s命令我试过了,解不是无关的,哪有什么好的方法能得到该处置问题的基解矩阵吗?谢谢了



    Genial

    2005-01-04 18:01

    很抱歉的是
    我以前对微分方程的求解基本上也只是限于对基本的微分方程的求解,类似于你们所问的刚性问题,我并没有看过更多的资料,只是局限于help和mathworks的technotes上的帮助,就是用ode15s等求解,其他的我也不清楚。希望知道的朋友给予援助。谢谢



    oak

    2005-11-05 06:36

    山城棒棒儿军,
    你好,我有一个问题,自己用了很长时间还是没搞定,只能请教大虾你了,希望不吝赐教.
    Dx1=x2
    Dx2=x2-x1-(1-2/E)*(x1-x3)+cos(t)
    Dx3=x4
    Dx4=x4-x3-(1-2/E)*(x1+x3)+sin(t)
    其中E=sqrt(x1^2+x3^2)



    非比

    2006-05-16 10:39

    山城棒棒儿军,我有问题想问你,不知你还在不在,可否为我答疑



    莎莎

    2006-08-06 15:16

    不知道你还在不在,我是刚开始自学的,想问你个问题,怎么解初值问题,
    比如y'=y-2x/y   0<x <=1
    那个x的范围我不知道该怎么弄



    Genial

    2006-08-06 17:05

    发了份儿这个的电子档完整资料,希望你看完后有用


    评论 / 个人网页 / 扔小纸条
    *昵称

    已经注册过? 请登录

    Email
    网址
    *评论