我要加入 登录
声振论坛 返回首页

无水1324的个人空间 http://home.vibunion.com/?672 [收藏] [复制] [分享] [RSS]

日志

matlab求解微分方程[转载]

热度 1已有 1946 次阅读2007-11-28 12:48 |个人分类:matlab

matlab求解微分方程——个人总结

其实不算是总结了,而是自己的初学笔记。
       资料:help
建议:可以先看例子。我刚开始看这一节,也是晕晕乎乎莫名其妙 。看的时候,至少也要把代码运行一下,亲自看看结果的结构
ODE部分--------ODE--->ordinary differential equations
总述一下
1、ODE的求解器
       ODE的求解器有很多,在help里可以查到。列出了每一种求解器的适应范围(stiff或者nonstiff)以及它采用的数学原理,比如Runge-Kutta,Adams,NDFs之类。(这个在数值分析课中会学到,可惜偶当时觉得很无聊,后悔中)。
      大家有时间多去了解了解,懂了来给大家分享分享
      如果不懂那么多理论,优先采用ode45,如果你发现它计算的效率特别低下或者是计算根本出不来,则可能是stiff问题了,则考虑换ode15s
      这部分后面还会涉及,这里就不多说了。
                       sol = ode45(@yourfun,[tmin,tmax],[y0,y0'])
                                          你的公式    积分范围    初值
引用:
sol=ode45(@vdp1,[0,20],[2,0]);
把以上代码命令行里直接执行,这是matlab自带的一个例子。在workspace里你会看到多了一个变量叫sol.没错这就是求解器的返回值。它是一个1*1的结构体。双击它,你会看到它的内部组织,各个field以及它们的“形状”。每一个你都可以双击它,继续深入看它的结构。我现在关心的只有X,Y
solver
extdata,
x,
y,
stats,
idata
================================================================================
2、求解计算完毕后,我们可以做什么
      首先,当然是得到结果。
      deval(sol,x,1)
       sol如上,是返回来的handles。x是一组向量,是你期望求值的点。数字1就表示你要求第一行的值(不明白什么叫第一行,就去双击sol,再双击y),如果去掉1,则返回矩阵,也就是所有y的值。
引用:
sol=ode45(@vdp1,[0,20],[2,0]);
x=linspace(0,20,100);
y=deval(sol,x,1);
plot(x,y);
此外,我们还可以扩展,matlab叫做odextend。扩展什么?
         odextend(sol,odefun,tfinal)
       看到最后一个变量名了吧,t_final 这样明显一点。在之前的基础上继续计算到新的t_final。默认以上次计算的y终值(你在workspace双击sol,再双击y,拉到最右边。),作为此次计算的初值。
         odextend(sol,odefun,tfinal,yinit)
      当然,如果你想重新给它赋初值,也可以加入参数yinit。(友情提示:获取上次计算的Y的终值:y=sol.y(:,end))
引用:
sol=odextend(sol,@vdp1,20);
plot(sol.x,sol.y(1,)
=====================================================================================      
3、求解器的参数设置   也 就是option这个东西
        要设置的话,可以用odeset这个命令。怎么用?
       option=odeset('name1',value1,'name2',value2......) (matlab所有参数设置基本上都是这种形式)
                    name自然就是属性名字。value就是你赋予它的值。求解器可以设置哪些参数,而设置了这些参数有什么影响,而这些参数应该则么设置。在命令行里输入 help odeset 。看到的绝对比我讲得详细。所以我不多说了。(友情提醒,如果使用ode15什么来着,可以为它设置Jacobian这个参数,以更快更准更好的求解。如何设置,不懂的话,偶过后会贴。)
        O=odeget(option,'name')
        编过GUI的话这两个命令再熟悉不过了

用ode系列可以求解Y对T的微分函数,可以涉及多阶微分。
      1、函数形式:y‘=f(t,y)   这种我叫它显性函数
                         f(t,y,y')=0  隐函数,这种用ode15i求解
      2、对于求解微分问题都要为其指定初值
                   得到:  y'=f(t,y)
                                  y(t0)=y0
      3、ode只能直接求解一阶微分,那我有多级微分怎么办呢?学过现代控制理论就知道怎么处理了
            不学也不影响,基本上就是把 一个N阶微分方程转化为N个一阶微分方程组
                          比如y'''=f(t,y,y',y'')
                          y1'=y2
                          y2'=y3
                          y3'=f(t,y1,y2,y3)
基本例子Examples: Solving Explicit ODE Problems
附:谁解释下 van der Pol 是什么东西,这么特殊?范德蒙?不像呀
          
           mu是个标量值
     首先,转化为一阶阵
              
     接着,写它的function(这里mu取了1.原因后面会说)
                
             附:内容如此,形式可以多样
                             比如dydt=zeros(2,1);
                                      dydt(1)=…… %第一个
                                      dydt(2)=…… %第二个
       最后,应用求解 
                       
                   参数解释过了。@是指将vdp1这个function的handles传递过来。
                (附:func2str, str2func真是个好东西)
                       t是返回的“时间”向量,也就是积分轴向量(也就是sol里面那个x,这里是列向量形式)
                       y是返回的结果(sol里面的y,只不过这里是列向量的形式,而sol里面是行向量形式)

        另外,查看结果
                    这里引用结果 y(:,1)    注意与sol.y的引用区别     
                                 
          看到它怎么打mu这个字母了吧?help里有关于这种特殊的字符或者样式的表。忘记在哪里了,我以后找找。
 

发表评论 评论 (2 个评论)

回复 health 2008-3-13 20:48
van der Pol 是范德波尔方程,是一种典型的非线性方程,使范德波尔在研究电子管振荡电路时提出来的方程
回复 wangjianbao11 2011-4-29 22:11
谢谢各位大哥哥的分享

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 我要加入

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-8 13:50 , Processed in 0.034666 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部