あなたの例を使用して、MatLab での一般的な ODE シミュレーションの基本的な考え方を説明します (これはプログラミング言語間で非常に似ています)。
(ただし、最初に、指定しなかったため、A および B 行列に記述した x は実際には x1 であると想定しています。コンテキストから、状態ベクトルが [x1 x2] であると想定しています)。
を受け取る関数を作成します。
- 現在時刻、t_now
- 現在の状態ベクトル、x_now
- 完全な入力配列、u
- フルタイム配列、t
それらを使用して状態微分 (xdot) を計算します。ご覧のとおり、完全な時間配列 (t) は、制御入力 (u) のインデックス付けにのみ必要です。基本的に、それはコード化された機能になります
xdot = f(t, x, u)
これは ODE の一般的な形式です。
function xdot = myODE(t_now, x_now, u, t)
A = [ 0.59*x_now(1), 1.67*x_now(1);
0.1, 0.2 ] ;
B = [ 2.3*x_now(1);
0.3 ] ;
u_now = interp1(t, u, t_now) ; % get u(t=t_now)
xdot = A*x_now + B*u_now ;
end
次に、MatLab の ode45 のような ODE ソルバーを使用してシミュレーションを実行するスクリプトを作成します。これらのソルバーがどのように機能するかを知りたい場合は、数値積分を読んでください。MatLab の ode45 はルンゲ クッタ法を使用します。
%// time range over which to compute simulation
t = [0 : 0.01 : 5] ;
%// define the input signal
%// why not make it zero to look at the natural response
u = zeros(1, length(t)) ;
%// initial condition
x0 = [2, -5] ;
%// call ode45
%// first argument: anonymous call to myODE that tells it which inputs to use
%// second argument: the time range for the simulation
%// third argument: the initial condition
%// first output: the sim time, may be more detailed than the original t
%// second output: the full output including all states
[t_out, response] = ode45(@(t_now, x_now) myODE(t_now, x_now, u, t), t, x0) ;
%// The response contains two column vectors: one for x1 and one for x2 at
%// every time in t. You can extract "the true output" which based on
%// your C matrix is x1.
y = response(:,1) ;
%// Plot results
plot(t, u, 'r--', t_out, y, 'k') ;
grid on ;
legend('input', 'output')
xlabel('time')
ylabel('value')
u が定義済みの入力信号ではなく、現在の状態の関数であるとします。次に、myODE 関数で u_now の計算を変更するだけです。最も単純なケースでは、u は時間の関数ではありません。この場合、u や全時間配列を myODE に渡す必要さえありません。たとえば、
u := -k*x1
次に、ODE関数は次のようになります
function xdot = myODE(t_now, x_now)
A = [ 0.59*x_now(1), 1.67*x_now(1);
0.1, 0.2 ] ;
B = [ 2.3*x_now(1);
0.3 ] ;
k = 5 ;
u_now = -k*x_now(1) ;
xdot = A*x_now + B*u_now ;
end
ode45 の呼び出しは
[t_out, response] = ode45(myODE(t_now, x_now), t, x0) ;
スクリプトで u を定義する必要はありません。
それが役立つことを願っています!