2017-01-09 41 views
1

我想学习如何使用MATLAB解微分方程(Lorenz系统)的系统,并绘制每个解决方案作为t的函数常微分方程的系统解决在使用ODE45

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

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

+0

你递归 - 是故意的,还是...? –

+0

也许,我只是因为我不知道写一个更好的方法。 – Tina

回答

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