使用ODE45解决ODE系统

时间:2017-01-09 21:11:28

标签: matlab ode ode45

我正在尝试学习如何使用MATLAB求解微分方程组(Lorenz方程),并将每个解作为t

的函数绘制。
X’ = −σx + σy  
Y’ = ρx − y − xz
Z’ = −βz + xy

其中σ = 10β = 8/3ρ = 28,以及x(0) = −8y(0) = 8z(0) = 27

以下是我正在使用的代码:

function xprime = example(t,x)

sig    = 10;
beta   = 8/3;
rho    = 28;
xprime = [-sig*x(1) + sig*x(2); 
           rho*x(1) - x(2) - x(1)*x(3); 
          -beta*x(3) + x(1)*x(2)];

x0    = [-8 8 27]; 
tspan = [0 20]; 
[t,x] = ode45(@example, tspan, x0);

figure 
plot(t,x(:,1)), hold on
plot(t,x(:,2)), hold on
plot(t,x(:,3)), hold off

然而,这会产生错误,我该如何解决?我不确定缺少哪些输入参数或我哪里出错。我感谢任何帮助,谢谢。

  

没有足够的输入参数。

     

示例中的错误(第9行)      xprime = [ - sig x(1)+ sig x(2); rho * x(1) - x(2) - x(1) x(3); -beta x(3)+
     X(1)* X(2)];

1 个答案:

答案 0 :(得分:3)

这实际上是一次非常好的尝试!

问题是当你按下运行按钮(或按F5)时,你没有参数调用函数example;这就是MATLAB所抱怨的。

第二个问题是,即使您能够运行这样的函数,ode45也会调用函数example,这将调用ode45,这将调用example,它将调用ode45,依此类推,直到达到递归限制。

两者的解决方案是将其拆分为两个函数(这些函数可以写入同一个M文件中):

% top-level function; no arguments
function caller() 

    x0    = [-8 8 27]; 
    tspan = [0 20]; 
    [t,x] = ode45(@example, tspan, x0);

    figure 
    plot(t,x(:,1)), hold on
    plot(t,x(:,2)), hold on
    plot(t,x(:,3)), hold off

end

% The derivative 
function xprime = example(t,x)

    sig    = 10;
    beta   = 8/3;
    rho    = 28;
    xprime = [-sig*x(1) + sig*x(2); 
               rho*x(1) - x(2) - x(1)*x(3); 
              -beta*x(3) + x(1)*x(2)];              
end