MATLAB演習(線形システム) - Home |...
Transcript of MATLAB演習(線形システム) - Home |...
MATLAB演習(線形システム) • 微分方程式の数値解法 • 1次遅れ系と時定数
1. ステップ応答の解析解 2. 数値計算 (オイラー法とRunge-Kutta法の精度比較) 3. 周波数応答とボード線図
• 2次振動系と共振 1. ステップ応答の解析解 2. 数値計算 3. 周波数応答とボード線図
• レポート課題
微分方程式
€
dxdt
= f x, t( ) 状態(場所)xでの速度ベクトル
微分方程式はベクトル場 を規定
次にどの方向にどれだけ進むか!
微分方程式の解法 =速度ベクトルを繋ぎ合 わせて(=積分)、時刻tの 場所xを計算する。
オイラー法の導出
€
dx t( )dt
= limΔt→∞
x t + Δt( ) − x t( )Δt
微分の定義
離散化による近似
€
t = nΔt
€
n = 0,1,2,3,4,5,
€
Δt が十分小さい場合
€
xn+1 − xnΔt
= f xn,nΔt( )
€
xn = x nΔt( )
時間
として
€
dxdt
= f x, t( )
オイラー法
€
xn+1 = xn + Δtf xn,nΔt( )2.更新則
1.初期値
€
xn = x0
€
n = 0 を与える
€
n = n +1を繰り返す
€
t = nΔt
ベクトルを単純に 足し合わせるだけ
€
Δt が十分小さくないと 近似精度が悪い
2次のRunge-Kutta法
€
xn+1 = xn + Δtf x∗,t +Δt2
更新則
€
x∗ = xn +Δt2f xn ,t( )
ただし
€
t = nΔt
配布プログラム
• オイラー法 Euler.m
• 2次のRunge-Kutta法 RK2.m
オイラー法 Euler.m
function [t x] = Euler(func,tintv,init,dt,para)
t = tintv(1):dt:tintv(2); x0 = init; x = [];
for ti = tintv(1):dt:tintv(2) x = cat(2,x,x0); x1 = x0 + dt.*func(ti,x0,para); x0 = x1; end;
end
ベクトル場の 関数のポインタ
最初と最後 の時間
初期値
ベクトル場 のパラメータ
時間刻み
時間 解(軌道)
離散時間のセット
初期値セット
解を記憶する 行列をセット
オイラー法の更新則
縦ベクトルx0を行列xに付け加える
function [t x] = RK2(func,tintv,init,dt,para)
t = tintv(1):dt:tintv(2); x0 = init; x = [];
for ti = tintv(1):dt:tintv(2) x = cat(2,x,x0); xas = x0 + 0.5.*dt.*func(ti,x0,para); x1 = x0 + dt.*func(ti+0.5.*dt,xas,para); x0 = x1; end;
end
ベクトル場の 関数のポインタ
最初と最後 の時間
初期値
ベクトル場 のパラメータ
時間刻み
離散時間のセット
初期値セット
解を記憶する 行列をセット
2次のRunge-Kutta法 RK2.m
2次のRunge-Kutta法の更新則
時間 解(軌道)
縦ベクトルx0を行列xに付け加える
MATLAB演習(線形システム) • 微分方程式の数値解法(復習) • 1次遅れ系と時定数
1. ステップ応答の解析解 2. 数値計算 (オイラー法とRunge-Kutta法の精度比較) 3. 周波数応答とボード線図
• 2次振動系と共振 1. ステップ応答の解析解 2. 数値計算 3. 周波数応答とボード線図
• レポート課題
1次遅れ系
€
τdx t( )dt
= −x t( ) + u t( )
伝達関数
€
G s( ) =X s( )U s( )
=1
1+ τs
初期値x(0)=0とする。
ラプラス変換
€
L x t( ){ } = X s( )
€
L u t( ){ } =U s( )入力 出力
ステップ応答 単位ステップ入力
€
U s( ) =1s
ステップ応答
€
X s( ) =1
1+ τs1s
=1s−
1s+1 τ
部分分数展開
逆ラプラス変換
€
x t( ) =1− exp − t τ( )
ステップ応答の解析解
時定数
MATLAB演習(線形システム) • 微分方程式の数値解法(復習) • 1次遅れ系と時定数
1. ステップ応答の解析解 2. 数値計算 (オイラー法とRunge-Kutta法の精度比較) 3. 周波数応答とボード線図
• 2次振動系と共振 1. ステップ応答の解析解 2. 数値計算 3. 周波数応答とボード線図
• レポート課題
配布プログラム
• オイラー法 Euler.m • 2次のRunge-Kutta法 RK2.m • ベクトル場 FOL.m • メイン部分 FOL_main.m
function x = FOL(t,y,para) x = (-y(1) + para(2))./para(1); end
ベクトル場の関数(FOL.m)
€
dx t( )dt
=−x t( ) + u t( )
τ
ステップ入力の大きさ 時定数
時間 状態ベクトル パラメータ 速度ベクトル
メイン部分 FOL_main.m
function main
tau = 2; %時定数 In = 1; %ステップ入力の大きさ
dt = 0.3; % 時間刻み T = 10; %最終時間
xinit =[0]; %初期値セット para = [tau,In]; %パラメータのセット %@FOLで関数のポインタの受け渡し [t1,x] = Euler(@FOL,[0,T],xinit,dt,para); %オイラー法 xe = x(1,:); xmin = min(xe)-0.1; xmax = max(xe)+0.1; %@FOLで関数のポインタの受け渡し [t2,x] = RK2(@FOL,[0,T],xinit,dt,para); %2次Runge-Kutta xr2 = x(1,:);
t3 = 0:dt:T; %離散時間の設定(横ベクトル) xas = In.*(1-exp(-t3./tau)); %解析解の計算
plot(t3,xas,‘-’,t1,xe,‘-.’,t2,xr2,‘:’); %グラフの表示 axis([0 T xmin xmax]);
end
時定数を変えて、 収束時間の変化を 観察する
オイラー法とRunge-Kutta法の精度比較
MATLAB演習(線形システム) • 微分方程式の数値解法(復習) • 1次遅れ系と時定数
1. ステップ応答の解析解 2. 数値計算(オイラー法とRunge-Kutta法の精度比較)
3. 周波数応答とボード線図 • 2次振動系と共振
1. ステップ応答の解析解 2. 数値計算 3. 周波数応答とボード線図
• レポート課題
配布プログラム
• 2次のRunge-Kutta法 RK2.m • ベクトル場 FOL_FR.m • メイン部分 FOL_FR_main.m
ベクトル場の関数(FOL_FR.m)
€
dx t( )dt
=−x t( ) + Asin ωt( )
τ
正弦波の振幅 角周波数
時間 状態ベクトル パラメータ 速度ベクトル
function x = FOL_FR(t,y,para) x = (-y(1) + para(2).*sin(para(3).*t))./para(1); end
時定数
function main
tau = 1; %時定数 In = 1; %正弦波の振幅 omega = 10;角周波数
dt = 0.02; % 時間刻み T = 20; %最終時間
xinit =[0]; %初期値セット para = [tau,In,omega]; %パラメータのセット
%@FOL_FRで関数のポインタの受け渡し [t,x] = RK2(@FOL_FR,[0,T],xinit,dt,para); %2次Runge-Kutta xr = x(1,:); xmin = min(xr)-0.1; xmax = max(xr)+0.1;
plot(t,xr); %グラフの表示 axis([0 T xmin xmax]);
メイン部分 FOL_FR_main.
m
角周波数を変えて、出力の振幅の変化を観察する
周波数応答
€
dx t( )dt
=−x t( ) + sin ωt( )
τ
正弦波入力
時間が十分経つと
€
x t( ) = G jω( ) sin ωt + tan−1G jω( )( )
€
G jω( ) =1
1+ jτω
ボード線図
配布プログラム
• 伝達関数 TF_FOL.m • メイン部分 FOL_boad_main.m
伝達関数 (TF_FOL.m)
function [ y ] = TF_FOL(s,para)
y = 1./(ones(size(s))+para(1).*s);
€
G s( ) =1
1+ τs
時定数
パラメータ 出力 複素数s
Matlabは複素数が扱える
sがベクトルの場合に対応
メイン部分 FOL_boad_ma
in.m
function main
tau = 1; %時定数 j=sqrt(-1);%虚数の設定
para = [tau];%パラメータのセット
omega = 10.^(-2:0.1:2); %角周波数のセット G = TF_FOL(j.*omega,para);%周波数伝達関数の計算
gain = 20.*log10(abs(G)); %ゲインの計算 kaku = angle(G); %位相の計算
subplot(2,1,1); %2つのグラフを縦に並べて表示 semilogx(omega,gain); %x軸を対数にしてグラフ表示 xlabel(‘omega’); ylabel(‘dB’);%軸のラベル
subplot(2,1,2); %2つのグラフを縦に並べて表示 semilogx(omega,kaku); %x軸を対数にしてグラフ表示 xlabel(‘omega’); ylabel(‘rad’); %軸のラベル
end
時定数を変えて、 周波数応答の変化を 観察
MATLAB演習(線形システム) • 微分方程式の数値解法(復習) • 1次遅れ系と時定数
1. ステップ応答の解析解 2. 数値計算 (オイラー法とRunge-Kutta法の精度比較) 3. 周波数応答とボード線図
• 2次振動系と共振 1. ステップ応答の解析解 2. 数値計算 3. 周波数応答とボード線図
• レポート課題
2次振動系
€
d2x t( )dt 2
+ 2ζωn2 dx t( )dt
+ωn2x t( ) =ωn
2u t( )
伝達関数
€
G s( ) =X s( )U s( )
=ωn2
s2 + 2ζωns+ωn2
初期値x(0)=0、x’(0)=0とする。
ラプラス変換
€
L x t( ){ } = X s( )
€
L u t( ){ } =U s( )入力 出力
ステップ応答 単位ステップ入力
€
U s( ) =1s
ステップ応答
次の3つの場合に分ける
€
X s( ) =ωn2
s2 + 2ζωns+ωn21s
€
ζ <1
€
ζ =1
€
ζ >1
€
ζ <1 の場合
€
X s( ) =1s−ωn2
21
β β + jα( )1
s+α − jβ−ωn2
21
β β − jα( )1
s+α + jβ
部分分数展開
逆ラプラス変換
€
x t( ) =1− 11−ζ 2
exp −ωnζt( )sin 1−ζ 2ωnt + φ( )
€
φ = tan−1 1−ζ 2
ζ
€
β =ωn 1−ζ 2
€
α =ωnζ
€
ζ =1 の場合
€
X s( ) =1s−
1s+ωn
−ωn
s+ωn( )2
部分分数展開
逆ラプラス変換
€
x t( ) =1− 1+ωnt( )exp −ωnt( )
€
ζ >1 の場合 部分分数展開
€
X s( ) =1s
+s2
s1 − s21
s− s1+
s1s2 − s1
1s− s2
逆ラプラス変換
€
s1= −ζωn +ωn ζ 2 −1
€
s2= −ζωn −ωn ζ 2 −1
€
x t( ) =1+s2
s1 − s2exp s1t( ) +
s1s2 − s1
exp s2t( )
ステップ応答の解析解
MATLAB演習(線形システム) • 微分方程式の数値解法(復習) • 1次遅れ系と時定数
1. ステップ応答の解析解 2. 数値計算 (オイラー法とRunge-Kutta法の精度比較) 3. 周波数応答とボード線図
• 2次振動系と共振 1. ステップ応答の解析解 2. 数値計算 3. 周波数応答とボード線図
• レポート課題
2次振動系の状態空間表現
€
d2x t( )dt 2
+ 2ζωn2 dx t( )dt
+ωn2x t( ) =ωn
2u t( )
€
dx t( )dt
= y t( ) とおくと
€
d2x t( )dt 2
=dy t( )dt
= −2ζωn2y t( ) −ωn
2x t( ) +ωn2u t( )
よって、以下の状態空間表現が得られる
€
ddt
xy
=
0 1−ωn
2 −2ζωn2
xy
+
0ωn2
u t( )
€
x = 1 0[ ]xy
配布プログラム
• 2次のRunge-Kutta法 RK2.m • ベクトル場 SOE.m • メイン部分 SOE_main.m
ベクトル場の関数(SOE.m)
function xy = SOE(t,y,para) xy = [y(2);-para(2).^2.*y(1)-2.*para(1).*para(2).*y(2)+para(2).^2.*para(3)]; end
€
ddt
xy
=
縦ベクトル
ステップ入力の大きさ
€
y−ωn
2x − 2ζωn2y +ωn
2u t( )
時間 状態ベクトル パラメータ 速度ベクトル
function main
xi = 0.2; %減衰係数 wn = 2; %固有振動数 In = 1;%ステップ入力の大きさ dt = 0.1;%時間刻み T = 15;%最終時間
xinit =[0;0];%初期値セット para = [xi,wn,In];%パラメータセット %@SOEで関数のポインタの受け渡し [t1,xy] = RK2(@SOE,[0,T],xinit,dt,para); %2次Runge-Kutta x = xy(1,:); xmin = min(x)-0.1; xmax = max(x)+0.1; y = xy(2,:); ymin = min(y)-0.1; ymax = max(y)+0.1;
subplot(2,1,1); %2つのグラフを縦に並べて表示 plot(t1,x);%ステップ応答の時間発展をプロット axis([0 T xmin xmax]); xlabel('t'); ylabel('x');
subplot(2,1,2); %2つのグラフを縦に並べて表示 plot(x,y);%状態空間プロット axis([xmin xmax ymin ymax]); xlabel('x'); ylabel('dx/dt'); end
メイン部分 SOE_main.m
減衰係数を変えて、 ステップ応答の変化を 観察
MATLAB演習(線形システム) • 微分方程式の数値解法(復習) • 1次遅れ系と時定数
1. ステップ応答の解析解 2. 数値計算 (オイラー法とRunge-Kutta法の精度比較) 3. 周波数応答とボード線図
• 2次振動系と共振 1. ステップ応答の解析解 2. 数値計算 3. 周波数応答とボード線図
• レポート課題
配布プログラム
• 2次のRunge-Kutta法 RK2.m • ベクトル場 SOE_FR.m • メイン部分 SOE_FR_main.m
ベクトル場の関数(SOE.m)
€
ddt
xy
=
縦ベクトル
正弦波の振幅
€
y−ωn
2x − 2ζωn2y +ωn
2Asin ωt( )
時間 状態ベクトル パラメータ 速度ベクトル
function xy = SOE(t,y,para) xy = [y(2);… %改行する場合、… -para(2).^2.*y(1)-2.*para(1).*para(2).*y(2)+para(2).^2.*para(3).*sin(para(4).*t)]; end
メイン部分 SOE_FR_mai
n.m
減衰係数を変えて、 応答の振幅変化を観察
xi = 0.5; %減衰係数 wn = 1; %固有振動数 In = 1; %正弦波の振幅 omega = 1.5; %正弦波の角周波数 dt = 0.01; %時間刻み T = 60; %最終時間
xinit =[0;0]; %初期値セット para = [xi,wn,In,omega]; %パラメータセット %@SOE_FRで関数のポインタの受け渡し [t1,xy] = RK2(@SOE_FR,[0,T],xinit,dt,para); %2次Runge-Kutta x = xy(1,:); xmin = min(x)-0.1; xmax = max(x)+0.1; y = xy(2,:); ymin = min(y)-0.1; ymax = max(y)+0.1;
subplot(2,1,1); %2つのグラフを縦に並べて表示 plot(t1,x); %正弦波に対する応答の時間発展をプロット axis([0 T xmin xmax]); xlabel('t'); ylabel('x');
subplot(2,1,2); %2つのグラフを縦に並べて表示 plot(x,y); %状態空間プロット axis([xmin xmax ymin ymax]); xlabel('x'); ylabel('dx/dt');
周波数応答 正弦波入力
時間が十分経つと
€
x t( ) = G jω( ) sin ωt + tan−1G jω( )( )
€
G jω( ) =ωn2
−ω 2 + 2 jζωnω +ωn2
€
d2x t( )dt 2
+ 2ζωn2 dx t( )dt
+ωn2x t( ) =ωn
2 sin ωt( )
€
=1
−ω 2 ωn2 + 2 jζω ωn +1
ボード線図
€
ωωn
配布プログラム
• 伝達関数 TF_SOE.m • メイン部分 FOL_boad_main.m
function [ y ] = TF_SOE(s,para)
y = para(2).^2./(s.^2 + 2.*para(1).*para(2).*s +… para(2).^2.*ones(size(s)));
end
伝達関数 (TF_SOE.m) パラメータ 出力 複素数s
Matlabは複素数が扱える
sがベクトルの場合に対応
€
G s( ) =ωn2
s2 + 2ζωns+ωn2
メイン部分SOE_boad_ma
in.m
減衰係数を変えて、 周波数応答の変化を 観察
function main
xi = 0.05;%減衰係数 wn = 1;%固有振動数 j=sqrt(-1);%虚数の設定
para = [xi,wn]; %パラメータのセット
omega = 10.^(-1:0.05:1); %角周波数のセット G = TF_SOE(j.*omega,para); %周波数伝達関数の計算
gain = 20.*log10(abs(G)); %ゲインの計算 kaku = angle(G); %位相の計算
subplot(2,1,1); %2つのグラフを縦に並べて表示 semilogx(omega,gain); %x軸を対数にしてグラフ表示 xlabel('omega'); ylabel('dB'); %軸のラベル
subplot(2,1,2); %2つのグラフを縦に並べて表示 semilogx(omega,kaku); %x軸を対数にしてグラフ表示 xlabel('omega'); ylabel('rad'); %軸のラベル
end
レポート
• 関数RK2.mを改造し、4次のRunge-Kutta法による数値積分を実行する関数を作成せよ。
• 作成した4次のRunge-Kutta法の関数を用いて、2次振動系のステップ応答を数値計算し、グラフを描け。
4次のRunge-Kutta法
€
xn+1 = xn +Δt6
F1 + 2F2 + 2F3 + F4[ ]
更新則
€
F1 = f xn,t( )ただし
€
t = nΔt
€
F2 = f xn +Δt2F1,t +
Δt2
€
F3 = f xn +Δt2F2,t +
Δt2
€
F4 = f xn + ΔtF3,t + Δt( )