MATLAB つかいませんか (File-2)
--- MATLAB を使うための ABC --- 応用2 (回路応答を MATLAB で調べる) |
---|
目次
|
2次の系の時間応答 --- 微分方程式を解く | |
---|---|
ここでは,LRC 直列回路に電源を加え,
Cの両端から出力を取り出すことにします。
回路図: +−−[L]−−−[R]−−+ Vout | | Vin [C] | | --- --- /// ///方程式は,次式で与えられます。s は 時間微分を,1/s は積分を表わします。
Vr = i R Vout = i/sC L=1mH, C=1 μF (これより, f0 は,約 5 kHz), R=10 Ω 〜 100 Ω (これより,Q は大よそ 0.3〜3 です) また,Vin は,正弦波 又は ステップ関数とします。 [解法-1 : 微分方程式として解く] これを解くにあたって次の置き換えを考えます: 「2次の微分方程式は,2つの1次の微分方程式を連立させたものである」 s は微分を表わしていますので,上の式は次のように書き換えることができます。
Vout' = Vr/(R * C) ---セーブするのは以下の6行 !! ファイル名は'my_func.m'--- function xdot=my_func(t,x) xdot=zeros(2,1); % 領域確保 L=0.001; C=1.e-6; R=20; % Vin は T=1ms で立ち上がるステップ関数とする。 xdot(1)=( -x(1) - x(2) + 0.5*(1+sign(t-0.001)) )*R/L; xdot(2)=x(1)/(R*C); % end of function % 例えば Vin が 300 Hz の正弦波ならば,xdot(1) の行を次行に変更。 xdot(1)=( -x(1) - x(2) + sin(2*pi*300*t) )*R/L; MATLAB の組み込み関数 ode23 を使うと, 簡単に微分方程式を解けます。 早速"help ode23"と打ってマニュアルを確認しよう。 他にも,ode45のように,目的と使い方は同じだが, 内部処理(アルゴリズム)が異なる関数が用意されています。 % 回路解析-1 % 時間領域: 0 --- 5ms (秒) % xx(:,1) ... Vr ; 初期条件は Vr = 0 % xx(:,2) ... Vout ; 初期条件は Vout = -1 [t,xx]=ode23('my_func',[0 0.005], [0 0]); plot(t,xx(:,1),'b',t,xx(:,2),'r') % end | |
[解法-2 : 組み込み関数を使わずに解く] 基本的には 解法-1 と同じアルゴリズムだが, 組み込み関数を使わず非常にシンプルに取り扱います。 (従って誤差は保証されない) なお,解法-1 の my_func を流用します。 % 回路解析-2 % 計算結果を入れる領域の確保 tt=zeros(10001,1); vr=tt; vout=tt; % initial condition dt=0.005/(length(tt)-1); % 時間: 0〜5 ms tt(1)=0; vr(1)=0; % 初期電流 vout(1)=0; % 初期出力電圧 % calculation for k=1:length(tt)-1 xdot=my_func(tt(k),[vr(k) vout(k)]); tt(k+1) = tt(k)+dt; vr(k+1) = vr(k)+dt*xdot(1); vout(k+1)=vout(k)+dt*xdot(2); end % display plot(tt,vr,'b',tt,vout,'r') % end |
[解法-3 : Vr - Vout 平面上に解軌跡を表示する] ここでも,もとの方程式を取り扱います。 解法-1 の my_func をそのまま流用します。 % 解法-3 : Vr - Vout 平面上での解軌跡 % 縦軸は x1( Vr ), 横軸は x2(Vout) [vvx,iiy]=meshgrid(-2:0.4:2, -0.8:0.2:0.8); siz=size(vvx) dx0=zeros(siz(1), siz(2), 2); dx1=dx0; for m=1:siz(1) % 各座標での解の動き方を表示します for n=1:siz(2) dx0(m,n,:)=my_func(0,[iiy(m,n) vvx(m,n)]); dx1(m,n,:)=my_func(1,[iiy(m,n) vvx(m,n)]); end end figure(1); quiver(vvx,iiy,dx0(:,:,2),dx0(:,:,1),'.') hold on; quiver(vvx,iiy,dx1(:,:,2),dx1(:,:,1),'g.') % 回路解析3-1 : 時間領域 0 - 5ms,初期電流 0,初期電圧 -1 [t,xx]=ode23('my_func',[0 0.005], [0 -1]); plot(xx(:,2), xx(:,1),'b') % 回路解析3-2 tt=zeros(10001,1); % 計算結果を入れる領域の確保 vr=tt; vout=tt; dt=0.005/(length(tt)-1) % 時間領域: 0 〜 5 ms tt(1)=0; vr(1)=0; % 初期電流 vout(1)=-1; % 初期出力電圧 for k=1:length(tt)-1 xdot=my_func(tt(k),[vr(k) vout(k)]); tt(k+1) = tt(k)+dt; vr(k+1) = vr(k)+dt*xdot(1); vout(k+1)=vout(k)+dt*xdot(2); end plot(vout, vr, 'r'); hold off figure(2); plot(t,xx(:,2),'b', tt,vout,'r') % end |
周波数特性を求める | |
---|---|
先ほどと同じ回路です。
LRC 直列回路に電源を加え,
Cの両端から出力を取り出します。
回路図: +−−[L]−−−[R]−−+ Vout | | Vin [C] | | --- --- /// ///利得は,
L=1mH, C=1 μF (これより, f0 は,約 5 kHz), R=10 Ω 〜 100 Ω (これより,Q は大よそ 0.3〜3 です) | |
[解法-1] MATLAB は複素数を取り扱えますから,簡単に利得を計算できます。 とにかくそのまま書いていくだけです。 ただし,マトリクス同士の計算の乗除算は,".*", "./" です。 % 回路解析-1 % frequency responce of an L-R-C circuit % 各部の電圧の周波数依存性を求めるプログラム」 L=0.001; C=1.e-6; R=20; f=logspace(1,5,100); s=i*2*pi*f; gain=1./(1 + s.*C.*R + s.*s.*L.*C); figure(1); loglog(f,abs(gain),'r') figure(2); semilogx(f,angle(gain)*180/pi,'r') % end |
[解法-2] polyval は多項式を取り扱う関数です。 計算時に,複素数も取り扱えますから,利得計算に使えます。 % 回路解析-2 % frequency responce of an L-R-C circuit % 各部の電圧の周波数依存性を求めるプログラム」 L=0.001; C=1.e-6; R=20; f=logspace(1,5,100); s=i*2*pi*f; gain=polyval([1],s) ./ polyval([L*C C*R 1],s); % 分子 1 , 分母 (s^2)LC + sCR + 1 figure(1); loglog(f,abs(gain),'r') figure(2); semilogx(f,angle(gain)*180/pi,'r') % end |