アナログコンピュータは、デジタルコンピュータ(現在のパソコンなど)以前に
微分方程式や積分方程式を解くために利用されていた計算機です。
オペアンプ(演算増幅器)による積分器や加算器などのアナログ電子回路を
もちいて各種の計算を行います。
ここでは SPICE をつかって、アナログコンピュータをシミュレートします。
パソコン(デジタルコンピュータ)でアナログコンピュータのシミュレート
をするというのは本末転倒な気がしますが、
手軽に学生実験のようなことが行えますし、
逆に本物のアナログコンピュータの面倒な配線や、
各ノード電位の設定などをシミュレータ上で手軽におこなえます。
演算結果が高電圧になっても大丈夫です。
このサンプルは、実用性というよりは、学習目的です。
サンプルファイルでは、サブサーキットとして、
以下の7つの機能ブロックを作成してあります。
サブサーキットの中身は、残念ながらアナログ部品ではなく、
behavioral モデルを使用しています。
上記のようにサブサーキットのリストを表示するためには、
解凍したサンプルファイルのフォルダ内にある、
top?.asc(?は数字)を開いて、部品選択画面メニューを開き、
画面一番上の Top Directory をプルダウンメニューより、
上記のようにサンプルファイルのあるディレクトリに切り替えてください。
なお、
-
Add2、Add5 はそれぞれ2入力、5入力の加算器で、
すべての入力の電位を加算した値を出力します。
-
Integ は3入力の積分器で、すべての入力の電位を加算し積分します。
積分器の出力初期値を規定するため、パラメータ INIT を定義する
必要があります。
-
Mul は2入力の乗算器で、入力の電位を乗算した値を出力します
-
Mul_10、Mul_100、Mul_N1 は定数倍器で、それぞれ、入力を 10、100、-1 倍します。
サブサーキットのすべての入力インピーダンスは 100Meg Ωです。
また、
回路図上で使用していない入力ピンの処理について、
なにもしなくて(オープンのままで)問題ないようですが、基本的に 0(= GND)に
接続しておきます。
サンプルファイルは、top1.asc です。
y が時間 t の関数であるとし、
一階の微分方程式、y' = y をといてみます。
積分器の出力を y とすれば、入力は y' となりますので、
アナログコンピュータ上で回路を組むと、
入力と出力を結線することにより実現されます。
この場合、入力と出力が直接結線されひとつのノードに
なりますので、まとめて y とラベルします。
次に、積分器の初期値を決めます。
積分器のシンボルの上にマウスカーソルを置き、
右クリックすると、パラメータ入力画面が現れますので、
以下のように、パラメータ INIT を定義します。
(あわせて、Visible も有効にし回路図上に表示します。)
回路図は以下のようになります。
パラメータ INIT が見にくい位置にきますので適当に移動してください
(手のアイコンを使います)。
ちなみに、初期値を 0 とすると意味のある解(?)はえられません。
積分器の出力 0[V] において、入力も 0[V] となり
0[V]をいくら積分しても 0[V] で安定してしまい、
結果として、y = 0 という特殊解が得られるためです。
さて、これでシミュレーションを行ってみると、
y' = y において、y(0)=1 なる初期値を与えたので、
結果は、y= Exp(t) のカーブとなります。
確認のため、任意の関数を生成できる素子 BV をもちいて
EXP(T) を生成し、比較します。
結果は完全に一致します。(グラフが完全に重なってしまっているため
見にくいですが。)
サンプルファイルは top2.asc です。
例1と同様ですが、今回は積分器を2つ直列に
つなぎます。2段目の出力を y とすれば、
2段目の入力(=一段目の出力)は y' となり、
一段目の入力が y'' となります。
今回は、-ω^2 という係数が入りますのでこれを
のようにして実現します。
とりあえず完成後の回路図は以下のようになります。
R1 および R2 の抵抗分割により ω^2/100 を作っています。
y'' = -ω^2 * y の一般解は、
y = C1 * cos(ωt) + C2 * sin(ωt)
となり、初期値により、y(0) = C1、y'(0) = C2*ω が与えられます。
したがって、上記回路のままシミュレーションを行うと、
y(0) = 0、y'(0) = ω より、y = sin(ωt) なる解が得られるはずです。
実際のシミュレーション結果は以下のようになります。
ただ、回路図中にもコメントしてありますが、
トランジェント解析の計算ステップ Maximum Timestep を十分小さく設定しないと正弦波の
周期に誤差がでるようです。
サンプルファイルは、top3.asc です。
ある物体を、水平からの角度 Angle[deg]、
初速 Velocity[m/s]にて投げ上げたときの、
最高高度および到達距離を考えます。
簡単のため空気の抵抗などは無視します。
このとき、水平、垂直方向への初速度はそれぞれ、
Velocity * Cos(Angle)、Velocity * Sin(Angle) と
表すことが出来ます。
垂直方向への速度は、重力加速度の影響をうけ徐々に減少していきます。
これを積分器を用いて、垂直方向に関する加速度、速度および位置の
関係、水平方向に関する速度および位置の関係を表した例が以下です。
この例では、.STEP PARAM コマンドにより、
パラメータ Angle を 30, 45, 60, 75[deg] と振ってシミュレーションを
かけます。したがって、この場合、.PARAM Angle の設定は無視されます。
これをシミュレーションして、V(PY) を表示すると以下のようになります。
ただ、このグラフの表示ですとシミュレーション結果の意味を
直感的に把握することが若干困難です。
できれば横軸は、横方向の位置情報 V(PX) をとりたいところです。
グラフの表示で、時間(TIME)以外の値を X 軸にとるためには、
X 軸上にマウスカーソルを移動し、カーソルの形状がものさしに
変わったところで、左クリックします。
あらわれた X 軸設定ウィンドウにて、
以下のように X 軸に設定したいパラメータを Quantity Plotted: の
欄に記述します。
これにより、グラフは以下のようになります。
表示範囲が若干広すぎますが、
これも同様に、X 軸および Y 軸設定ウィンドウにて
マニュアルで変更できます。
設定範囲を調整した例です。
なぜ、全ての線が原点からスタートしないのかは不明ですが、
どうもシミュレータが V(PX) について初期値での計算を
パラメータを振ったときの最初の一回しか計算していないのではないか?
という気がしますが定かではありません...