ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

微分方程式の数値積分

この例では、単純な微分方程式で ODE23 と ODE45 を使用する方法を示します。ODE23 と ODE45 は、常微分方程式の数値解に対する関数です。これらは、Runge-Kutta の積分手法の可変ステップ サイズを使用します。ODE23 は、中規模な精度に対して単純に 2 次、3 次の公式の組み合わせを使用し、ODE45 は、高い精度に対して 4 次、5 次の組み合わせを使用します。

ロトカ・ボルテラの捕食者と被食者モデルと呼ばれる 1 次の常微分方程式の組み合わせを考えます。

   y1' = (1 - alpha*y2)*y1
   y2' = (-1 + beta*y1)*y2

関数 y1 と y2 は、被捕食者と捕食者のそれぞれの個体群のサイズを表します。2 次のクロス項は、種の間の相互関係を説明します。捕食者がいない場合、被捕食者の個体群は増加しますが、被捕食者がない場合は、捕食者は減少することに注意してください。

システムをシミュレートするために、状態と時間の値を与えて、状態導関数の列ベクトルを返す関数を作成します。この例では、LOTKA.M というファイルを作成します。

type lotka
function yp = lotka(t,y)
%LOTKA  Lotka-Volterra predator-prey model.

%   Copyright 1984-2014 The MathWorks, Inc.

yp = diag([1 - .01*y(2), -1 + .02*y(1)])*y;

区間 0 < t < 15 で LOTKA に定義した微分方程式をシミュレートするために、ODE23 を呼び出します。1e-3 (0.1%) の既定の相対精度を使用します。

% Define initial conditions.
t0 = 0;
tfinal = 15;
y0 = [20 20]';
% Simulate the differential equation.
tfinal = tfinal*(1+eps);
[t,y] = ode23(@lotka,[t0 tfinal],y0);

2 つの異なる方法のシミュレーション結果をプロットします。

subplot(1,2,1)
plot(t,y)
title('Time history')

subplot(1,2,2)
plot(y(:,1),y(:,2))
title('Phase plane plot')

ODE23 の代りに ODE45 を使って LOTKA をシミュレートします。ODE45 は、各ステップにおいてより時間を要しますが、より大きいステップを取ります。それにもかかわらず、既定の設定で、ソルバーは連続的な拡張式を利用して、使用した各ステップの期間において 4 つの等間隔な時間点で出力を生成するため、ODE45 の出力は滑らかです。プロットは、前の結果に対してこの結果を比較します。

[T,Y] = ode45(@lotka,[t0 tfinal],y0);

subplot(1,1,1)
title('Phase plane plot')
plot(y(:,1),y(:,2),'-',Y(:,1),Y(:,2),'-');
legend('ode23','ode45')

この情報は役に立ちましたか?