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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求解微分方程组,画出解函数图。
4 o9 h) O4 A- q  b) x! o' w: U% l& O% b5 W$ r
x'= -x^3-y, x(0)=1     
  r  c( t' L! W0 Uy'= x-y^3, y(0)=0.5   0<t<30
9 S; L: I, ?. Q( F' ^8 k  I请教高手指点给出程序与结果,谢谢
6 j" O- C; U5 h; G( n% ~
  • TA的每日心情

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

    [LV.1]初来乍到

    2#
    发表于 2020-4-20 13:34 | 只看该作者
    本帖最后由 yin123 于 2020-4-20 13:36 编辑 ! \* m7 j: |+ K" T8 g

    & b! b  g4 d, C& e碰巧正好学习了微分方程解法
      _2 {: B6 E; Q9 _# Z& S# m  f4 Pmatlab内置的函数(数值解法)有ode系列,help一下就可以了
    ( f6 w8 r- }% S0 L" }) x5 l" r' K' \& }如果你上的是有关数字分析的课程,我猜老师的意思应该让你自己写代码" t! @7 n/ C* l
    我分别尝试了Euler法 梯形法 四阶RK法  代码如下:
    % T9 F- _& C4 |7 h以y‘=|sin2x、,y(0)=1为例:
    ' J# Q- w' H: \0 l3 V$ }- w( s- w) y9 B
    编写一阶导数m文件:. I4 W2 L: ~. u4 I8 a; @( C! D; V

    9 ?) B, m! T; H- b. n) u$ W%一阶常微分方程的m文件
    " z* o4 k4 s% `; Vfunction y1=myfun(x,y)
    ; e! W4 N, i$ a, q; ky1=abs(sin(2*x));
    * d1 c( S& g9 F3 \8 [2 b. M9 a* Y0 ?6 e2 `
    # r9 C% r9 S( X5 P

    ' v# O% {! c2 |( ?( y; r2 a( OEuler法:  C0 U& T0 M/ b& ]( x* Q9 y

    : n+ ~; C# W5 p* l. d8 o4 w9 Z. d%向前差分Euler法解常微分方程
      |( Z) W: p+ y" P# h/ m    %fun:f(x)的一阶导数m文件
    6 P. c% A* S% }  o    %x0,xt:自变量的初值和终值; P! q% K" s. K- P, p) m
        %y0:f(x)在x0处的值
    6 e/ a, a- y% `+ y9 _    %h:步长/ t+ k' A2 @! ^& ^4 y+ e: H; b+ k: ~0 S
    function [Eulerx,Eulery]=MyEuler(myfun,x0,xt,y0,h)
    ) T" C1 x+ B+ s. M( Cx=(x0:h:xt)';%定义自变量数组
    $ @, e- L6 I' R. w5 s1 J2 y4 Z+ Ny(1,: )=y0;%初始化因变量数组
    ; X  b0 D) S# C# [& Z/ rfor k = 1:length(x)-11 C5 S5 m8 c2 n9 S! j3 @+ g% x
        f=feval(myfun,x(k),y(k,: ));%计算每个迭代点的一阶导数值. c2 p+ o: l: M  S( K3 A
        f=f(: )';
    : ?" F5 W# U  z/ o! x5 Z8 A    y(k+1,: )=y(k,: )+h*f; %向前迭代) d+ Y1 c& Y$ z) ^
    end
    9 O) L$ s8 P* P  g5 c$ I$ V( MEulerx=x;
    ' E" C( j4 p; O+ N3 j& [$ d( s4 F0 uEulery=y;; w. B' n" @, s( E: }' P

    5 R) o: b, ?4 V4 J% U0 M. G: ~
    , y% R: V+ P9 N梯形法:
    6 Y; C1 O' {. y7 w
    % l, I8 E& T6 W5 _, k* U  ~%梯形法解常微分方程1 M3 Y6 p! N$ G: l  h/ n
        %fun:f(x)的一阶导数m文件
    , I$ R4 J6 |' M    %x0,xt:自变量的初值和终值2 ^. s0 p( x3 R, t
        %y0:f(x)在x0处的值+ v6 A9 H  |3 h3 K$ L
        %h:步长/ P6 G2 ?: U) m- A
    function [Tixingx,Tixingy]=MyTixing(myfun,x0,xt,y0,h), r1 I. ^9 L" O: u
    x=(x0:h:xt)';%定义自变量数组
    - h2 w+ u; t" `4 py(1,: )=y0;%初始化因变量数组
    0 E. v1 G$ p. XY(1,: )=y0;%中间量; Q  n# O; }1 i) l
    for k=1:length(x)-1" [5 d# g: u6 @2 |" v
        f=feval(myfun,x(k),y(k,: ) );%计算每个迭代点的一阶导数值0 \) V5 f2 g$ ?5 b
        f=f(: )';
    3 Q, y4 C, x+ s! g    Y(k+1,: )=y(k,: )+h*f; %y0(n+1)$ x- J. i: U& E! Y3 n
        F=feval(myfun,x(k+1),Y(k+1,: ));%计算每个迭代点的一阶导数值
    % i, k9 X  |$ L- z* ^    F=F(: )';
    ! [; M8 f) c/ p+ ]1 `5 j    y(k+1,: )=y(k,: )+0.5*h*(f+F); %y(n+1)
    / P$ p# M* ~( S  u* Iend
    , t3 _/ W- c- X0 H8 c; [: t! UTixingx=x;
    $ ^2 l2 x( f, S9 n9 I8 b+ b! eTixingy=y;
    # H( e8 [7 s* l& y% R5 r7 A0 M9 e2 O) a9 y1 {+ [) \: T4 y

    % z: e1 D7 O4 E3 d5 a9 F四阶RK法:
      i! K- e! ]; L" h* A+ H  a
    ' i' u! y: Z1 ?8 h%四阶Runge-Kutta法解常微分方程
    ( x/ \' l) M, \2 y' H+ \2 s    %fun:f(x)的一阶导数m文件
    / X0 }2 b4 c% r- y    %x0,xt:自变量的初值和终值* o! z) h; U0 D! `2 S
        %y0:f(x)在x0处的值
    * P2 z8 X; L6 r$ t' l    %h:步长2 v. ~7 z/ @4 d) ]
    function [RK4x,RK4y]=RK4(myfun,x0,xt,y0,h)
    ! X& B/ D# d4 o# Tx=(x0:h:xt)';%定义自变量数组[code]clear all;clc;
    / v& @# n- C3 k) Q  t. }7 Ax0=0;xt=2*pi;%x0,xt:自变量的初值和终值
    $ c' `5 A) h6 B. h) {2 E4 ~5 by0=1;%y0:f(x)在x0处的值4 [1 W- h% \8 Y  C" P* ?
    h=0.2;%h:步长
    , p7 u  j7 l) x7 W[Eulerx,Eulery]=MyEuler(@myfun,x0,xt,y0,h);%欧拉法
    / B* l- X8 p: F+ D. F( n& Y0 _a=fliplr(Eulery');%求算f(22*pi)5 P9 Q8 C+ i2 A' m
    y_Euler=a(1);6 @. u$ j$ L' O! v0 V( t
    [Tixingx,Tixingy]=MyTixing(@myfun,x0,xt,y0,h);%梯形法
    * U) i% Y; Q, wa=fliplr(Tixingy');%求算f(22*pi)
    ( r3 N- R9 a1 I; ey_Tixing=a(1);# \. E% P& l; ]4 v6 k
    [RK4x,RK4y]=RK4(@myfun,x0,xt,y0,h);%四阶Runge-Kutta法法; k! \4 h% }$ z. o/ a8 W
    a=fliplr(RK4y');%求算f(22*pi)0 p  _! Q' [: X' e
    y_RK4=a(1);  ]( K7 [. p! I% E2 H: i
    [ode45x,ode45y]=ode45(@myfun,[x0:h:xt],[1]);%matlab内置函数
    ' Z1 n6 a: T; V( Fa=fliplr(ode45y');%求算f(22*pi)
    * N* @& F; O# U$ r6 {) Dy_ode45=a(1);! ^+ @- T1 o# L1 Y2 f
    figure;0 a# x# l6 _0 V9 _
    figure_FontSize=18; %修改字体
    - N6 `) P5 [- ?1 w  Fplot(Eulerx,Eulery,'ro',Tixingx,Tixingy,'g*',RK4x,RK4y,'bd',ode45x,ode45y,'ks','LineWidth',2);%做图
    # I' D1 @% R% P: C5 h& Clegend('Euler','Tixing','RK4','ode45');%图例
    9 n0 V0 [6 v1 F0 b9 l+ LY=[y_Euler,y_Tixing,y_RK4,y_ode45];
    7 x( j  L& A+ Z! a8 Naxis([x0 xt y0 max(Y)]); %定义坐标轴范围8 M/ x( Y; v! Q7 D: g  n( m
    label1={'方法';'Euler';'Tixing';'RK4';'ode45'};
    % E  ~0 }$ l6 I& q8 ~( O" }/ elabel2={'y(2π)';y_Euler;y_Tixing;y_RK4;y_ode45};
    1 h* _8 X" O2 r1 j3 {1 m% label=[label1,label2];
    $ R, N# l! _3 s2 u2 utext(x0+0.1*(xt-x0),0.8*max(Y),label1); %显示y(2π). v4 C" T' B! E5 Z
    text(x0+0.3*(xt-x0),0.8*max(Y),label2);5 Y. ~4 r! d6 ^: n7 s6 n
    " q) m- k) w: f2 }3 M+ \

    3 p& i4 d& ^/ }3 Vy(1,: )=y0;%初始化因变量数组! N2 i+ _  L- z9 D4 u
    for k=1:length(x)-1' S; ?. A; P2 B% u( O+ [
        K1=feval(myfun,x(k),y(k,: ));%计算系数" w0 q3 G2 `+ n2 p3 Q3 V
        K2=feval(myfun,x(k)+0.5*h,y(k,: )+0.5*K1');
    ) s* L) l! U: o% J    K3=feval(myfun,x(k)+0.5*h,y(k,: )+0.5*K2');
    7 M7 H% t# [) f$ I* n' `7 u8 h    K4=feval(myfun,x(k)+h,y(k,: )+h*K3');, R/ p: X9 j- x
        y(k+1,: )=y(k,: )+(1/6)*h*(K1'+2*K2'+2*K3'+K4');%迭代
    2 w* V6 l2 ~! v  _& E8 K* c& ~6 Wend
    / G8 b3 v/ L" w2 b& U' ?  c( z* pRK4x=x;$ V6 {  Q! [  E& Q& e
    RK4y=y;

    该用户从未签到

    3#
    发表于 2020-4-20 13:39 | 只看该作者
    * i6 `; O& N3 G/ l
    楼主的图用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]    //绘制一元函数图象
    • };1 V8 {2 o, y; ?& `5 H
    % r8 `/ s% z6 f3 s# e' a4 `

    6 u% K% o6 p/ k
    & F2 g4 Q+ ]" K" F! z; `: S% G" V  l( |; z# {& [
    3 \$ G9 r5 f$ Y( q. k3 M9 v
    ; h. G; x2 h: W& g5 V( J

    6 w5 c; x  Y9 h- d: g+ O: `. J5 L2 J5 L; O
    6 w( Z$ R* P4 b" s2 K

    该用户从未签到

    4#
    发表于 2020-4-20 13:39 | 只看该作者
    用1stOpt更简单:
    # D7 x8 s  W' ~% @, ^; l6 }4 y8 z+ c+ t5 T
    • Variable t=[0:0.2:30],x=1,y=0.5;
    • Plot x,y;
    • ODEFunction x'= -x^3-y, y'= x-y^3;
      + Q; ?8 v( P! g1 w- a$ @0 t8 |4 v

    , L( A: K5 L. a7 [3 t7 R4 h

    + o; U0 R; v) L! \2 x: y/ s, |8 j7 W# @( p; A! w3 X
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-23 07:47 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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