用Matlab或计算求解耦合微分方程

0 matlab differential-equations

通过Mat-lab或计算求解耦合非线性微分方程

equation 1:   x'(t) = -a* x(t) /(x(t) + y(t))
equation 2:   y'(t) = -b* y(t) /(x(t) + y(t))
Run Code Online (Sandbox Code Playgroud)

我试过mathematica,但得到了一个非常复杂的解决方案.

Solve[{x'[t] == -a* x[t] /(x[t] + y[t]), y'[t] == -b* y[t] /(x[t] + y[t])}, {x, y}, t]
Run Code Online (Sandbox Code Playgroud)

我该怎么画呢?

我的初始条件是

 x(0) = xo
 y(0) = yo
Run Code Online (Sandbox Code Playgroud)

此外,a和b是常数.

在插入a和b的值之后,我必须绘制x和y wrt t.(a = 2,b = 5说)

Ras*_*man 6

在这种情况下需要注意很多事情:

  1. 您需要创建一个包含a和b的函数:

    function dy =soProblem(t,y,a,b)
        dy=[-a*y(1)/(y(1)+y(2)); -b*y(2)/(y(1)+y(2))];
    end
    
    Run Code Online (Sandbox Code Playgroud)
  2. 调用标准的ode函数:

    a = 2;
    b = 5; tend = 10; x0 = 1; y0 = 2;
    [T,Y] = ode45(@(t,y)soProblem(t,y,a,b),[0 tend],[x0 y0]);
    plot (T,Y)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 意识到你手上可能有一个僵硬的等式.

  4. 获得识别理想函数调用的乐趣:

    [T15,Y15] = ode15s(@(t,y)soProblem(t,y,a,b),[0 tend],[x0 y0]);
    [T23t,Y23t] = ode23t(@(t,y)soProblem(t,y,a,b),[0 tend],[x0 y0]);
    [T23tb,Y23tb] = ode23tb(@(t,y)soProblem(t,y,a,b),[0 tend],[x0 y0]);
    %note ode23s doesn't converge (or at least takes forever)
    plot (T,Y,T15,Y15,T23t,Y23t,T23tb,Y23tb)
    
    Run Code Online (Sandbox Code Playgroud)
  5. 理解为什么mathematica变得焦躁不安