SOR法(逐次過緩和法)シミュレーター 戻る
数値解析

SOR法(逐次過緩和法)シミュレーター

1次元ラプラス方程式を反復解法で解くツールです。緩和係数ωを変えると、Gauss-Seidel法の更新を「行き過ぎ気味」に増幅することで収束がどれだけ速くなるか、また最適ωと残差の減衰がリアルタイムで分かります。

パラメータ設定
1次元格子点数 n
内部の未知数の個数(境界を除く)
緩和係数 ω
ω=1でGauss-Seidel法。2以上で発散
左端境界値 φL
右端境界値 φR
最大反復回数
この回数で収束しなければ打ち切り
計算結果
収束までの反復回数
緩和係数 ω
最適 ω(理論)
Gauss-Seidel比の高速化
最終残差
収束/発散
緩和スイープのアニメーション

平らな初期状態から、SORスイープを繰り返すたびにφの分布が直線解へと緩和していきます。過緩和(ω>1)では分布が一瞬だけ行き過ぎてから落ち着きます。

残差の収束履歴(対数軸)
反復回数 vs 緩和係数 ω
理論・主要公式

$$\phi_i^{(k+1)}=(1-\omega)\,\phi_i^{(k)}+\omega\cdot\frac{\phi_{i-1}^{(k+1)}+\phi_{i+1}^{(k)}}{2}$$

SOR法の更新式。各スイープで最新の隣接値を使ってGauss-Seidel値 (φ_{i−1}+φ_{i+1})/2 を求め、それを係数 ω で増幅して上書きする。ω=1 のときGauss-Seidel法に一致する。

$$\omega_{opt}=\frac{2}{1+\sin\!\big(\pi/(n+1)\big)}$$

1次元ラプラス問題(内部点 n 個)における最適緩和係数の近似。n が大きいほど ω_opt は 2 に近づく。安定のため ω は 2 未満に保つ必要がある。

$$\frac{d^2\phi}{dx^2}=0 \;\Rightarrow\; \phi_i=\frac{\phi_{i-1}+\phi_{i+1}}{2}, \qquad \phi(x)=\phi_L+(\phi_R-\phi_L)\frac{x}{L}$$

解く対象の1次元ラプラス方程式と、その離散方程式・厳密解。厳密解は左右境界値を結ぶ直線になる。

SOR法(逐次過緩和法)とは

🙋
CAEの解析って、最後は巨大な連立方程式を解くって聞きました。SOR法ってその解き方の一つなんですか?
🎓
そのとおり。構造でも熱でも流体でも、偏微分方程式を格子で離散化すると、最終的には未知数が何万〜何億もある連立一次方程式 Ax=b になる。これを真正面から消去法で解くと計算量もメモリも爆発するから、「反復解法」で少しずつ正解に近づける。SOR法はその反復解法の代表選手で、しかも一番シンプルに「緩和」の考え方が学べるんだ。
🙋
「緩和」って、力を抜くみたいなイメージですか?少しずつ正解に近づくってことですよね。
🎓
イメージは近いよ。このツールが解いているのは1次元のラプラス方程式 d²φ/dx²=0 で、答えは左右の境界値を結ぶ「ただの直線」なんだ。各格子点では「自分の値=両隣の平均」が成り立てばいい。だから全点を一周しながら φ_i を両隣の平均で置き換えていく。これがGauss-Seidel法。何回も周回すると、最初は平らだった分布がじわじわ直線に「緩和」していく。左のωを1.0にして、上のアニメーションを見てごらん。
🙋
やってみました。でもω=1だと、直線になるまでけっこう周回しますね…。SORの「過緩和」っていうのは、これを速くするんですか?
🎓
そう、そこが核心。Gauss-Seidelの一手は毎回ちょっとずつしか動かない。だったら「どうせその方向に動くなら、もっと大胆に行っちゃえ」と更新を ω 倍に増幅するのがSOR=逐次過緩和法だ。式で書くと φ_i ←(1−ω)φ_i + ω×(両隣の平均)。ωを1.5や1.8にして反復回数のカードを見て。Gauss-Seidelの何分の一かで収束するはずだ。下の「反復回数 vs ω」グラフが、ちょうど鋭いU字の谷になる。
🙋
谷の底が一番速いってことですよね。でもωを2に近づけすぎると、急にカードが「発散」になりました。なんでですか?
🎓
行き過ぎにも限度があるんだ。ωを上げるほど「大胆」になるけど、ω≥2になると毎回オーバーシュートしすぎて、誤差が減るどころか反復のたびに増幅されてしまう。これが発散。理論上、SORが収束する範囲は 0<ω<2 と決まっていて、その中に「最適ω」という一番速い点がある。1次元なら ω_opt=2/(1+sin(π/(n+1)))。逆にω<1の「不足緩和」は安定だけどGauss-Seidelより遅い。だから狙うのは1と2の間、それも谷の底付近、というわけ。
🙋
なるほど。最適ωは格子点数nで変わるんですね。実務だと、いつもこの式でωを決められるんですか?
🎓
残念ながら、きれいな ω_opt の公式が使えるのは、この1次元ラプラスのような素直な問題だけ。実際のCAEでは行列が複雑で、最適ωは事前には分からないことが多い。少し試し解きしてωを当たりづけしたり、ω=1.8前後の経験値から始めたりする。だからこそ、まずはこのツールでωと反復回数の関係を「体で」つかんでおくと、実機の挙動も読みやすくなるんだ。

よくある質問

Gauss-Seidel法は各格子点の値を「最新の隣接値の平均」へ更新します。SOR法(逐次過緩和法)はこの更新を緩和係数ωで増幅し、φ_i ←(1−ω)φ_i + ω·(Gauss-Seidel値) とします。ω=1ならGauss-Seidel法そのものですが、1<ω<2のとき更新を「行き過ぎ気味」にすることで、誤差の長波長成分の減衰が速くなり、収束に必要な反復回数が大きく減ります。本ツールはω=1のGauss-Seidel反復回数も別に計算し、SORが何倍速いかを表示します。
1次元ラプラス方程式を内部点n個の一様格子で解く場合、反復回数を最小にする最適ωは ω_opt = 2/(1+sin(π/(n+1))) で近似できます。格子が細かいほど(nが大きいほど)ω_optは2に近づきます。例えばn=25ならω_opt≈1.785です。実務では多くの問題でω_optは1.7〜1.95の範囲に入ります。ωをこの値より小さくしても大きくしても反復回数は増え、ω=ω_optで鋭い最小値を持つU字カーブになります。本ツールの「反復回数 vs ω」グラフでその形が確認できます。
SOR法が収束するための必要条件は 0<ω<2 です。ω≥2では反復行列のスペクトル半径が1以上になり、誤差が反復ごとに増幅されて発散します。残差は減るどころか指数関数的に増大し、最終的にオーバーフロー(数値の無限大)に至ります。一方ω<1は「不足緩和」で、収束はしますがGauss-Seidel法より遅くなります。安定かつ高速なのは1<ω<2、特にω_opt付近です。本ツールはω≥2や反復上限内に収束しない場合を「発散」と判定します。
SOR法は構造解析・熱伝導・電磁場・流体解析(特に圧力ポアソン方程式)など、楕円型偏微分方程式を離散化した大規模疎行列の求解に古くから使われてきた基本的な反復解法です。現代の大規模CAEでは、より収束の速い共役勾配法(CG)やマルチグリッド法、代数マルチグリッド前処理付きクリロフ法が主流ですが、SOR法はそれら高度な手法の前処理(スムーザー)として今も現役です。アルゴリズムが単純で実装しやすく、反復解法の挙動(残差の減衰、緩和係数の効果)を学ぶ教材としても最適です。

実世界での応用

熱伝導・拡散問題の定常解析:定常状態の温度分布は、熱源のないところでラプラス方程式(熱源があればポアソン方程式)に従います。電子機器のヒートシンク、建材の断熱、地中の温度場などをFDM/FVMで離散化すると、本ツールと同じ「各点の値=周囲の平均」型の連立方程式になり、SOR法で求解できます。1次元では解が直線になりますが、2次元・3次元でも考え方は同じです。

流体解析の圧力ポアソン方程式:非圧縮性流れのSIMPLE法やフラクショナルステップ法では、各時間ステップで圧力のポアソン方程式を解く必要があります。これが計算時間の大半を占めるため、収束の速い反復解法が不可欠です。古典的なコードではSOR法(やその対称版SSOR)が、現代のコードではマルチグリッドや前処理付き共役勾配法が使われますが、SORはそれらのスムーザー(高周波誤差の平滑化)として今も組み込まれています。

静電場・静磁場の解析:電位が満たすラプラス/ポアソン方程式は、コンデンサ、絶縁設計、モーターの磁気回路などの電磁界解析に現れます。境界に与えた電位(ディリクレ条件)から内部の電位分布を求める問題は、まさに本ツールの構造そのもので、SOR反復で効率よく解けます。

反復解法の教育・アルゴリズム検証:SOR法はわずか数行で実装でき、緩和係数ωによる収束加速・発散がはっきり観察できるため、数値解析の入門教材として広く使われています。新しいソルバーを実装するときも、まずSORで「正しい解」と「収束の目安」を作り、より高度な手法の検証用リファレンスにすることがよくあります。

よくある誤解と注意点

まず多いのが、「ωは大きいほど速い」という誤解です。ωを上げると一手ごとの更新量は増えますが、反復回数が単調に減るわけではありません。最適ω(このツールでは ω_opt=2/(1+sin(π/(n+1))))を境に、それより大きくしても小さくしても反復回数は増えます。グラフが鋭いU字になるのはそのためです。さらにω≥2では誤差が増幅されて発散します。「とりあえずωを2近くにすれば最速」ではなく、谷の底を狙うのが正解です。

次に、「最適ωの公式はどんな問題にも使える」という思い込み。ω_opt=2/(1+sin(π/(n+1))) は、一様格子の1次元(あるいは正方領域の2次元)ラプラス問題という、非常に整った場合の理論値です。実際のCAEでは領域形状が複雑だったり、材料物性が場所で変わったり、対流項が入ったりして、行列のスペクトル半径が解析的に求まりません。その場合は最適ωも事前には分からず、試し解きで当たりをつけるか、ω=1.7〜1.9程度の経験値から始めることになります。公式の値はあくまで「素直な問題での目安」と捉えてください。

最後に、「SORは万能の高速ソルバー」ではないという点。SOR法は実装が簡単で1次元のような小問題ではよく効きますが、格子点数nが増えると収束に必要な反復回数も増え、大規模問題では効率が頭打ちになります。最適ωを使ってもなお、マルチグリッド法や前処理付き共役勾配法には収束速度で及びません。現代の大規模CAEでSORが単独の主力ソルバーになることはまれで、むしろマルチグリッドのスムーザーとして「高周波の誤差を素早くならす」役割で活躍します。SORは反復解法の出発点であって終着点ではない、と理解しておくとよいでしょう。

使い方ガイド

  1. 格子点数(nGridNum)を10~100の範囲で設定し、1次元ラプラス方程式の離散化領域を定義します
  2. 格子範囲(nGridRange)で物理領域の長さをメートル単位で指定(例:0.1m~1.0m)
  3. 緩和係数ω(omegaNum)を0.5~1.9の範囲で段階的に変化させ、各ωに対する反復回数と残差を観測します
  4. 境界条件として左端(phiLNum)と右端(phiRNum)の電位またはポテンシャル値をボルトまたはパスカル単位で入力
  5. 「実行」ボタンで反復計算を開始し、収束までの反復回数、最終残差、理論最適ωとの比較を確認します

具体的な計算例

格子点数50、領域長1.0m、左端ポテンシャル100V、右端0Vの条件でω=1.0(Gauss-Seidel法)で計算すると反復回数約250回で残差1.0×10⁻⁶に収束します。同じ条件でω=1.85(接近最適値)を適用すると約45回で収束し、高速化比は5.5倍となります。格子点数100では最適ωは1.95に近づき、Gauss-Seidel法(ω=1.0)との相対的高速化比は10倍を超えます。

実務での注意点

  1. 最適緩和係数ωは格子点数Nに依存し、ω_optimal ≈ 2/(1+π/N)で近似されるため、離散化を細かくするほどωを1.9~1.99に近づける必要があります
  2. ω≥2.0では発散するため、金属製熱交換器(格子密度高)の温度分布計算では1.95以下に設定してください
  3. 左右の境界値が極端に異なる場合(例:100Vと0V)、残差減衰が局所的に遅延することがあるため、残差分布グラフで対称性を確認してください
  4. 大規模ゲーム機械系シミュレーション(N=1000以上)ではSOR法単独より前処理付き共役勾配法への移行を検討してください