我正在尝试学习如何使用MATLAB求解微分方程组(Lorenz方程),并将每个解作为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); -beta x(3)+
X(1)* X(2)];
答案 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