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

もう 1 つの方法は、ode45 が実行できた時間を確認することです。たとえば、実行した場合

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

次に、この行が実行された後、単に t(end) の値を確認します。t(end)==tf の場合、ode45 はそのジョブを実行しました。それ以外の場合は失敗です

于 2016-07-25T08:20:40.947 に答える