这是代码
global a b c
a=35
b=3
c=28
for R = a-3 : a+3
for N = b-2 : b+2
for L = c-2 : c+2
a=R;
b=N;
c=L;
ode_interupt_demo
plot3(x(:,3), x(:,2), x(:,1));
S= [R N L]
pause(1)
close
end
end
end
function dxdt=fun1(t,x)
global a b c
dxdt(1)=a*(x(2)-x(1));
dxdt(2)=(c-a)*x(1)-x(1)*x(3)+c*x(2);
dxdt(3)=x(1)*x(2)-b*x(3);
dxdt=dxdt';
end
function status = interuptFun(t,y,flag,interupt_time) %#ok<INUSL>
persistent INIT_TIME;
status = 0;
switch(flag)
case 'init'
INIT_TIME = tic;
case 'done'
clear INIT_TIME;
otherwise
elapsed_time = toc(INIT_TIME);
if elapsed_time > interupt_time
clear INIT_TIME;
str = sprintf('%.6f',elapsed_time);
error('interuptFun:Interupt',...
['Interupted integration. Elapsed time is ' str ' seconds.']);
end
end
function ode_interupt_demo
tspan = [0 10]; y0 = [0.5 1 1];
interupt_time = 10;
outputFun= @(t,y,flag)interuptFun(t,y,flag,interupt_time);
opts = odeset('AbsTol',1e-8,'RelTol',1e-5,'OutputFcn',outputFun);
try
[t,x] = ode45(@fun1,tspan,y0,opts);
catch ME
if strcmp(ME.identifier,'interuptFun:Interupt')
disp(ME.message);
% Do other things
else
rethrow(ME); % It's possible the error was due to something else
end
end
在Matlab中我正在解决微分方程,但有时需要ode45
很长一段时间才能返回。我使用this post中建议的代码来解决我的类似问题,但它不会从ode45
返回值。相反,我得到
???未定义的变量x。
==&gt;中的错误goo at 13
plot3(x(:,3),x(:,2),x(:,1));
答案 0 :(得分:2)
错误正是它所说的......未定义的变量x
。您还没有在代码中的任何位置定义它,但是您可以在第13行立即开始使用它。但是,在第13行之前有一个函数调用,看起来在那里执行了ODE求解......但是你和#39;不从函数调用中返回x
。请记住,函数中定义的任何变量都属于局部范围。这意味着退出时,先前声明的那些变量将消失...除非您创建变量global
或persistent
。
因为您想在函数调用之后使用x
,修复代码最简单的方法是修改函数定义,使其返回x
,并将x
赋给在使用函数调用之前,它是函数调用的输出。
因此,请修改您的ode_interupt_demo
函数声明,以便它执行此操作:
function x = ode_interupt_demo
接下来,让第12行执行此操作:
x = ode_interupt_demo;
代码现在可以正常工作。