電子回路の電圧や電流を求めるSPICE。その内部では、回路から組み立てた非線形方程式が解かれています。それなら、数学の問題を回路の方程式として表せば、SPICEを数値計算にも使えるのではないでしょうか。
この記事では、最適化のテスト問題として知られるローゼンブロック関数を題材に、数式を回路として記述し、MacSpiceで解を求めた実行例を紹介します。得られた値は $x_1=1,\ x_2=1$。まずは、何を解いたのかを整理しましょう。
1. ローゼンブロック関数と、ゼロにする2本の式
2変数のローゼンブロック関数は、次のように定義されます。
二乗の和なので $F\geq0$ です。両方の項がゼロになる $(1,1)$ で、最小値 $F=0$ を取ります。関数の定義と最小点は、Simon Fraser Universityのテスト関数資料でも確認できます。
この細く曲がった谷は、最適化手法の進み方によって収束を難しくします。ただし、本記事でSPICEに解かせるのは、関数を直接最小化する問題ではなく、次の残差をゼロにする連立方程式です。
$F=r_1^2+r_2^2$ なので、この例では両方の残差をゼロにすれば最小点も求まります。これらの残差は、勾配 $\nabla F$ の成分そのものではありません。また、一般の最小二乗問題では、すべての残差を同時にゼロにできるとは限りません。
2. 数式を回路の方程式として扱う
SPICEは、回路の各接点で電流の出入りが釣り合う条件などを連立させ、電圧と電流を求めます。非線形素子を含む回路では、その連立方程式も非線形になります。
この仕組みを使い、未知数 $x_1,x_2$ を接点電圧に対応させます。残差に相当する電流を非線形従属電源で表し、その電流がゼロになる条件を作れば、回路の解が元の方程式の解に対応します。MacSpiceのB電源は、電圧・電流を式で指定できます。構文はMacSpice公式マニュアルを参照してください。
- 未知数を、回路の接点電圧に対応させる。
- 残差がゼロになる条件を、回路の方程式として記述する。
- SPICEで解析し、得られた電圧を未知数の値として読む。
- 元の式に代入して、残差が十分小さいか確かめる。
ここで作るのは、数式を解くための計算用モデルです。実際に部品を組み立てる必要はありません。一方、回路として記述すれば何でも収束するわけではなく、式のスケールや初期値、ヤコビ行列の性質などが計算に影響します。
3. MacSpiceの実行結果を検算する
次の画像は、当研究室で保存した実行結果です。MacSpiceで rosenbrock.cir を読み込み、run、print all を実行すると、2つの変数がどちらも 1.0000e+00 と表示されています。
表示値を元の式へ代入すると、答えの意味を確認できます。
この例は $r_2=0$ から $x_1=1$、続いて $r_1=0$ から $x_2=1$ と手計算でも解けます。そのため、複雑な問題へ進む前に、数式と回路の対応を確かめる例として使えます。表示桁数だけでは内部の計算誤差は分からないため、別の問題でも元の残差を確認することが大切です。
この記録から分かる範囲
画像は解の出力を示していますが、反復回数・残差履歴・詳細な計算時間は示していません。この記録だけで、他の最適化手法より速いとは判断できません。また、当時のネットリスト全文はこのページには掲載していません。
実行環境:Mac SPICE3/MacBook(1.2 GHz デュアルコア Intel Core m5、メモリ8 GB)/macOS Monterey 12.7.6。
4. 自分で試す・次に読む
まずはブラウザ上で、非線形方程式を反復して解く様子を確認してみてください。以下の可視化ツールはSPICEとは別の実装ですが、Newton法やHomotopy法の動きを学べます。
- ニュートン法の解説:反復計算の仕組みを知る。
- なぜSPICEは収束しないのか?:解けないときの背景を考える。
- ヒンメルブラウの連立方程式:複数の解を探す解析例へ進む。