找回密码
 注册
关于网站域名变更的通知
查看: 1041|回复: 3
打印 上一主题 下一主题

请问怎样用MATLAB求解微分方程组并画出解函数图?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-20 10:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
求解微分方程组,画出解函数图。% {8 e1 [9 ^5 A- H/ |+ F8 Q$ W

& B9 u) _% r. Kx'= -x^3-y, x(0)=1     
* n) G: g6 Z) N& xy'= x-y^3, y(0)=0.5   0<t<30
3 E6 }, J9 T" l% N. @请教高手指点给出程序与结果,谢谢. }) H- F7 ]7 E2 ^
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-4-20 13:34 | 只看该作者
    本帖最后由 yin123 于 2020-4-20 13:36 编辑
    5 ?6 ^- W/ s5 n; C* y
    . a) x% l% c8 B' L0 N8 ?; b% l碰巧正好学习了微分方程解法3 Z* ?0 v' ]- l' I7 r: F% |
    matlab内置的函数(数值解法)有ode系列,help一下就可以了
    # A: t+ m: \! o3 t如果你上的是有关数字分析的课程,我猜老师的意思应该让你自己写代码
      Y' a1 F) K! R- a我分别尝试了Euler法 梯形法 四阶RK法  代码如下:
    $ D2 k# }! p0 {' l; m, W; A% U; l8 M以y‘=|sin2x、,y(0)=1为例:! M8 y: n& B' {) T/ O# c' [
    & I0 [7 j/ \' _6 _  n
    编写一阶导数m文件:
    5 V! v% m3 r+ T6 b" J' z1 v
    * O* x0 [' Y; R/ E%一阶常微分方程的m文件
    , f0 \# f- \% [; s- N5 qfunction y1=myfun(x,y)' u5 [. Y6 G5 ^7 g6 [, W% w& p
    y1=abs(sin(2*x));
    : \! `8 l+ Z0 y2 @3 I' V& ~/ i7 O/ }

    6 T0 P; y8 f$ |# T
    & x6 I) T! J1 @1 H/ [# bEuler法:
    + l+ M- Q1 x: n0 ?8 _+ a: c9 M5 c3 R! v  E1 U; R: B) `1 V9 Z
    %向前差分Euler法解常微分方程' F! Z& d8 H+ M, B
        %fun:f(x)的一阶导数m文件
    2 F, {7 T1 s0 ~    %x0,xt:自变量的初值和终值4 E; E9 r$ Y/ P; j+ h
        %y0:f(x)在x0处的值. \, a# l# |( m7 J- \5 p. K
        %h:步长
      O; A3 ^: `: Qfunction [Eulerx,Eulery]=MyEuler(myfun,x0,xt,y0,h)* d- o/ g( t8 ~5 \3 C
    x=(x0:h:xt)';%定义自变量数组
    5 A" ]0 `5 s. u4 I  ]% f# Ky(1,: )=y0;%初始化因变量数组9 Z% I  c! _# l& @
    for k = 1:length(x)-1
    1 K: A0 D- x; [  D& q' V    f=feval(myfun,x(k),y(k,: ));%计算每个迭代点的一阶导数值
    ( U+ i6 s, e# K" }- |3 [    f=f(: )';
    / C- ]6 ^1 y' B! ?2 `3 J    y(k+1,: )=y(k,: )+h*f; %向前迭代8 ]0 V2 m( ]8 G( q
    end5 J1 ^, t" }  t6 H
    Eulerx=x;4 Z/ [( k0 [5 n/ V
    Eulery=y;$ y5 W$ K/ \. Y- T" Y( w! U* x

    ) ]' P8 H& D" f0 a+ Q8 R- n/ `, T9 \# y" b" z. {8 T" P* ]/ O
    梯形法:
    ( b+ E9 G& _% {$ |" _  A+ {1 s. A  o/ }+ Y; s1 S* v
    %梯形法解常微分方程8 W* b  d1 h+ ~( `8 T- O
        %fun:f(x)的一阶导数m文件" {' ]5 s& v/ R3 P3 G' O6 B
        %x0,xt:自变量的初值和终值" [4 J- ~) L" \9 K% H. ?% A/ N
        %y0:f(x)在x0处的值
    8 I: M8 q* {5 D" v    %h:步长- ?' Y2 i; \4 q) q5 x
    function [Tixingx,Tixingy]=MyTixing(myfun,x0,xt,y0,h)
    9 t& r) ?" P  c/ l) T/ H, f: fx=(x0:h:xt)';%定义自变量数组: p8 i7 i. \6 `' T  J9 N
    y(1,: )=y0;%初始化因变量数组
    / K4 c! }& N* ~Y(1,: )=y0;%中间量
    " E% Z4 O* j/ z8 {; vfor k=1:length(x)-16 ?9 j& @& A$ _* `8 ?
        f=feval(myfun,x(k),y(k,: ) );%计算每个迭代点的一阶导数值, d) U( p$ Z7 }3 _7 }/ E2 J/ ^# w
        f=f(: )';
    - x$ c1 R) W4 p( R+ H    Y(k+1,: )=y(k,: )+h*f; %y0(n+1)
    & B. x6 N8 [  G6 L. z% x    F=feval(myfun,x(k+1),Y(k+1,: ));%计算每个迭代点的一阶导数值5 I' W& K0 ~! o: d$ C( @
        F=F(: )';
    0 d5 s+ _* C2 c" Y. w, X6 C    y(k+1,: )=y(k,: )+0.5*h*(f+F); %y(n+1)) v) R$ v& f1 C: ]
    end  `- `# B( y% u3 l. S( x
    Tixingx=x;5 _9 E9 i% e) d
    Tixingy=y;$ j# P7 V6 I& p$ ^% w+ W6 }

    5 X" Y% x5 }1 n1 H# B# \% e* B1 ^6 h9 K
    四阶RK法:8 x) Q5 @) t4 B/ ?
    . K. n" g" T# g# R* T' _' q
    %四阶Runge-Kutta法解常微分方程
    4 [  h  D' m/ t  U    %fun:f(x)的一阶导数m文件
    7 [4 K$ B( ^) o, t) n    %x0,xt:自变量的初值和终值; ^- s2 N1 z1 v' M0 s9 U$ y$ g
        %y0:f(x)在x0处的值
    . l: p; I7 f: e! B9 l. C8 t    %h:步长
    - O7 M2 r4 c2 K1 _1 wfunction [RK4x,RK4y]=RK4(myfun,x0,xt,y0,h)
    . d, N" f8 `$ V( A" X3 tx=(x0:h:xt)';%定义自变量数组[code]clear all;clc;
    # t6 K' [; t5 j1 x# T( nx0=0;xt=2*pi;%x0,xt:自变量的初值和终值. _. x4 n" Q: I0 E$ L4 X
    y0=1;%y0:f(x)在x0处的值' ^; q0 u1 r& |  I" n# J
    h=0.2;%h:步长
    ; R, Z5 ?: Q0 Y0 t[Eulerx,Eulery]=MyEuler(@myfun,x0,xt,y0,h);%欧拉法, _) B0 I; _1 F) z1 }) z
    a=fliplr(Eulery');%求算f(22*pi)
    : {8 d* J% i& u6 F( py_Euler=a(1);
      n+ T( z0 m$ R, d  \" O9 ~[Tixingx,Tixingy]=MyTixing(@myfun,x0,xt,y0,h);%梯形法
    ' Z* W! ~& q3 Z8 L' Ea=fliplr(Tixingy');%求算f(22*pi)
    ; x3 b6 q" _  M* P# P  t+ g' Q& P6 b$ ny_Tixing=a(1);
    ' Z' E- F, }; U, X  T[RK4x,RK4y]=RK4(@myfun,x0,xt,y0,h);%四阶Runge-Kutta法法
    1 V/ ?7 @6 F( s6 I- Oa=fliplr(RK4y');%求算f(22*pi)
    ; }0 m) W$ \7 x* ?/ x2 I, Z) F$ Hy_RK4=a(1);
    * q7 E' Q4 U$ ~/ d" u3 O. r  i[ode45x,ode45y]=ode45(@myfun,[x0:h:xt],[1]);%matlab内置函数. `9 B1 V! o% S9 n
    a=fliplr(ode45y');%求算f(22*pi)
    6 M4 F' L9 P+ l1 ?: B0 K* vy_ode45=a(1);
    7 O. y3 \1 C# G  ^0 M+ _  yfigure;, d. e9 j4 G$ @
    figure_FontSize=18; %修改字体2 W1 j3 n2 e' R# ^& G" z. s
    plot(Eulerx,Eulery,'ro',Tixingx,Tixingy,'g*',RK4x,RK4y,'bd',ode45x,ode45y,'ks','LineWidth',2);%做图
    ! F$ }4 P2 L4 ~" ylegend('Euler','Tixing','RK4','ode45');%图例
    * H. ]1 {! j) mY=[y_Euler,y_Tixing,y_RK4,y_ode45];- R) m9 A4 z7 e" x& j9 h: F
    axis([x0 xt y0 max(Y)]); %定义坐标轴范围, e: ?$ t) ?$ b
    label1={'方法';'Euler';'Tixing';'RK4';'ode45'};4 @$ W% H' }% `( d$ i
    label2={'y(2π)';y_Euler;y_Tixing;y_RK4;y_ode45};
    " G4 H/ G7 \% y% label=[label1,label2];: }7 W1 |+ B9 A4 Z5 ~2 O. K# r
    text(x0+0.1*(xt-x0),0.8*max(Y),label1); %显示y(2π)# d) F6 c& u3 m" z  p
    text(x0+0.3*(xt-x0),0.8*max(Y),label2);4 s" i7 [% B& |  x8 e6 G

    * n0 c! l; j) x+ m) P# F: f$ m" X1 J% w
    y(1,: )=y0;%初始化因变量数组9 ?! C9 [3 V  t6 v1 [
    for k=1:length(x)-1
    + }% p6 j; _' y, p; @    K1=feval(myfun,x(k),y(k,: ));%计算系数
    4 g  Z# b" q9 h. i4 W0 Y    K2=feval(myfun,x(k)+0.5*h,y(k,: )+0.5*K1');
    ) B* Z  X1 P$ X9 ^    K3=feval(myfun,x(k)+0.5*h,y(k,: )+0.5*K2');8 m1 m4 ~3 z: V
        K4=feval(myfun,x(k)+h,y(k,: )+h*K3');
    + i2 [9 m' C! A8 J$ \- _    y(k+1,: )=y(k,: )+(1/6)*h*(K1'+2*K2'+2*K3'+K4');%迭代
    8 B0 v4 W8 Y6 {9 y; cend
    ( }% c8 s" I2 i/ Y. |  ORK4x=x;
    + c/ y6 l2 b/ TRK4y=y;

    该用户从未签到

    3#
    发表于 2020-4-20 13:39 | 只看该作者

    ( L) X3 }2 X' r& ]7 Z" l" m" M楼主的图用Forcal绘制,代码:
    • !using["XSLSF"];                //使用命名空间XSLSF
    • //数组xArray存放x的值;ti为当前有效值的个数;tmax为ti对应的时间;tmin为起始时间。
    • xt(t:k:xArray,ti,tmax,tmin)=
    • {
    •   k=(t-tmin)/(tmax-tmin)*ti-1,
    •   if[k<0, k=0], if[k>=ti, k=ti-1],
    •   xArray.getrai[k]
    • };
    • //数组yArray存放y的值;ti为当前有效值的个数;tmax为ti对应的时间;tmin为起始时间。
    • yt(t:k:yArray,ti,tmax,tmin)=
    • {
    •   k=(t-tmin)/(tmax-tmin)*ti-1,
    •   if[k<0, k=0], if[k>=ti, k=ti-1],
    •   yArray.getrai[k]
    • };
    • //函数定义,用于计算微分方程组中各方程右端函数值,连分式法对微分方程组积分一步函数pbs1将调用该函数f。
    • //t为自变量,x,y为函数值,dx,dy为右端函数值(即微分方程的值)。
    • f(t,x,y,dx,dy)=
    • {
    •   dx=-(x^3)-y,
    •   dy=x-y^3
    • };
    • //用连分式法对微分方程组进行积分,获得理论值。
    • //t1,t2为积分的起点和终点。
    • //h,s为自动变量。
    • //模块变量:hf为函数f的句柄,要预先获得该句柄;Array为工作数组;step为积分步长;eps为积分精度。
    • 积分(t1,t2:h,s:hf,Array,step,eps)=
    • {
    •   s=ceil[(t2-t1)/step],        //计算积分步数
    •   h=(t2-t1)/s,                 //重新计算积分步长
    •   {   pbs1[hf,t1,Array,h,eps], //对微分方程组积分一步
    •       t1=t1+h                  //积分步长增加
    •   }.until[abs(t1-t2)<h/2]      //连续积分至t2
    • };
    • 数据(:i,h,t1,t2,x,y,static,free:hf,Array,step,eps,max,xArray,yArray,ti,tmax,tmin)= //微分方程组积分获得数据
    • {
    •   if[free,delete(Array),delete(xArray),delete(yArray),return(0)],
    •   hf=HFor("f"),                               //模块变量hf保存函数f的句柄,预先用函数HFor获得该句柄
    •   step=0.01,eps=1e-6,                         //积分步长step要合适,积分精度eps越小越精确,用于对微分方程组积分一步函数pbs1
    •   Array=new[rtoi(real_s),rtoi(2*15)],         //申请工作数组
    •   max=1001,
    •   xArray=new[rtoi(real_s),rtoi(max)],         //申请工作数组
    •   yArray=new[rtoi(real_s),rtoi(max)],         //申请工作数组
    •   Array.setra(0,1,0.5),                         //设置积分初值,通过模块变量Array传递,Array是一个数组
    •   xArray.setra(0,1),                          //设置xArray的第一个值
    •   yArray.setra(0,0.5),                          //设置yArray的第一个值
    •   ti=1, h=step*3, tmin=0, tmax=0, t1=0, t2=h,
    •   i=1,(i<max).while{
    •     积分(&t1,t2),                             //从t1积分到t2
    •     Array.getra(0,&x,&y),                     //从数组Array获得t2时的积分值
    •     xArray.setra(i,x), yArray.setra(i,y),     //将积分值保存到数组
    •     ti=i+1, tmax=t1, t2=t2+h,
    •     i++
    •   }
    • };
    • //绘制函数图形
    • (::hxt,hyt)= hxt=HFor("xt"), hyt=HFor("yt");  //获得函数xt和yt的句柄,保存在模块变量中
    • gleDrawScene[HFor("Scene")],stop();      //设置场景绘制函数后退出
    • Scene(::hxt,hyt,tmax,tmin)=
    • {
    •     glClear[],                           //清除屏幕以及深度缓存
    •     glLoadIdentity[],                    //重置视图
    •     glTranslated[0,0,-20],               //移动坐标,向屏幕里移动10个单元
    •     glColor3d[0,0,1],                    //设置颜色
    •     fgPlot[hxt,tmin,tmax,FG_Y,-1,2],   //绘制一元函数图象
    •     glColor3d[1,0,0],                    //设置颜色
    •     fgPlot[hyt,tmin,tmax,FG_Y,-1,2]    //绘制一元函数图象
    • };  W$ L# h; V7 O0 M
    3 y: h- x4 f  {% F  ]; y9 S3 Z
    # o' X' t$ R- x3 e  L6 D  z/ ~

    2 x9 N- p; {- h. j+ r5 m' r7 ^
    . I$ m2 L4 j8 v9 w
      z" t5 g: ?" e  s4 W/ y9 A+ W+ R$ E# s- c2 W5 ]# ]+ D

      i6 Y( a* [2 S3 P* }: M1 \4 Q* l
    6 a; M" h; I) ?7 @% l

    该用户从未签到

    4#
    发表于 2020-4-20 13:39 | 只看该作者
    用1stOpt更简单:4 Q6 ^- p. H* ^+ k
    • Variable t=[0:0.2:30],x=1,y=0.5;
    • Plot x,y;
    • ODEFunction x'= -x^3-y, y'= x-y^3;) Z2 J( T1 `- M$ P% i
    ) \" P% f4 A$ N* P
    ; _- q% J; G9 D) E8 N+ `! k- z

    9 f8 A: B6 b) e9 O3 a3 @, ]4 n
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-22 15:55 , Processed in 0.125000 second(s), 27 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表