Matlab - 有时ode45需要很长时间才能返回

时间:2015-05-24 05:32:01

标签: matlab ode

这是代码

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));

1 个答案:

答案 0 :(得分:2)

错误正是它所说的......未定义的变量x。您还没有在代码中的任何位置定义它,但是您可以在第13行立即开始使用它。但是,在第13行之前有一个函数调用,看起来在那里执行了ODE求解......但是你和#39;不从函数调用中返回x。请记住,函数中定义的任何变量都属于局部范围。这意味着退出时,先前声明的那些变量将消失...除非您创建变量globalpersistent

因为您想在函数调用之后使用x,修复代码最简单的方法是修改函数定义,使其返回x,并将x赋给在使用函数调用之前,它是函数调用的输出。

因此,请修改您的ode_interupt_demo函数声明,以便它执行此操作:

function x = ode_interupt_demo

接下来,让第12行执行此操作:

x = ode_interupt_demo;

代码现在可以正常工作。