3

当 ODE45 的解发散时(不管为什么和如何),将显示以下警告,并且求解器无法继续:

警告:在 t=8.190397e+01 失败。如果不将步长减小到低于时间 t 允许的最小值 (2.273737e-13),则无法满足积分容差。

我在矩阵(大量输入)上运行 ode45,所以我想自动找出发生上述条件(失败)的输入。我的意思是,ode45 返回的这种情况是否有任何其他迹象可以自动写入数组?可以在if语句中使用的东西:

if {some variable is returned/is equal to ...} then {the solver has failed}

自动识别那些错误的输入,而无需寻找显示的警告。

4

2 回答 2

5

您可以将其warning转换为error,并且错误可以被try/catch块捕获。

一个例子:

% Change this particular warning into an error
warnId = 'MATLAB:ode45:IntegrationTolNotMet';
warnstate = warning('error', warnId);    

% That can be caught with try/catch
try     
    % Quick-failing integration, suggested by horchler
    [t,y] = ode45(@(t,y)[y(1)^2;y(2)],[0 1],[1;1]);

catch ME
    % Check if we indeed failed on meeting the tolerances
    if strcmp(ME.identifier, warnId)

        % DO YOUR STUFF HERE

    else
        % Something else has gone wrong: just re-throw the error
        throw(ME);
    end

end

% Don't forget to reset the warning status
warning(warnstate);

您可以通过该命令获得warnId任何警告。lastwarn有关错误,请参阅lasterr

于 2013-07-09T12:43:36.087 回答
0

另一种方法是检查 ode45 能够运行多长时间。例如,如果您运行

[x,t] = ode45(@some_ode,[t0,tf],x0);

然后在执行此行之后,只需检查 t(end) 的值。如果 t(end)==tf,则 ode45 完成了它的工作,否则失败

于 2016-07-25T08:20:40.947 回答