制御工学への応用
Copyright (C) 29Feb2004 coskx
last
update Jan2012
【1】制御工学への応用
この文書はScilabの制御工学への応用を紹介をしています。
【2】一次遅れ要素
一次遅れ要素,あるいは一次遅れ系は
T d/dt y(t) + y(t) = kx(t)
( x(t):入力 y(t):出力 T,k:定数 )で表されます。ラプラス変換により,伝達関数は
G(s) = k / ( Ts + 1 )
となります。ここで T=1,k=2 のもとで過渡応答を求めてみよう。
(1)単位ステップ応答
clf();
s=poly(0,'s');
G=2/(s+1);
mySys1=syslin('c',G);
t=[0:0.01:10];
y=csim('step',t,mySys1);
plot2d(t,y,5,rect=[0,0,10,2.1]);a=get("current_axes"); //get the current axes
a.grid=[2 2]; //make x,y-grid
a.labels_font_size=4; //目盛の数字
a.title.text="unit step response G(s)=2/(s+1)";
a.title.font_size=4;
a.x_label.text="time[sec]";
a.x_label.font_size=4;
a.y_label.text="response";
a.y_label.font_size=4;
変数 s の定義(宣言としておこう)
伝達関数 G の定義
リニアシステム mySys1 の定義 「G」をもとに連続系('c')として定義
時間行ベクトル t の定義 [0 0.01 0.02 0.03 .... 9.98 9.99 10]
線形システム mySys1 のシミュレーション
ステップ入力とし,時刻データは時間行ベクトル t を用いる
シミュレーション結果は行ベクトル y に格納される赤でt-yグラフを描く。ただし値の範囲はt:0〜10,y:0〜2.1
グラフの詳細設定
単位ステップ応答のグラフ
(2)周波数応答
リニアシステムの定義が済めば, bode 関数を用いてボード線図を描くことができます。
clf();
s=poly(0,'s');
G=2/(s+1);
mySys1=syslin('c',G);
bode(mySys1);f=get("current_figure");
f.children(1).grid=[2 2];
f.children(2).grid=[2 2];
f.children(1).labels_font_size=2; //目盛の数字
f.children(2).labels_font_size=2; //目盛の数字
f.children(1).x_label.font_size=2;
f.children(2).x_label.font_size=2;
f.children(1).y_label.font_size=2;
f.children(2).y_label.font_size=2;
変数 s の定義(宣言としておこう
伝達関数 G の定義
リニアシステム mySys1 の定義 「G」をもとに連続系('c')として定義
ボード線図を描く図の詳細設定
(オブジェクト"current_figure"のchildren(1)(2)は2つの図のAxes
をそれぞれ指している。)
ボード線図 (周波数の単位はHz)
リニアシステムの定義が済めば, nyquist 関数を用いてナイキスト線図を描くことができます。
clf();
s=poly(0,'s');
G=2/(s+1);
mySys1=syslin('c',G);
nyquist(mySys1);a=get("current_axes"); //get the current axes
a.grid=[2 2]; //make x,y-grid
a.labels_font_size=2; //目盛の数字
a.title.font_size=2;
//a.x_location="origin";
//a.y_location="origin";
a.x_label.font_size=2;
a.y_label.font_size=2;
変数 s の定義(宣言としておこう)
伝達関数 G の定義
リニアシステム mySys1 の定義 「G」をもとに連続系('c')として定義
ナイキスト線図を描く図の詳細設定
ナイキスト線図 (周波数の単位はHz)
(3)状態空間のアプローチ
先に与えた一次遅れ要素の微分方程式の記述は
d/dt y(t) = -1/T y(t) + k/T x(t)
で表すこともできます。
状態空間表現ではA,b,cはそれぞれ1行1列の特別な場合の行列となります。
A=-1/T, b=k/T, c=1
次の記述でもリニアシステムの記述が可能です。
-->A=[-1]
-->b=[2];
-->c=[1];
-->mySys1=syslin('c',A,b,c);
補足 一般的な状態空間表現の扱いとsyslin関数
sl=syslin(dom,A,B,C [,D [,x0] ])
represents the system :
s x = A*x + B*u
y = C*x + D*u
x(0) = x0
【3】二次遅れ要素
二次遅れ要素,あるいは二次遅れ系は
d2/dt2 y(t) + 2 ζ ωn d/dt y(t) + ωn2y(t) = kx(t)
( x(t):入力 y(t):出力 ζ,ωn,k:定数 )で表されます。ラプラス変換により,伝達関数は
G(s) = ( k ωn2 )/( s 2 + 2 ζ ωn s + ωn2 )
となります。ここで ζ=0.2, ωn=10,k=2 のもとで過渡応答を求めてみよう。
(1)単位ステップ応答
clf();
s=poly(0,'s');
G=200/(s^2+2*0.2*10*s+100);
mySys2=syslin('c',G);
t=[0:0.002:5];
y=csim('step',t,mySys2);
plot2d(t,y,5,rect=[0,0,5,3.5]);a=get("current_axes"); //get the current axes
a.grid=[2 2]; //make x,y-grid
a.labels_font_size=4; //目盛の数字
a.title.text="unit step response G(s)=200/(s^2+2*0.2*10*s+100)";
a.title.font_size=4;
a.x_label.text="time[sec]";
a.x_label.font_size=4;
a.y_label.text="response";
a.y_label.font_size=4;
変数 s の定義(宣言としておこう)
伝達関数 G の定義
リニアシステム mySys2 の定義 「G」をもとに連続系('c')として定義
時間行ベクトル t の定義 [0 0.002 0.004 0.006 .... 4.996 4.998 5]
線形システム mySys2 のシミュレーション
ステップ入力とし,時刻データは時間行ベクトル t を用いる
シミュレーション結果は行ベクトル y に格納される赤でt-yグラフを描く。ただし値の範囲はt:0〜5,y:0〜3.5
グラフの詳細設定
単位ステップ応答のグラフ
(2)周波数応答
リニアシステムの定義が済めば, bode 関数を用いてボード線図を描くことができます。
clf();
s=poly(0,'s');
G=200/(s^2+2*0.2*10*s+100);
mySys2=syslin('c',G);
bode(mySys2);f=get("current_figure");
f.children(1).grid=[2 2];
f.children(2).grid=[2 2];
f.children(1).labels_font_size=2; //目盛の数字
f.children(2).labels_font_size=2; //目盛の数字
f.children(1).x_label.font_size=2;
f.children(2).x_label.font_size=2;
f.children(1).y_label.font_size=2;
f.children(2).y_label.font_size=2;
変数 s の定義(宣言としておこう)
伝達関数 G の定義
リニアシステム mySys2 の定義 「G」をもとに連続系('c')として定義
ボード線図を描く図の詳細設定
(オブジェクト"current_figure"のchildren(1)(2)は2つの図のAxes
をそれぞれ指している。)
ボード線図 (周波数の単位はHz)
周波数応答における,ピーク周波数とピークを求めます。
-->s=poly(0,'s');
-->G=200/(s^2+2*0.2*10*s+100);
-->mySys2=syslin('c',G);
-->peakfreq=freson(mySys2)
peakfreq =1.5265606
-->peak=20*log(abs(repfreq(mySys2,peakfreq)))/log(10)
peak =14.156688
変数 s の定義(宣言としておこう)
伝達関数 G の定義
リニアシステム mySys2 の定義 「G」をもとに連続系('c')として定義
ピークゲインを与える周波数を求めます。
1.52Hzでした。ピークゲインを求めます。
14dBでした。リニアシステムの定義が済めば, nyquist 関数を用いてナイキスト線図を描くことができます。
clf();
s=poly(0,'s');
G=200/(s^2+2*0.2*10*s+100);
mySys2=syslin('c',G);
nyquist(mySys2);a=get("current_axes"); //get the current axes
a.grid=[2 2]; //make x,y-grid
a.labels_font_size=2; //目盛の数字
a.title.font_size=2;
//a.x_location="origin";
//a.y_location="origin";
a.x_label.font_size=2;
a.y_label.font_size=2;
変数 s の定義(宣言としておこう)
伝達関数 G の定義
リニアシステム mySys2 の定義 「G」をもとに連続系('c')として定義ナイキスト線図を描く
図の詳細設定
ナイキスト線図 (周波数の単位はHz)
(3)状態空間のアプローチ
先に与えた二次遅れ要素の微分方程式の記述は
y(t) = y1, d/dt y(t) = y2 とおくことにより
| d/dt y1(t) | | 0 1 | | y1 | | 0 |
| | = | | | | + | | x(t)
| d/dt y2(t) | | −ωn2 −2 ζ ωn | | y2 | | k || y1 |
y= [ 1 0 ] | |
| y2 |状態空間表現ではA,b,cはそれぞれ2行2列,2行1列,1行2列の行列となります。
| 0 1 | | 0 |
A= | |, b= | |, c= [ 1 0 ]
| −ωn2 −2 ζ ωn | | k |次の記述でもリニアシステムの記述が可能です。
ここで ζ=0.2, ωn=10,k=2 のもとで記述すると次のようになります。
-->A=[0 1; -100 -2*0.2*10];
-->b=[0 2]';
-->c=[1 0];
-->mySys2=syslin('c',A,b,c);
(4)ζを変化させた時の単位ステップ応答を同時に描画
先に与えた二次遅れ要素の単位ステップ応答で,複数のζについてグラフを描いてみます。
clf();
s=poly(0,'s');
G1=200/(s^2+2*0.1*10*s+100);
G2=200/(s^2+2*0.3*10*s+100);
G3=200/(s^2+2*0.5*10*s+100);
G4=200/(s^2+2*0.7*10*s+100);
G5=200/(s^2+2*0.9*10*s+100);
mySys21=syslin('c',G1);
mySys22=syslin('c',G2);
mySys23=syslin('c',G3);
mySys24=syslin('c',G4);
mySys25=syslin('c',G5);
t=[0:0.01:5]'; //転置して列ベクトルにする
y1=csim('step',t,mySys21)'; //転置して列ベクトルにする
y2=csim('step',t,mySys22)'; //転置して列ベクトルにする
y3=csim('step',t,mySys23)'; //転置して列ベクトルにする
y4=csim('step',t,mySys24)'; //転置して列ベクトルにする
y5=csim('step',t,mySys25)'; //転置して列ベクトルにする
plot2d(t,[y1 y2 y3 y4 y5],[1 3 4 5 6],rect=[0,0,5,3.5]);
legend(["zeta=0.1","zeta=0.3","zeta=0.5","zeta=0.7","zeta=0.9"]);a=get("current_axes"); //get the current axes
a.grid=[2 2]; //make x,y-grid
a.labels_font_size=3; //目盛の数字
a.title.text="unit step response";
a.title.font_size=3;
a.x_label.text="time[sec]";
a.x_label.font_size=3;
a.y_label.text="response";
a.y_label.font_size=3;
ζによる単位ステップ応答の変化