Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

2 階微分方程式の数値的な求解

この例では、2 階微分方程式を微分方程式系に変換し、MATLAB® の数値ソルバー ode45 を使用して解く方法を説明します。

高階数の常微分方程式を解く一般的な方法は、1 階微分方程式系に変換して解くことです。この例では、Symbolic Math Toolbox™ を使用して 2 階 ODE を 1 階 ODE 系に変換します。その後、MATLAB ソルバー ode45 を使用して方程式系を求解します。

2 階 ODE から 1 階 ODE 系への書き換え

odeToVectorField を使用してこの 2 階微分方程式を書き換えます。

d2ydt2=(1-y2)dydt-y

変数の取り換えを使います。y(t)=Y1 および dydt=Y2 として、両方程式を微分すると、1 階微分方程式系が得られます。

dY1dt=Y2dY2dt=-(Y12-1)Y2-Y1

syms y(t)
[V] = odeToVectorField(diff(y, 2) == (1 - y^2)*diff(y) - y)
V = 

(Y2-Y12-1Y2-Y1)

MATLAB 関数の生成

MATLAB ODE ソルバーはシンボリック式を入力として受け付けません。したがって、MATLAB ODE ソルバーを使用して方程式系を求解する前に MATLAB 関数に変換しなければなりません。この 1 階微分方程式系から MATLAB 関数を生成するには、matlabFunction と V を入力として使用します。

M = matlabFunction(V,'vars', {'t','Y'})
M = function_handle with value:
    @(t,Y)[Y(2);-(Y(1).^2-1.0).*Y(2)-Y(1)]

1 階 ODE 系の求解

この方程式系の解を求めるには、生成された MATLAB 関数を入力として使用し、MATLAB ode45 数値ソルバーを呼び出します。

sol = ode45(M,[0 20],[2 0]);

解のプロット

linspace を使用して区間 [0,20] で 100 点を生成し、deval を使用して各点の解を評価し、解をプロットします。

fplot(@(x)deval(sol,x,1), [0, 20])

Figure contains an axes object. The axes object contains an object of type functionline.

参考

| | |