1

システム、入力、出力行列が多項式の場合、システムの時間応答をプロットするにはどうすればよいですか? 例えば

A(x) = [0.59*x 1.67*x; 0.1 0.2]
B(x) = [2.3*x; 0.3]
C    = [1 0]
Operating region of x = [-2, 2]
Initial condition x(0) = [2 0]

行列が定数であれば、 and を使用sslsimてそれをプロットできます。とありますが、この場合はどうすればよいでしょうか?私は Matlab と制御システムが初めてです。

4

1 に答える 1

1

あなたの例を使用して、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 を定義する必要はありません。

それが役立つことを願っています!

于 2015-11-30T06:39:05.097 に答える