JP / EN

SPICEで非線形方程式を解く

ローゼンブロック関数を、回路シミュレータで解析してみる

電子回路の電圧や電流を求めるSPICE。その内部では、回路から組み立てた非線形方程式が解かれています。それなら、数学の問題を回路の方程式として表せば、SPICEを数値計算にも使えるのではないでしょうか。

この記事では、最適化のテスト問題として知られるローゼンブロック関数を題材に、数式を回路として記述し、MacSpiceで解を求めた実行例を紹介します。得られた値は $x_1=1,\ x_2=1$。まずは、何を解いたのかを整理しましょう。

1. ローゼンブロック関数と、ゼロにする2本の式

2変数のローゼンブロック関数は、次のように定義されます。

\[ F(x_1,x_2)=100(x_2-x_1^2)^2+(1-x_1)^2 \]

二乗の和なので $F\geq0$ です。両方の項がゼロになる $(1,1)$ で、最小値 $F=0$ を取ります。関数の定義と最小点は、Simon Fraser Universityのテスト関数資料でも確認できます。

ローゼンブロック関数の曲面と等高線。最小点は細く曲がった谷の中の(1,1)にある。
図1:ローゼンブロック関数の形状。曲面は $\log_{10}(F+1)$、等高線は対数間隔で表示し、谷の形を見やすくしています。

この細く曲がった谷は、最適化手法の進み方によって収束を難しくします。ただし、本記事でSPICEに解かせるのは、関数を直接最小化する問題ではなく、次の残差をゼロにする連立方程式です。

\[ r_1=10(x_2-x_1^2)=0,\qquad r_2=1-x_1=0 \]

$F=r_1^2+r_2^2$ なので、この例では両方の残差をゼロにすれば最小点も求まります。これらの残差は、勾配 $\nabla F$ の成分そのものではありません。また、一般の最小二乗問題では、すべての残差を同時にゼロにできるとは限りません。

2. 数式を回路の方程式として扱う

SPICEは、回路の各接点で電流の出入りが釣り合う条件などを連立させ、電圧と電流を求めます。非線形素子を含む回路では、その連立方程式も非線形になります。

この仕組みを使い、未知数 $x_1,x_2$ を接点電圧に対応させます。残差に相当する電流を非線形従属電源で表し、その電流がゼロになる条件を作れば、回路の解が元の方程式の解に対応します。MacSpiceのB電源は、電圧・電流を式で指定できます。構文はMacSpice公式マニュアルを参照してください。

  1. 未知数を、回路の接点電圧に対応させる。
  2. 残差がゼロになる条件を、回路の方程式として記述する。
  3. SPICEで解析し、得られた電圧を未知数の値として読む。
  4. 元の式に代入して、残差が十分小さいか確かめる。

ここで作るのは、数式を解くための計算用モデルです。実際に部品を組み立てる必要はありません。一方、回路として記述すれば何でも収束するわけではなく、式のスケールや初期値、ヤコビ行列の性質などが計算に影響します。

3. MacSpiceの実行結果を検算する

次の画像は、当研究室で保存した実行結果です。MacSpiceで rosenbrock.cir を読み込み、run、print all を実行すると、2つの変数がどちらも 1.0000e+00 と表示されています。

MacSpiceの実行画面。print allの結果はx1=1.0000e+00、x2=1.0000e+00。
図2:既存のMacSpice実行記録。表示された解は $(1,1)$ です。

表示値を元の式へ代入すると、答えの意味を確認できます。

\[ r_1=10(1-1^2)=0,\quad r_2=1-1=0,\quad F(1,1)=0 \]

この例は $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法の動きを学べます。

非線形方程式の可視化ツールを開く