アナログコンピュータシミュレーション

2003年10月13日更新
サンプルファイルのダウンロード

回路の説明

アナログコンピュータは、デジタルコンピュータ(現在のパソコンなど)以前に 微分方程式や積分方程式を解くために利用されていた計算機です。 オペアンプ(演算増幅器)による積分器や加算器などのアナログ電子回路を もちいて各種の計算を行います。 ここでは SPICE をつかって、アナログコンピュータをシミュレートします。 パソコン(デジタルコンピュータ)でアナログコンピュータのシミュレート をするというのは本末転倒な気がしますが、 手軽に学生実験のようなことが行えますし、 逆に本物のアナログコンピュータの面倒な配線や、 各ノード電位の設定などをシミュレータ上で手軽におこなえます。 演算結果が高電圧になっても大丈夫です。 このサンプルは、実用性というよりは、学習目的です。

サンプルファイルについて

サンプルファイルでは、サブサーキットとして、 以下の7つの機能ブロックを作成してあります。
サブサーキット一覧

サブサーキットの中身は、残念ながらアナログ部品ではなく、 behavioral モデルを使用しています。 上記のようにサブサーキットのリストを表示するためには、 解凍したサンプルファイルのフォルダ内にある、 top?.asc(?は数字)を開いて、部品選択画面メニューを開き、 画面一番上の Top Directory をプルダウンメニューより、 上記のようにサンプルファイルのあるディレクトリに切り替えてください。 なお、
サブサーキットのすべての入力インピーダンスは 100Meg Ωです。 また、 回路図上で使用していない入力ピンの処理について、 なにもしなくて(オープンのままで)問題ないようですが、基本的に 0(= GND)に 接続しておきます。

例1:y' = y

サンプルファイルは、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) を生成し、比較します。
回路図

結果は完全に一致します。(グラフが完全に重なってしまっているため 見にくいですが。)
シミュレーション結果

例2:y'' = -ω^2 * y

サンプルファイルは 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 を十分小さく設定しないと正弦波の 周期に誤差がでるようです。
トランジェント解析設定

例3:物体の投げ上げ運動

サンプルファイルは、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軸設定

これにより、グラフは以下のようになります。 表示範囲が若干広すぎますが、 これも同様に、X 軸および Y 軸設定ウィンドウにて マニュアルで変更できます。
シミュレーション結果

設定範囲を調整した例です。
シミュレーション結果

なぜ、全ての線が原点からスタートしないのかは不明ですが、 どうもシミュレータが V(PX) について初期値での計算を パラメータを振ったときの最初の一回しか計算していないのではないか? という気がしますが定かではありません...
戻る