Upload
others
View
16
Download
0
Embed Size (px)
Citation preview
Chapter 4
[目的]
電気通信大学・Ⅲ類の2年次後期に実施される理工学基礎実験において
“RC回路のフィルタ特性と過渡応答”を実施している。この実験項目について、無料ソフトのMaxima
を用いることで、理論解析と実験値の比較が可能である。また、近年のパソコンの性能の向上によ
り、Maximaの実行処理速度が大幅に改善された。
Maxima を用いて計算方法と計算結果を示すことで、実験レポートの考察のヒントにして、実験
内容の理解を深めることが目的である。
[目次]
以下の 9節から構成されています。
4-1 Low-pass filter回路について
4-2 Low-pass フィルタ回路における位相の入出力特性
4-3 RC直列回路の過渡解析
4-4 RC直列回路の過渡解析- Switch off について
4-5 ラプラス変換を用いたCR直列回路の過渡解析
4-6 Low-passフィルタの実験データと理論値について
4-7 Low-passフィルタの位相-周波数変化における実験データと理論値について
4-8 RC直列回路の実験データと過渡現象-充電特性
4-9 RC直列回路の実験データと過渡現象-放電特性
課題について
1) High-pass filterの解析をせよ。
2) 入力信号が正弦波の場合の RC直列回路における過渡解析
Maximaを用いた RC回路のフィルタ特性と過渡応答について
2018.09.18 版
4-1 Low-pass filter 回路について
[目的]
Low-pass フィルター回路の理論グラフを表示する。
[手順と結果]
変数を初期化する。
(%i32) kill(all);
入力と出力の比 Vout/Vin を Vc と定義する。
(%i1) Vc:1/(%i*w*C)/(R+1/(%i*w*C));
分母 Denominator 取り出す。
(%i2) dvc:denom(Vc);
分母の複素共役 Conjugate complex:を求める。
(%i3) dvcc:conjugate(dvc);
大きさの2乗をもめる。
(%i4) expand(dvc*dvcc);
分子 Nunominator を取り出す。
(%i5) nvc:num(Vc);
分子と分母の積を求める。
(%i25) nvn:expand(nvc*dvcc);
Fig.1 RC 回路の lowpass フィルター回路
Vin
Vout
実数を取り出す
(%i26) realpart(nvn);
虚数を求める。
(%i27) imagpart(nvn);
位相 phase を定義する。
(%i28) phi:atan(imagpart(nvn)/realpart(nvn));
複素数の複素共役を求める。
(%i10) expand(Vc*conjugate(Vc));
大きさを求める関数を使用する。
(%i11) vout:factor(cabs(Vc));
位相を求める関数を使用する。
(%i12) factor(carg(Vc));
遮断周波数 Cut-off frquency の定義
(%i13) fc:1/(2*%pi*C*R);
変数に数値を代入する。
C=0.01uF, R=10k ohm
(%i14) voutn:ev(vout,R:10*10^3,C:0.01*10^-6);
角周波数を、周波数に変換する。
(%i15) ratsubst(2*%pi*f,w,%);
周波数の関数の Vo(f)と定義する。
(%i16) define(Vo(f),%);
以上で関数が定義できたので、グラフ表示する。
--> wxplot2d(Vo(f),[f,10,10*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Vout/Vin [non-unit]"],
[gnuplot_preamble,"set grid"]);
遮断周波数(Cut-off)の周波数を計算する。
(%i18) sol:solve(Vo(f)-1/sqrt(2)=0,f);
正の値を取出し、実数表示する。
(%i19) sol2:float(sol[2]);
Fig.2 lowpass フィルターの周波数依存性
datax を定義する。
(%i40) datax:rhs(sol2);
datay を定義する。
(%i41) datay:float(rhs(Vo(sol2)));
理論クラフと遮断周波数の場所を同時に表示する。
(%i49) wxplot2d([Vo(f),[discrete,[datax],[datay]]],[f,10,10*10^3],
[logx],
[y,0,1],
[xlabel,"Frequency[Hz]"],
[ylabel,"Vout/Vin [non-unit]"],
[color,blue,red],
[style,lines,points],
[point_type,circule],
[legend,false],
[gnuplot_preamble,"set grid"]);
出力の関数を確認
(%i21) vout;
大きさが、1/sqrt(2)となる角周波数 w を求める。
(%i22) solve(vout=1/sqrt(2),w);
Fig.3 遮断周波数の位置を表示
デシベル(dB)の計算について
ref. Kamakura, book p106, "Denki kairo", Baifuukan, 1998
(%i55) 20*log(1/sqrt(2))/log(10);
1/sqrt(2)は、-3dB となる。
(%i56) float(%);
縦軸を dB 表示に変更した。
(%i38) wxplot2d(20*log(Vo(f)),[f,10,10*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Vout/Vin [dB]"],
[gnuplot_preamble,"set grid"]);
常用対数を用いるときは、Package を読み込む。
load(log10);
http://www10.atwiki.jp/bambooflow/pages/153.html#id_b740fc33
Created with wxMaxima.
Date: 2014.11.21 fine 1ST
Update: 2014.11.28 cloudy
Fig.4 dB 表示に変更したグラフ
4-2 Low-pass フィルタ回路における位相の入出力特性
[目的] Low pass フィルタ回路における位相について解析する。
[手順と結果]
変数の初期化する。
(%i1) kill(all);
コンデンサ電圧:Vc を定義する。
(%i1) Vc:1/(%i*w*C)/(R+1/(%i*w*C));
コンデンサ電圧:Vc の分母を取り出す。
(%i2) dvc:denom(Vc);
複素数の共役を求める。
(%i3) dvcc:conjugate(dvc);
分母に、複素共役を掛ける。
(%i4) expand(dvc*dvcc);
Vc の分子を取り出す。
(%i5) nvc:num(Vc);
(%i6) cngnvc:expand(nvc*dvcc);
実数部と虚数部を取り出す。
(%i7) realpart(cngnvc);
(%i8) imagpart(cngnvc);
実数部と虚数部から位相を定義する。
(%i9) phi:atan(imagpart(cngnvc)/realpart(cngnvc));
実験値の R,C を代入する。
(%i10) phin:ev(phi,R:10*10^3,C:0.01*10^-6);
角周波数を周波数に変換する。
(%i11) ratsubst(2*%pi*f,w,%);
周波数の関数として Ph(f) を定義する。
(%i12) define(Ph(f),%);
位相のグラフを表示する。
(%i13) wxplot2d(Ph(f)*180/%pi,[f,10,100*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Phase [deg.]"],
[gnuplot_preamble,"set grid"]);
Fig.1 位相グラフを表示
複素数の位相を計算する関数:carg を使用する。
(%i14) factor(carg(Vc));
角周波数 w を周波数 f に変換する。
(%i15) ratsubst(2*%pi*f,w,%);
実験値 R、C を代入する。
(%i16) phin:ev(%,R:10*10^3,C:0.01*10^-6);
周波数fの関数として定義する。
(%i17) define(Phcarg(f),%);
定義した関数のグラフを表示する。
(%i18) wxplot2d(Phcarg(f)*180/%pi,[f,10,100*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Phase [deg.]"],
[gnuplot_preamble,"set grid"]);
遮断周波数:fc を定義する。
(%i19) fc:1/(2*%pi*C*R);
実験値の R,C を代入して、数値で示す。
(%i26) fc0:ev(fc,R:10*10^3,C:0.01*10^-6);
位相が Pi/4 になる周波数を計算する。
(%i20) kai:solve(Ph(f)=-%pi/4,f);
遮断周波数の時の位相を計算する。
(%i21) fc:float(rhs(kai[1]));
Fig.2 標準関数を用いた場合の位相グラフを表示
遮断周波数の場所に線を引くために、2点の座標を求める。
(%i22) phic:float(Ph(fc)*180/%pi);
save the x and y position.
(%i23) yline:[0,-90];
(%i24) xline:[fc,fc];
以上の結果を、グラフ表示する。
(%i25) wxplot2d([Ph(f)*180/%pi,[discrete,[fc],[phic]],[discrete,xline,yline]],
[f,10,100*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Phase [deg.]"],
[style,line,[points,3,2],[lines,1,2]],
[legend,"Phase","Cut-off","fc"],
[gnuplot_preamble,"set grid"]);
Fig.3 位相グラフの遮断周波数と位置
4-3 RC 直列回路の過渡解析
[目的]
RC 直列回路における過渡現象を解析する。
計算は、充電時 t=0 でスイッチオンするときのコンデンサ電圧の変化をグラフ表示する。
[手順と結果]
変数を初期化する。
(%i31) kill(all);
コンデンサの電圧を v=v(t)としている。
回路図の回路の微分方程式を以下に示す。
Ode2 関数を用いて、微分方程式を解く
(%i1) ode2(R*C*'diff(v,t)+v=E,v,t);
解が得られたので、簡単化する。
(%i2) factor(%);
初期値を代入する関数:ic1 関数を用いる。
(%i3) ic1(%,t=0,v=0);
得られた解を展開して、kai に代入する。
(%i4) kai:expand(%);
Fig.1 CR 直列回路
変数に実験の R,C,E の値を代入する。
R=10kohm, C=0.01uF, E= 5V
(%i5) vval:ev(rhs(%),E:5,R:10*10^3,C:0.01*10^-6);
コンデンサ電圧 Vc(t)関数を定義する。
(%i6) define(Vc(t),%);
表示範囲に注意して、グラフ表示する。
(%i7) wxplot2d(Vc(t),[t,0,1*10^-3],
/* [logx],[logy], */
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[gnuplot_preamble,"set grid"]);
時定数を定義する。
(%i8) tcut:C*R;
R,C に値を代入する。
(%i9) tc:ev(%,R:10*10^3,C:0.01*10^-6);
Fig.2 コンデンサ電圧 Vc(t)のグラフ
時定数の時間でのコンデンサの電圧を求める。
(%i10) Vc(tcut);
この式に、C,R を代入すると、値が得られる。
(%i11) Vcut:ev(%,R:10*10^3,C:0.01*10^-6);
最大値に対する割合をパーセント表示で確認する。 約 63%であることが確認できた。
(%i12) %/5*100;
計算した結果をリスト xdata, ydata として定義する。
(%i13) datax:[tc]; datay:[Vcut];
コンデンサ電圧 Vc(t)と、時定数の場所を同時に表示して、場所を確認する。
(%i15) wxplot2d([Vc(t),[discrete,datax,datay]],[t,0,1*10^-3],
/* [logx],[logy], */
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[color,blue,red],
[style,lines,points],
[point_type,circule],
[legend,false],
[gnuplot_preamble,"set grid"]);
Fig.3 コンデンサ電圧 Vc(t)と時定数のときの場所
時刻 t=0 での、コンデンサ電圧 Vc(t)の微分係数を計算する。
解:kai の右辺を取り出して、Vcf(t)関数を定義する。
(%i16) define(Vcf(t),rhs(kai));
関数が定義できたので、微分係数: dVc を求める。
(%i17) dVc:diff(Vcf(t),t);
得られた微分係数:dVc に、時刻 t=0 を代入すると、
時間 t=0 での微分係数:dVc0 が得られる。
(%i18) dVc0:ev(dVc,t:0);
グラフ表示をするために、
回路で使用した R,C の値を代入する。
(%i19) ev(%,E:5,R:10*10^3,C:0.01*10^-6);
時刻 t=0 での接線を定義する。
(%i20) define(Vc0(t),%*t);
コンデンサ電圧:Vc(t)と接線を同時に表示して確認する。
(%i22) wxplot2d([Vc(t),Vc0(t)],[t,0,1*10^-3],
/* [logx],[logy], */
[y,0,5],
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[color,blue,red],
[style,lines,lines],
/* [point_type,circule],*/
[legend,false],
[gnuplot_preamble,"set grid"]);
以上で、t=0 での接線とコンデンサ電圧が表示できました。
[参考文献]
[1]鎌倉、上、渡辺、“電気回路”、培風館, p136
Fig.4 t=0 の接線とコンデンサ電圧 Vc(t)のグラフ
4-4 RC 直列回路の過渡解析- Switch off について
[目的]
RC 直列回路における過渡現象を解析する。
計算は、充電時 t=0 でスイッチオフするときのコンデンサ電圧の変化をグラフ表示する。
[手順と結果]
変数の初期化
(%i1) kill(all);
回路図の微分方程式を定義して、
Ode2 関数を用いて、方程式を解く。
(%i1) ode2(R*C*'diff(v,t)+v=0,v,t);
初期値を代入する関数:ic1 関数を用いる。
(%i2) kai:ic1(%,t=0,v=E);
変数に実験の R,C,E の値を代入する。
R=10kohm, C=0.01uF, E= 5V
(%i3) vval:ev(rhs(%),E:5,R:10*10^3,C:0.01*10^-6);
コンデンサ電圧 Vc(t)関数を定義する。
(%i4) define(Vc(t),%);
Fig.1 CR 直列回路
表示範囲に注意して、グラフ表示する。
(%i5) wxplot2d(Vc(t),[t,0,1*10^-3],
/* [logx],[logy], */
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[gnuplot_preamble,"set grid"]);
時定数を定義する。
(%i6) tcut:C*R;
R,C に値を代入する。
(%i7) tc:ev(%,R:10*10^3,C:0.01*10^-6);
時定数の時間でのコンデンサの電圧を求める。
(%i8) Vcut:Vc(tc);
最大値に対する割合をパーセント表示で確認する。
(%i9) %/5*100;
計算した結果をリスト xdata, ydata として定義する。
(%i10) datax:[tc]; datay:[Vcut];
Fig.2 CR 直列回路における過渡現象のグラフ
コンデンサ電圧 Vc(t)と、時定数の場所を同時に表示して、場所を確認する。
(%i12) wxplot2d([Vc(t),[discrete,datax,datay]],[t,0,1*10^-3],
/* [logx],[logy], */
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[color,blue,red],
[style,lines,points],
[point_type,circule],
[legend,false],
[gnuplot_preamble,"set grid"]);
時刻 t=0 での、コンデンサ電圧 Vc(t)の微分係数を計算する。
解:kai の右辺を取り出して、Vcf(t)関数を定義する。
(%i13) define(Vcf(t),rhs(kai));
関数が定義できたので、微分係数: dVc を求める。
(%i14) dVc:diff(Vcf(t),t);
得られた微分係数:dVc に、時刻 t=0 を代入すると、
時間 t=0 での微分係数:dVc0 が得られる。
(%i15) dVc0:ev(dVc,t:0);
Fig.3 過渡現象のグラフにおける時定数での位置
グラフ表示をするために、
回路で使用した R,C の値を代入する。
(%i16) ev(%,E:5,R:10*10^3,C:0.01*10^-6);
時刻 t=0 での接線を定義する。
(%i17) define(Vc0(t),%*t);
コンデンサ電圧:Vc(t)と接線を同時に表示して確認する。
(%i18) wxplot2d([Vc(t),5+Vc0(t)],[t,0,1*10^-3],
/* [logx],[logy], */
[y,-1,5],
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[color,blue,red],
[style,lines,lines],
/* [point_type,circule],*/
[legend,false],
[gnuplot_preamble,"set grid"]);
[参考文献]
[1]鎌倉、上、渡辺、“電気回路”、培風館, p136
Fig.4 t=0 での接線の表示
4-5 ラプラス変換を用いた CR 直列回路の過渡解析
[目的]
ラプラス変換を用いて過渡現象の微分方程式を解く。
[手順と結果]
変数の初期化する。
(%i21) kill(all);
充電する場合についての微分方程式を定義する。
(%i1) eq2:R*C*'diff(v(t),t)+v(t)=E;
変数を正の値と仮定する。
(%i2) assume(R>0,C>0,E>0);
ラプラス変換を実行する。
(%i3) laplace(eq2,t,s);
変数分離するために、Laplace(V(t),t,s)を求める
(%i4) solve(%,'laplace(v(t),t,s));
部分分数に分解する。
(%i5) partfrac(%,s);
逆ラプラス変換を実行する。
(%i6) f(t)=ilt(rhs(first(%)),s,t);
Fig.1 CR 直列回路
初期値を代入する。
(%i7) kai0:subst(0,v(0),%);
式の簡単化を実行する。
(%i8) kai0a:expand(kai0);
実験値を代入する。
R=10kohm, C=0.01uF, E= 5V
(%i9) Eval:ev(rhs(kai0),E:5,R:10*10^3,C:0.01*10^-6);
関数を定義する。
(%i10) define(Vcup(t),%);
充電時のグラフを表示する。
(%i11) wxplot2d(Vcup(t),[t,0,1*10^-3],
[xlabel,"t [sec]"],
[ylabel,"Vc(t) [V]"],
[gnuplot_preamble,"set grid xtics ytics;"]
);
Fig.2 CR 直列回路の充電特性のグラフ
次に、
放電する場合についての微分方程式を定義する。
(%i12) eq1:R*C*'diff(v(t),t)+v(t)=0;
ラプラス変換を実行する。
(%i13) laplace(eq1,t,s);
変数分離するために、Laplace(V(t),t,s)を求める
(%i14) solve(%,'laplace(v(t),t,s));
部分分数に分離する。
(%i15) partfrac(%,s);
逆アプラス変換を実行する。
(%i16) f(t)=ilt(rhs(first(%)),s,t);
初期値を代入する。
(%i17) kai:subst(E,v(0),%);
実験値を代入する。
(%i18) Eval1:ev(rhs(kai),E:5,R:10*10^3,C:0.01*10^-6);
関数を定義する。
(%i19) define(Vcdw(t),%);
放電時のグラフを表示する。
(%i20) wxplot2d(Vcdw(t),[t,0,1*10^-3],
[xlabel,"t [sec]"],
[ylabel,"Vc(t) [V]"],
[gnuplot_preamble,"set grid xtics ytics;"]
);
Ref. site
[1]Graphic Command Examples
http://academic.udayton.edu/LenoPedrotti/wxmaxima/plotexamples.html
Fig.3 CR 直列回路の放電特性のグラフ
4-6 Low-pass フィルタの実験データと理論値について
[目的]
実験データと理論値を同時表示する。
[手順と結果]
変数を初期化する。
(%i70) kill(all);
コンデンサの電圧を Vout にして、Vout/Vin を定義する。
(%i1) Vc:1/(%i*w*C)/(R+1/(%i*w*C));
分母を取り出す。
(%i2) dvc:denom(Vc);
複素共役を求める。
(%i3) dvcc:conjugate(dvc);
分子を取り出す。
(%i4) nvc:num(Vc);
分子に分母の複素共役数を掛ける。
(%i5) nvn:expand(nvc*dvcc);
上の結果の実数部と虚数部から、
位相を計算できることを確認する。
(%i6) phi:atan(imagpart(nvn)/realpart(nvn));
フィルターの入出力比 Vc の大きさを計算する。
(%i7) vout:factor(cabs(Vc));
遮断周波数:fc を計算する。
(%i8) fc:1/(2*%pi*C*R);
実験値を代入する。
(%i9) voutn:ev(vout,R:10*10^3,C:0.01*10^-6);
角周波数を周波数に変換する。
(%i10) ratsubst(2*%pi*f,w,%);
電圧 Vo を周波数 f の関数として定義する。
(%i11) define(Vo(f),%);
Vo の大きさが、1/sqrt(2)になる周波数を求める。
(%i12) sol:solve(Vo(f)-1/sqrt(2)=0,f);
周波数は正の値であるので、リストの2番目を取り出す。
(%i13) sol2:float(sol[2]);
値のみを取り出す。
(%i14) datax:rhs(sol2);
解を代入して、電圧値を確認する。
(%i15) datay:float(rhs(Vo(sol2)));
以上の計算結果を表示する。
理論グラフと遮断周波数:fc を同時に表示する。
(%i16) wxplot2d([Vo(f),[discrete,[datax],[datay]]],[f,10,10*10^3],
[logx],
[y,0,1],
[xlabel,"Frequency[Hz]"],
[ylabel,"Vout/Vin [non-unit]"],
[color,blue,red],
[style,lines,points],
[point_type,circule],
[legend,false],
[gnuplot_preamble,"set grid"]);
遮断周波数を変数の形で求める。
(%i17) vout;
(%i18) solve(vout=1/sqrt(2),w);
Fig.1 理論グラフと fc
実験では、出力入力電圧比をデシベルで表示する。
計算結果を単位を dB に変換する
参考文献:Kamakura, book p106, "Denki kairo", Baifuukan, 1998
はじめに、1/sqrt(2)を log 変換する。
注意点として、Maxima における log は自然対数である。
従って、以下のように、log(10)で割る必要がある。
(%i19) 20*log(1/sqrt(2))/log(10);
実数表示して、変数の代入する。
(%i20) y3dB:float(%);
グラフに、遮断周波数:fc の位置を明確するための
線を表示する。そのために、座標のリストを作成する。
はじめに、3dB の横の線用の周波数座標を定義する。
周波数は、表示範囲を入力する。
(%i21) linex3dB:[10,100*10^3];
縦軸の dB の値を定義する。
(%i22) liney3dB:[y3dB,y3dB];
つぎに、遮断周波数 fc の場所を線で表示するための座標を定義する。
周波数 fc を定義する。
(%i23) linexfc:[datax,datax];
縦軸は、グラフ上から下まで線を描くので以下の値を定義する。
(%i24) lineyfc:[0,-40];
以上の結果を、同時にグラフに表示する。
以下のグラフのように、理論線、3dB の線と遮断周波数の線を表示できた。
(%i25) wxplot2d([20*log(Vo(f))/log(10),[discrete,linex3dB,liney3dB],[discrete,linexfc,lineyfc]],
[f,10,100*10^3],
[logx],
[legend,false],
[xlabel,"Frequency[Hz]"],
[ylabel,"20log(Vout/Vin) [dB]"],
[gnuplot_preamble,"set grid"]);
自然対数の関数:log10 を用いる場合には、Package:log10 を読み込む必要がある。
load(log10);
参考サイト:
http://www10.atwiki.jp/bambooflow/pages/153.html#id_b740fc33
実験データは、 Morihayashi さまのレポートから引用しました。
測定した周波数をリストで代入する。
(%i26) dataxF:[10,100,300,500,1000,1550,1597,1600,1650,1700,1750,1800,3000,5000,7000,10000,20000,30000,40000,50000,100000];
測定した結果の Vout を入力 Vin で割った値をリストで代入する。
(%i27) datayR:[1,0.98,0.96,0.94,0.82,0.7,0.7,0.7,0.68,0.66,0.66,0.65,0.45,0.29,0.22,0.155,0.08,0.053,0.040,0.032,0.016];
Fig.2 dB 表示と fc の位置
はじめに、データを log に変換する。
(%i28) datayRdB:map(log,datayR);
上の計算結果を自然対数にして 20 倍することで、単位が dB になる。
(%i29) datayRdB10:float(20*datayRdB/log(10));
以上の実験データをグラフに表示する。
(%i30) wxplot2d([discrete,dataxF,datayRdB10],
[x,10,100*10^3],
[logx],/*[logy],
*/
[style,points],
[color,red],
[gnuplot_preamble,"set grid"]);
Fig.3 実験グラフの表示
以下に、すべての結果を表示する。
このグラフに、
実験データと理論値グラフに、遮断周波数:fc と 3dB の線を同時に表示した。
(%i33) wxplot2d([20*log(Vo(f))/log(10),[discrete,dataxF,datayRdB10],[discrete,linex3dB,liney3dB],[discrete,linexfc,lineyfc]],
[f,10,100*10^3],
[logx],/*[logy],*/
/*[y,0,1],*/
[xlabel,"Frequency[Hz]"],
[ylabel,"20log(Vout/Vin) [dB]"],
[color,blue,red,green,black],
[style,lines,[points,2],lines,lines],
/*[point_type,circule],*/
[legend,"Theory","Exp","-3dB","fc"],
[gnuplot_preamble,"set key left bottom;"],
[gnuplot_preamble,"set grid"]);
以上のグラフから、実験値と理論値が一致していることが確認できます。
参考サイト:
[1] legend position について
http://www.gnuplot-cmd.com/chart/key.html
Fig.4 実験と理論グラフの比較
4-7 Lowpass フィルタの位相-周波数変化における実験データと理論値について
[目的]
実験データと理論値のグラフを同時に表示する。
[手順と結果]
変数の初期化。
(%i23) kill(all);
コンデンサの両端の電圧:Vc を定義する。
(%i1) Vc:1/(%i*w*C)/(R+1/(%i*w*C));
Vc の分母を取得する。
(%i2) dvc:denom(Vc);
Calculate congudated Complex number
分母の複素共役を求める。
(%i3) dvcc:conjugate(dvc);
Vc の分子を取り出す。
(%i4) nvc:num(Vc);
分子に分母の複素共役を掛ける。
(%i5) cngnvc:expand(nvc*dvcc);
実数部と虚数部から、
位相を計算する。
(%i6) phi:atan(imagpart(cngnvc)/realpart(cngnvc));
実験で使用した値を代入する。
(%i7) phin:ev(phi,R:10*10^3,C:0.01*10^-6);
角周波数を周波数に変換する。
(%i8) ratsubst(2*%pi*f,w,%);
位相を周波数の関数として定義する。
(%i9) define(Ph(f),%);
The absolute value is calculate using the conjugate value
遮断周波数:fc を計算する。
(%i10) fc:1/(2*%pi*C*R);
数値を代入する。
(%i11) fc0:ev(fc,R:10*10^3,C:0.01*10^-6);
位相から、遮断周波数をもとめる。
位相が-45°のときが、遮断周波数である。
Solve 関数を用いて、遮断周波数:fc をもとめる。
(%i12) kai:solve(Ph(f)=-%pi/4,f);
解のリストから要素の1番目を取り出して、その右辺を取り出して:fc に代入する。
(%i13) fc:float(rhs(kai[1]));
遮断周波数 fc を位相関数に代入して値を確認する。
(%i14) phic:float(Ph(fc)*180/%pi);
つぎに、グラフに遮断周波数の位置を明確に表示するために、線を描く。
はじめに、遮断周波数の縦の線を描くためのリストを作成する。
縦軸の座標を定義する。
(%i15) yline:[0,-90];
横軸は遮断周波数を入力する。
(%i16) xline:[fc,fc];
-45°の横の線を描くためのリストを作成する。
(%i23) xline45:[10,100*10^3];
y軸は、-45°のリストである。
(%i24) yline45:[-45,-45];
理論値グラフと、遮断周波数の位置を示す線を同時に表示する。
(%i37) wxplot2d([Ph(f)*180/%pi,[discrete,[fc],[phic]],[discrete,xline,yline],[discrete,xline45,yline45]],
[f,10,100*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Phase [deg.]"],
[style,line,[points,3,2],[lines,1,2],[lines,1,5]],
[legend,"Phase","Cut-off","fc","-45Deg."],
[gnuplot_preamble,"set grid"]);
Fig.1 理論グラフと fc
実験データ: Morihayashi さまのレポートから引用しました。
Frequency data
(%i18) dataxF:[10,100,300,500,1000,1550,1597,1600,1650,1700,1750,1800,3000,5000,7000,10000,20000,30000,40000,50000,100000];
Phase data.
(%i19) datayP:[-0.576,-3.24,-10.8,-16.6,-31.7,-44.6,-44.8,-44.9,-45.1,-46.5,-47.9,-48.6,-62.6,-72.0,-77.6,-80.6,-85.0,-86.4,-86.4,-86.4,-87.8];
実験データをグラフ表示する。
--> wxplot2d([discrete,dataxF,datayP],
[x,10,100*10^3],
[logx],
/*[logy],*/
[style,points],
[color,red],
[gnuplot_preamble,"set grid"]);
Fig.2 実験グラフの表示
実験データと理論値グラフを同時に表示する。
--> wxplot2d([Ph(f)*180/%pi,[discrete,dataxF,datayP]],
[f,10,100*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Phase [deg.]"],
[style,line,points],
[legend,"Phase","Cut-off"],
[gnuplot_preamble,"set grid"]);
以上の結果をすべて表示したグラフを以下に示す。
(%i39) wxplot2d([Ph(f)*180/%pi,[discrete,dataxF,datayP],[discrete,xline,yline],[discrete,xline45,yline45]],
[f,10,100*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Phase [deg.]"],
[style,line,points,line,line],
[legend,"Phase","Cut-off","fc","-45deg."],
[gnuplot_preamble,"set grid"]);
以上で、実験データと理論グラフ、さらに、遮断周波数と-45°の関係を示すグラフが表示できました。
Fig.3 実験と理論グラフの表示
Fig.4 実験と理論グラフと fc の関係
4-8 RC 直列回路の実験データと過渡現象-充電特性
[目的]
Switch-on した過渡現象におけるコンデンサの電圧 Vc の実験データと理論値をグラフ化する。
[手順と結果]
変数の初期化する。
(%i26) kill(all);
電圧に関する常微分方程式を解く
(%i1) ode2(R*C*'diff(v,t)+v=E,v,t);
簡単化を実行する。
(%i2) factor(%);
解に、初期値を代入する。
(%i3) ic1(%,t=0,v=0);
得られた解を簡単化する。
(%i4) kai:expand(%);
解の右辺を取り出して、実験で使用した値を代入する。
R=10kohm, C=0.01uF, E= 5V
(%i5) vval:ev(rhs(%),E:4,R:10*10^3,C:0.01*10^-6);
時間 t の関数として定義する。
(%i6) define(Vc(t),%);
解のグラフを表示して確認する。
(%i7) wxplot2d(Vc(t),[t,0,1*10^-3],
/* [logx],[logy], */
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[gnuplot_preamble,"set grid"]);
時定数:CR を定義する。
(%i8) tcut:C*R;
実験で用いた R,C を代入する。
(%i9) tc:ev(%,R:10*10^3,C:0.01*10^-6);
Tcut のときの電圧を計算する。
(%i10) Vc(tcut);
実験で使用した R,C を代入する。
(%i11) Vcut:ev(%,R:10*10^3,C:0.01*10^-6);
入力電圧 Vin=4 で割り、割合を計算する。
(%i12) %/4*100;
Fig.1 理論グラフの表示
グラフ上に、
時定数のときの場所を表示するために、座標をリスト保存する。
(%i13) datax:[tc]; datay:[Vcut];
時定数の場所に線を引くために、座標をリスト保存する。
時定数の時間の線の横軸の座標を保存する。
(%i22) linextc:[tc,tc];
縦軸の座標を保存する。
(%i23) lineytc:[0,4];
つぎに、
横軸の線を描くために、座標をリスト保存する。
(%i25) linexVc:[0,400*10^-6];
時定数のときの電圧の値をリスト保存する。
(%i26) lineyVc:[Vcut,Vcut];
以上の結果を同時に、グラフ表示する。
--> wxplot2d([Vc(t),[discrete,datax,datay],
[discrete,linextc,lineytc],
[discrete,linexVc,lineyVc]],
[t,0,400*10^-6],
/* [logx],[logy], */
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[color,blue,red,black,black],
[style,line,points,line,line],
[point_type,circule],
[legend,false],
[gnuplot_preamble,"set grid"]);
実験データは、Morihayashi のレポートから引用しました。
実験データの時間をリスト保存する。
ただし、単位が usec です。
(%i16) dataxt:[0,50,100,200,300,400];
オシロスコープから読み取った電圧値をリスト保存する。
(%i17) datayV:[0,1.56,2.52,3.44,3.8,3.92];
Fig.2 理論グラフと時定数の位置の関係
保存した実験データをグラフ表示する。
--> wxplot2d([discrete,dataxt*10^-6,datayV],
[x,0,400*10^-6],
/*[logx],[logy],
*/
[style,points],
[color,red],
[gnuplot_preamble,"set grid"]);
グラフ表示できることが確認できたので、
理論グラフ、時定数の場所も同時に表示する。
(%i39) wxplot2d([Vc(t),[discrete,dataxt*10^-6,datayV],
[discrete,linextc,lineytc],
[discrete,linexVc,lineyVc]
],
[t,0,400*10^-6],
/*[logx],[logy],*/
/*[y,0,1],*/
[xlabel,"time[sec]"],
[ylabel,"Vc[Voltage]"],
[color,blue,red,black,green],
[style,lines,points,line,lines],
/*[point_type,circule],*/
[legend,"Theory","Exp.data","tc","V(tc)"],
[gnuplot_preamble,"set key right bottom;"],
[gnuplot_preamble,"set grid"]);
Fig.3 実験グラフの表示
このグラフから、実験データと理論グラフが一致していることが確認できる。
定量的に考察するためには、誤差の評価をしなければならない。
Fig.4 実験と理論グラフの表示
4-9 RC 直列回路の実験データと過渡現象-放電特性
[目的]
Switch-off した過渡現象におけるコンデンサの電圧 Vc の実験データと理論値をグラフ化する。
[手順と結果]
変数の初期化する。
(%i23) kill(all);
電圧に関する常微分方程式を解く
(%i1) ode2(R*C*'diff(v,t)+v=0,v,t);
解に、初期値を代入する。
(%i2) kai:ic1(%,t=0,v=E);
解の右辺を取り出して、実験で使用した値を代入する。
R=10kohm, C=0.01uF, E= 5V
(%i3) vval:ev(rhs(%),E:4,R:10*10^3,C:0.01*10^-6);
時間 t の関数として定義する。
(%i4) define(Vc(t),%);
時定数:CR を定義する。
(%i6) tcut:C*R;
実験で用いた R,C を代入する。
(%i7) tc:ev(%,R:10*10^3,C:0.01*10^-6);
時定数:tc のときの電圧を計算する。
(%i8) Vcut:Vc(tc);
入力電圧 Vin=4 で割り、割合を計算する。
(%i9) %/4*100;
グラフ上に、
時定数のときの場所を表示するために、座標をリスト保存する。
(%i10) datax:[tc]; datay:[Vcut];
時定数の場所に線を引くために、座標をリスト保存する。
時定数の時間の線の横軸の座標を保存する。
(%i18) linextc:[tc,tc];
縦軸の座標を保存する。
(%i19) lineytc:[0,4];
つぎに、
横軸の線を描くために、座標をリスト保存する。
(%i21) linexVc:[0,400*10^-6];
時定数のときの電圧の値をリスト保存する。
(%i22) lineyVc:[Vcut,Vcut];
以上の結果を同時に、グラフ表示する。
(%i27) wxplot2d([Vc(t),[discrete,datax,datay],
[discrete,linextc,lineytc],
[discrete,linexVc,lineyVc]
],
[t,0,400*10^-6],
/* [logx],[logy], */
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[color,blue,red,black,green],
[style,line,points,line,line],
[point_type,circule],
[legend,false],
[gnuplot_preamble,"set grid"]);
実験データは、Morihayashi のレポートから引用しました。
実験データの時間をリスト保存する。
ただし、単位が usec です。
(%i13) dataxt:[0,50,100,200,300,400];
オシロスコープから読み取った電圧値をリスト保存する。
(%i14) datayV:[4.0,2.45,1.48,0.56,0.2,0.08];
Fig.1 理論グラフと遮断周波数の関係
保存した実験データをグラフ表示する。
(%i15) wxplot2d([discrete,dataxt*10^-6,datayV],
[x,0,400*10^-6],
/*[logx],[logy],
*/
[style,points],
[color,red],
[gnuplot_preamble,"set grid"]);
グラフ表示できることが確認できたので、
理論グラフ、時定数の場所も同時に表示する。
(%i31) wxplot2d([Vc(t),[discrete,dataxt*10^-6,datayV],
[discrete,linextc,lineytc],
[discrete,linexVc,lineyVc]
],
[t,0,400*10^-6],
/*[logx],[logy],*/
/*[y,0,1],*/
[xlabel,"time[sec]"],
[ylabel,"Vc[V]"],
[color,blue,red,black,green],
[style,lines,points,lines,lines],
/*[point_type,circule],*/
[legend,"Theory","Data","tc","Vc(tc)"],
[gnuplot_preamble,"set grid"]);
Fig.2 実験グラフの表示
このグラフから、実験データと理論グラフが一致していることが確認できる。
定量的に考察するためには、誤差の評価をしなければならない。
Fig.3 実験と理論グラフの表示
課題 1) High-pass フィルターの解析について
[目的]
High-pass フィルターの特性について解析する。
[手順と結果の解答例]
変数の初期化する。
(%i1) kill(all);
Vo=Vout/Vin を定義する。
(%i1) Vo:R/(R+1/(%i*w*C));
分母を取り出す。
(%i2) dvo:denom(Vo);
複素共役を求める。
(%i3) dvoo:conjugate(dvo);
分母に、複素共役を掛けて、簡単化する。
(%i4) expand(dvo*dvoo);
出力の分子を取り出す。
(%i5) nvo:num(Vo);
分子に分母の複素共役を掛ける。
(%i6) nvn:expand(nvo*dvoo);
Fig.1 High-pass Filter 回路
Vo
Vin
実数部を取り出す。
(%i7) realpart(nvn);
虚数部を取り出す。
(%i8) imagpart(nvn);
位相を計算する。
(%i9) phi:atan(imagpart(nvn)/realpart(nvn));
出力を複素数を用いて計算する。
(%i10) expand(Vo*conjugate(Vo));
標準関数 cabs を用いた式を簡単化する。
(%i11) vout:factor(cabs(Vo));
同様に、標準関数 carg を用いて位相を計算する。
(%i12) ph:factor(carg(Vo));
遮断周波数:fc を定義する。
(%i13) fc:1/(2*%pi*C*R);
実験値の R=10kohm, C=0.01uF を代入する。
(%i14) voutn:ev(vout,R:10*10^3,C:0.01*10^-6);
角周波数を周波数に変換する。
(%i15) ratsubst(2*%pi*f,w,%);
周波数の関数と定義する。
(%i16) define(Vo(f),%);
出力のグラフを表示する。
(%i17) wxplot2d(Vo(f),[f,10,10*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Vout/Vin [non-unit]"],
[gnuplot_preamble,"set grid"]);
Fig.2 大きさと周波数の関係
遮断周波数を計算する。(ルート計算できなかったので2乗して計算。)
(%i18) sol:solve(Vo(f)^2=1/2,f);
正の値を取り出して、代入する。
(%i19) sol2:float(sol[2]);
値のみを取り出す。
(%i20) fc0:datax:rhs(sol2);
遮断周波数のときの大きさを計算する。
(%i21) datay:float(rhs(Vo(sol2)));
遮断周波数の場所とグラフ表示する。
(%i22) wxplot2d([Vo(f),[discrete,[datax],[datay]]],[f,10,10*10^3],
[logx],
[y,0,1],
[xlabel,"Frequency[Hz]"],
[ylabel,"Vout/Vin [non-unit]"],
[color,blue,red],
[style,lines,points],
[point_type,circule],
[legend,false],
[gnuplot_preamble,"set grid"]);
Fig.3 遮断周波数の位置
出力電圧の確認する。
(%i23) vout;
大きさが 1/sqrt(2)となる角周波数を求める。
(%i24) solve(vout=1/sqrt(2),w);
大きさの単位をデシベル(dB)表示にする。
参考文献: Kamakura, book p106, "Denki kairo", Baifuukan, 1998
(%i25) 20*log(1/sqrt(2))/log(10);
実数に変換する。
(%i26) float(%);
デシベルに変換する。
(%i27) dataydB:%;
遮断周波数を確認する。
(%i28) datax;
遮断周波数の場所を線で表示するために、座標を設定する。
(%i29) yline:[0,-25];
(%i30) xline:[datax,datax];
縦軸を dB に変換したグラフに表示する。
((注意)) we need devide a log(10) to show the ordinary log.
(%i31) wxplot2d([20*log(Vo(f))/log(10),[discrete,[datax],[dataydB]],[discrete,xline,yline]],
[f,100,50*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Vout/Vin [dB]"],
[color,blue,red,black],
[style,lines,points,lines],
[point_type,circule],
[legend,"Amplitude","Cut-off point","fc"],
[gnuplot_preamble,"set grid"]);
常用対数を使用するには、package: log10 を読み込むと計算できます。
load(log10);
http://www10.atwiki.jp/bambooflow/pages/153.html#id_b740fc33
つぎに、high-pass フィルターの位相について解析する。
(%i32) ph;
実験値を代入する。
(%i33) voutn:ev(ph,R:10*10^3,C:0.01*10^-6);
Fig.4 dB 表示の High-pass Filter のグラフ
角周波数を周波数に変換する。
(%i34) ratsubst(2*%pi*f,w,%);
周波数の関数を定義する。
(%i35) define(Ph(f),%);
縦軸を度にした位相と周波数のグラフを表示する。
(%i36) wxplot2d(Ph(f)*180/%pi,[f,100,50*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Phase [deg.]"],
[gnuplot_preamble,"set grid"]);
以上で位相-周波数のグラフ表示できたので、位相グラフにおける遮断周波数場所を表示する。
遮断周波数は、%pi/4 であるので、遮断周波数を求める。
(%i37) assume(f>0);
Fig.5 High-pass Filter の位相-周波数グラフ
遮断周波数を計算する。
(%i38) kai:solve(Ph(f)=%pi/4,f);
実数表示して、fcに代入する。
(%i39) fc:float(rhs(kai[1]));
遮断周波数での位相を計算して位相を確認する。
(%i40) phic:float(Ph(fc)*180/%pi);
遮断周波数の位置と位相-周波数のグラフを表示する。
(%i41) wxplot2d([Ph(f)*180/%pi,[discrete,[fc],[phic]]],
[f,10,100*10^3],
[logx],
[xlabel,"Frequency[Hz]"],
[ylabel,"Phase [deg.]"],
[style,line,[points,3,2]],
[legend,"Phase","Cut-off"],
[gnuplot_preamble,"set grid"]);
Fig.6 遮断周波数の位置
課題 2) 入力信号が正弦波の場合の RC 直列回路における過渡解析
[目的]
入力が正弦波の場合における RC 直列回路の過渡特性の解析をする。
以下の参考文献[1]に詳細があります。
参考文献
[1] 鎌倉 その他、“電気回路”、倍風館、 p225
[手順と結果の解答例]
変数の初期化する。
(%i1) kill(all);
入力が正弦波である微分方程式を定義する。
方程式を解く。
(%i1) eq:ode2(R*C*'diff(v,t)+v=E*sin(w*t),v,t);
簡単化する
(%i2) factor(%);
初期値問題を解く。
(%i3) kai:ic1(%,t=0,v=0);
式を簡単化する。
(%i4) kai1:expand(%);
参考文献の解と同じ形式に変形するために、式の長さを求める。
(%i5) length(rhs(kai1));
すべての内容を分離表示する。
(%i6) [part(rhs(kai1),0),part(rhs(kai1),1),part(rhs(kai1),2),part(rhs(kai1),3)];
第1項成分の式の長さを求める。
(%i7) length(part(rhs(kai1),1));
第1項成分を分離表示する。
(%i8) [part(rhs(kai1),1,0),part(rhs(kai1),1,1)];
第1項成分を取り出す。
(%i9) trm1:factor(part(rhs(kai1),1,1));
第2項成分を取り出す。
(%i10) trm2:factor(part(rhs(kai1),2));
式の長さを求める。
(%i11) length(trm1);
式の分解ができたので、cos の項 と sin の項を取り出す。
(%i12) [part(trm1,0),part(trm1,1),part(trm1,2)];
Cos 項を取り出す。
(%i13) term1_1:part(trm1,1);
Cos 項の分母を取り出す。
(%i14) termDeno:part(trm1,2);
Sin 項に関係した項を分離表示する。
(%i15) [part(trm2,0),part(trm2,1),part(trm2,2)];
Sin 項を取り出す。
(%i16) term2_1:part(trm2,1);
式の長さを求める。
(%i17) length(part(trm1,1));
Cos の項の係数を取り出す。
(%i18) termCos:part(part(trm1,1),1)*part(part(trm1,1),3)*part(part(trm1,1),4)*part(part(trm1,1),5);
同様に、Sin の項の係数を取り出す。
(%i19) termSin:part(part(trm2,1),2);
変数 E を正の値と仮定する。
(%i20) assume(E>0);
それぞれの係数が直角三角形の底辺と高さであるので、長さを計算する。
(%i21) dist:factor(sqrt(termSin^2+termCos^2));
底辺と高さから、位相 phi が計算できる。Phi を正の値と仮定する。
(%i22) assume(phi>0);
位相 phi を次式で定義する。sin(phi)=-termCos/dist、cos(phi)=termSin/dist
(%i23) -termCos/dist;
(%i24) termSin/dist;
位相 phi の tangent は、以下で得られる。
(%i25) termCos/termSin;
式変形を実行する。
(%i26) eq1L:(ratsubst(sin(phi),-termCos/dist,term1_1));
(%i27) eq1R:(ratsubst(cos(phi),termSin/dist,term2_1));
以上で大きさと位相を定義すると以下の形式に変形できる。
(%i28) sin(t*w)*cos(phi)-sin(phi)*cos(t*w);
三角関数の加法定理を実行する。
(%i29) trigreduce(%);
係数をかける。
(%i30) 1/sqrt(termDeno)*%;
実験で使用した値を代入する。
R=10kohm, C=0.01uF, E= 5V, f=10kHz
(%i31) vval:ev(rhs(kai1),E:5,R:10*10^3,C:0.01*10^-6,w:2*%pi*1*10^3);
時間 t の関数を定義する。
(%i32) define(Vc(t),%);
過渡現象の解 Vc(t)のグラフを表示する。
(%i33) wxplot2d(Vc(t),[t,0,2*10^-3],
/* [logx],[logy], */
[xlabel,"time[sec]"],
[ylabel,"Vc [V]"],
[gnuplot_preamble,"set grid"]);
以上で、参考文献[1]と同様な計算が確認できました。
Fig.1 Vc(t)の解析結果グラフ