2

我正在尝试学习如何使用 MATLAB 求解微分方程组(洛伦兹方程)并将每个解绘制为 t 的函数

X’ = −σx + σy  
Y’ = ρx − y − xz
Z’ = −βz + xy

其中σ = 10, β = 8/3, 和ρ = 28, 以及x(0) = −8, y(0) = 8, 和z(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); -β x(3) +
x(1)*x(2)];

4

1 回答 1

3

这实际上是一个很好的第一次尝试!

问题是当你按下Run按钮(或按下 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
于 2017-01-09T22:36:14.480 回答