sf を使った直列共振回路動作のシミュレーション

共振回路の動作は直感と矛盾したように最初は感じられます。受動部品だけなのに入力した電圧よりも大きな電圧が発生するのに違和感を感じる方が多いはずです。

これは一種の電圧増幅が発生するのは時間が利いてくるため、また抵抗よりもインダクタンスが回路動作を支配するためです。

回路の共振周期と同じ周期の電圧信号を与えると、回数ごとに電圧がコンデンサに蓄積されていくので、入力電圧よりも高い電圧が部分的に発生します。でも一サイクルだけでは入力電圧よりも高い電圧は発生しません。

インダクタンス L が優勢であることも入力回路より高い電圧を発生させるには必須です。そのことは回路シミュレーションで良く分かるはずです。

以下では Laplace 変換を理解しており、L, C, R 単体素子ののステップ応答などを計算できることを前提として直列共振回路動作のシミュレーションを説明します。

直列共振回

下の直列共振回路を考えます。

下の回路定数であるとします。
R=10`Ω       #Ω
L= 1`uH       # 1 マイクロ ヘンリー
C= 0.01`uF    # 0.01 マイクロ ファラッド
この回路の共振周波数は下のように計算されます
!sqrt(1/(C L))/(2 `π)  # Hz
< 1.59155e+006 >        # 1.6MHz
ならば回路動作を調べる範囲は 10MHz から 0.2MHz=10MHz/50 で充分なようです。ならばサンプリング時間間隔
# サンプリング周期
Δt = 10`nS     # 10 nSec  10 MHz の 10 倍

# 1000 点のデータを計算する
N = 1000

とし、N = 1000 のデータを計算すれば良さそうです

V @= [[N,2]] の電圧行列と I@=<<N>>電流ベクタを設け、V[*,0] に入力電圧を設定します。連続電圧 V(t)の時間変化を離散化した値を与えます。

コンデンサ C の両端にかかる電圧が V[*,1] 側であるとし、また R,L,C に流れる電流を I としたとき、任意の 1 より大きいインデックス k について下の式が成立します。

    V[k,1] = V[k-1,1] + I[k-1] Δt /C
    I[k] =  I[k-1] + (V[k,0]-V[k,1])1/R (1- !exp(-R/L Δt))

I と V[*,1] の二つの変数を Flog Leap 法(蛙跳び法)で計算するため、最初の I[0] だけは 1/2 Δt のタイミングで下のように計算します。

t @= 0.5 Δt, I[0] = (V[0,0]-V[0,1])1/R (1- !exp(-R/L t))  

10MHz から 0.2MHz=10MHz/50 までの入力電圧のスイープは下のような sf ベクタ式で与えられます。

<< 0,N,Δt @ t | !sin(ω!exp(-!log(50)_n/N) t)>>

これらを全部組み合わせると下の sf 式による直列共振回路のシミュレーション計算 sf ブロック式が作れます。

//@@
/s
V @= [[N,2]]
I @= <>
#V[*,0] = <<0,N,Δt @ t | !sin(ω t)>> # 1V 振幅 10 MHz 電圧を V[t,0] を設定する
# 1V 振幅 で 10 -- 0.2 MHz を sweep する V[t,0] を設定する
V[*,0] = <<0,N,Δt @ t | !sin(ω!exp(-!log(50)_n/N) t)>>
#<== _n は sf が用意する default index 変数であり、0 ... N の整数が入る。

#flog leap を使う。最初の 1/2 Δt における電流を計算する
t @= 0.5 Δt, I[0] = (V[0,0]-V[0,1])1/R (1- !exp(-R/L t))  
<<1,N-1,1 @ k|\
    V[k,1] = V[k-1,1] + I[k-1] Δt /C
    I[k] =  I[k-1] + (V[k,0]-V[k,1])1/R (1- !exp(-R/L Δt))
>>
mtV = V
vctI = I
//@@@

計算結果は mtV の sf 行列変数と vctI 電流ベクタに残されます。この直列共振回路の入力電圧を 10MHz から 0.2MHz までスイープしたときの電流の変化は vctI に残っており、それは

gdsp vctI
により gnuplot に表示させられます。

コンデンサ C の両端電圧の変化は mtV[*,1] 側にあります。下の操作で gnuplot 表示させられます。

# mtV 行列の 1 列側をベクタとし、コンソールと _dt 変数に出力します
mtV[*,1]
# gnuplot の二次元グラフ表示 bat ファイル gdsp のデフォルト引数は _dt です
gdsp

電流に良く似た電圧波形です。でも左端の 10MHz 近辺での共振していない部分は電流よりは相対的に小さな振動になっています。電圧と電流は相似波形ではないこと解ります。

R を 1Ω にしても流れる電流はにたようなものであることが分かります。電圧が 0 の状態から共振周波数の入力電圧を与えつづけると振幅がだんだん大きくなっていくことも見られます。受動素子のみでありながら、時間が経過する事で増幅することが見られます。是非とも御自分で計算・確認して下さることを希望します。