トーマス法(三重対角行列アルゴリズム)シミュレーター 戻る
数値解析

トーマス法(三重対角行列アルゴリズム)シミュレーター

三重対角線形システムを O(n) で解くトーマス法(TDMA)を体験するツールです。1次元ポアソン境界値問題 −u''=f を離散化して解き、前進消去から後退代入までの流れと、解析解との誤差をリアルタイムで確認できます。

パラメータ設定
内部格子点数 n
三重対角システムの未知数の個数(解像度)
左端境界値 u(0)
ディリクレ境界条件(x=0 での解の値)
右端境界値 u(1)
ディリクレ境界条件(x=1 での解の値)
ソース項の大きさ f
方程式 −u''=f の右辺の強さ
ソース分布
右辺 f(x) の空間的なかたち
計算結果
格子点数 n
演算回数(≈8n)
中央の u 値
最大 u 値
最大誤差(解析解比・一様分布時)
計算量クラス
アルゴリズム可視化 — 前進消去・後退代入

解 u(x) の曲線を描きながら、ハイライトが左→右(前進消去)、右→左(後退代入)と掃引します。右上の小行列は三重対角の3本の対角だけが点灯しています。

数値解 vs 解析解
演算回数の比較 — トーマス法 O(n) vs ガウス消去 O(n³)
理論・主要公式

$$a_i\,u_{i-1} + b_i\,u_i + c_i\,u_{i+1} = d_i$$

三重対角システムの第 i 行。a:下対角、b:主対角、c:上対角、d:右辺。中心差分の離散化では a=c=−1、b=2 となる。

$$c'_i=\frac{c_i}{b_i-a_i c'_{i-1}},\qquad d'_i=\frac{d_i-a_i d'_{i-1}}{b_i-a_i c'_{i-1}}$$

前進消去(forward sweep)。i=1 では c'_1=c_1/b_1、d'_1=d_1/b_1 から始め、i=2..n と進む。

$$u_n=d'_n,\qquad u_i=d'_i-c'_i\,u_{i+1}$$

後退代入(back substitution)。i=n−1..1 と逆順に解を求める。総演算量は O(n)、一般行列のガウス消去 O(n³) に対し圧倒的に高速。

トーマス法とは

🙋
「トーマス法」って初めて聞きました。連立方程式を解く方法、というのは分かるんですが、ふつうのガウス消去と何が違うんですか?
🎓
ざっくり言うと「ガウス消去の特急版」だね。トーマス法が対象にするのは三重対角行列、つまり主対角と、そのすぐ上・すぐ下の3本の対角だけに数字が入っていて、あとは全部ゼロ、という特殊な行列だ。一般のガウス消去はどんな行列でも解けるけど、計算量は n³ に比例して爆発する。ところが三重対角だと、ゼロの部分を一切触らずに済むから、たった O(n)、おおよそ 8n 回の計算で解けてしまうんだ。
🙋
3本の対角だけ…そんな都合のいい行列、実際に出てくるんですか?
🎓
これがびっくりするほど出てくるんだよ。このツールが解いている問題がまさにそう。1次元の微分方程式 −u''=f を、中心差分という標準的なやり方で離散化すると、各点の方程式に出てくる未知数は「自分」と「左隣」と「右隣」の3つだけになる。これを行列で書くと、自動的に三重対角になるんだ。左のパネルで格子点数 n を変えると、その n×n の三重対角システムを毎回トーマス法で解いている。
🙋
なるほど!具体的には、どうやって解くんですか?右上のアニメーションで左から右に矢印が動いていますけど。
🎓
2段階だよ。まず「前進消去」——左の式から順に、下対角の項を消していく。各行で c'_i = c_i/(b_i − a_i·c'_{i-1}) を計算しながら右へ進む。これがアニメの左→右の掃引だ。最後の行まで来ると、その行は未知数が1個だけになって u_n が即座に決まる。そこから今度は「後退代入」で右→左へ。u_i = d'_i − c'_i·u_{i+1} を使って、一つ右で求めた値を使い、一つずつ左へ解いていく。これがアニメの右→左の掃引だね。
🙋
解けた答えはどれくらい正確なんですか?「最大誤差」が 1e-13 とか、ものすごく小さい数字になってますけど。
🎓
いい質問。デフォルトの一様ソースの場合、この問題には厳密な解析解 u(x) = 50·x·(1−x) があるんだ。トーマス法は近似ではなく、その離散システムを「厳密に」解くアルゴリズムだから、丸め誤差を除けば誤差はほぼゼロ——浮動小数点の限界である 1e-13 程度しか出ない。中央の u は理論どおり 12.5 になっているはずだ。一方でソースを「中央集中」や「線形」に変えると、解析解の式が変わるから、誤差欄は「—」になる。トーマス法そのものが正確なことを確かめるのが一様分布のケース、というわけだ。
🙋
そんなに速くて正確なら、もう全部トーマス法でいいんじゃ…と思ってしまいます。
🎓
気持ちは分かるけど、使えるのは「行列が三重対角のとき」だけだよ。さらにトーマス法はピボット選択をしないから、行列が対角優位(対角要素が上下対角の和以上)でないと、途中で分母がゼロに近づいて誤差が暴れることがある。幸い、このツールの行列は対角2・上下−1で対角優位だから安心して使える。実務では「三重対角+対角優位」が揃ったら迷わずトーマス法、というのが定石なんだ。

よくある質問

トーマス法は三重対角行列、つまり主対角と上下の対角だけに非ゼロ要素をもつ線形システム A·u = d を解く専用アルゴリズムです。一般のガウス消去をこの帯状構造に特化させたもので、前進消去と後退代入の2段階で構成されます。一般行列のガウス消去が約 (2/3)n³ 回の演算を要するのに対し、トーマス法はわずか約 8n 回、つまり O(n) で解けます。三重対角システムは1次元境界値問題、3次スプライン補間、PDEの陰的時間積分など工学のあらゆる場面に現れるため、極めて重要な基本アルゴリズムです。
一般のガウス消去では各行の消去でその行より下のすべての行・列を更新するため、計算量が n³ オーダーになります。三重対角行列では各行に非ゼロ要素が高々3個しかなく、ある行を消去しても影響するのは隣の1行だけです。そのため前進消去は1行あたり定数回の演算で済み、全体で n に比例します。後退代入も各行1回の引き算と乗算だけなので O(n) です。合計するとおよそ 8n 回の浮動小数点演算、メモリも3本の対角を保持するだけの O(n) で済みます。
トーマス法はピボット選択を行わないため、行列が対角優位(各行で対角要素の絶対値が上下対角の和以上)または対称正定値であれば数値的に安定です。本ツールが解く1次元ポアソン問題の行列は対角要素2、上下対角−1で対角優位なので安定に解けます。一方、対角優位でない一般の三重対角行列では前進消去の途中で分母 m = b_i − a_i·c'_{i-1} がゼロに近づき、誤差が増幅される恐れがあります。その場合は部分ピボット付きの帯行列ソルバーを使う必要があります。
最も典型的なのは1次元の境界値問題で、本ツールが解く −u''=f のように2階微分を中心差分で離散化すると必ず三重対角行列になります。ほかにも3次スプライン補間の係数決定、熱伝導や拡散方程式を陰的(クランク・ニコルソン法など)に時間積分する各ステップ、ADI法による2次元問題の分割、トリッド系の構造解析など、応用は非常に広いです。三重対角システムが現れたら、まずトーマス法で O(n) で解けないかを検討するのが定石です。

実世界での応用

偏微分方程式の陰的時間積分:熱伝導方程式や拡散方程式を時間方向に進めるとき、安定性のために陰解法(クランク・ニコルソン法など)を使うと、各タイムステップで三重対角システムを1回解く必要が出てきます。1万ステップのシミュレーションなら、トーマス法で1万回解くことになります。ここで O(n³) のガウス消去を使えば計算時間は数千倍に膨れ上がるため、トーマス法は陰解法を実用的にする上で欠かせません。

3次スプライン補間:CAD・グラフィックス・データ可視化で滑らかな曲線を引く3次スプラインは、各区間の係数を決めるために連立方程式を解きます。スプラインの「2階微分の連続」という条件から生まれる方程式系は、ちょうど三重対角になります。数百点を通る滑らかな曲線も、トーマス法なら一瞬で係数が決まります。

1次元構造・伝熱解析:梁のたわみ、フィンの温度分布、地中の熱伝導など、1次元の境界値問題はトーマス法の独壇場です。本ツールが解く −u''=f はまさにこの典型で、ポアソン方程式・ラプラス方程式の1次元版にあたります。CAEの教育や検証では、まずこの簡単な問題で離散化とソルバーの正しさを確認してから、2次元・3次元へ進みます。

大規模疎行列ソルバーの部品として:2次元・3次元の問題でも、ADI法(交互方向陰解法)のように問題を一方向ずつ分割すれば、内部で大量の三重対角システムを解くことに帰着します。また、ブロック三重対角ソルバーや前処理付き反復法の前処理部分にもトーマス法の考え方が使われます。単独のソルバーとしてだけでなく、大規模ソルバーの心臓部としても働いているのです。

よくある誤解と注意点

まず多いのが、「トーマス法はどんな三重対角行列でも安全に解ける」という誤解です。トーマス法はピボット選択(行の入れ替え)を一切行わないため、前進消去の分母 m = b_i − a_i·c'_{i-1} がゼロに近づくと、誤差が一気に増幅されます。これが起きないことが保証されるのは、行列が対角優位か対称正定値のときだけです。本ツールの1次元ポアソン行列(対角2・上下−1)は対角優位なので安心ですが、一般の三重対角行列をそのまま流し込むのは危険です。対角優位でない場合は、部分ピボット付きの帯行列ソルバー(LAPACK の dgtsv など)を使ってください。

次に、「O(n) だから誤差もゼロ」だと思い込むこと。トーマス法は離散化された線形システムを(丸め誤差を除いて)厳密に解きますが、それは「離散方程式の答え」が厳密という意味で、「もとの微分方程式の答え」とは別物です。中心差分による離散化には O(h²) の打ち切り誤差があり、格子点数 n を増やすほど真の解に近づきます。本ツールの一様分布ケースで誤差がほぼゼロになるのは、たまたまこの特定の問題で離散解と解析解が一致する特殊事情によるものです。一般には「アルゴリズムの丸め誤差」と「離散化の打ち切り誤差」を区別して考える必要があります。

最後に、「三重対角なら何でもトーマス法が最速」とは限らない点。確かに直接法としてはトーマス法が最適ですが、係数行列が複数の右辺で使い回せる場合は、一度 LU 分解(これも O(n))しておけば前進・後退代入だけを繰り返せます。また、巡回境界条件で「角」に要素が入る巡回三重対角行列は、純粋なトーマス法では解けず、Sherman-Morrison 公式などの補正が必要です。問題の構造をよく見て、トーマス法・ブロックトーマス法・巡回版を使い分けることが、実務での正しい姿勢です。

使い方ガイド

  1. 格子点数nを設定します(n=50~500推奨)。区間[0,1]を等間隔に分割し、刻み幅h=1/(n+1)となります。
  2. 境界条件を入力します。左端u(0)=ulとu(1)=urの値を指定してください。1次元ポアソン方程式-d²u/dx²=f(x)を離散化します。
  3. 右辺関数f(x)を選択または入力します。均一分布f=10[N/m]、放物線分布f=100x(1-x)などの標準値から選べます。
  4. シミュレータが三重対角行列を構成し、前進消去と後退代入を実行。中央点での変位uおよび最大誤差を計算表示します。

具体的な計算例

弾性梁の撓みを求める場合:EI=1000[Nm²]、スパン長L=1m、均等分布荷重q=100[N/m]の条件でn=100とします。境界条件ul=ur=0mm(両端固定)、離散化により三重対角方程式は(n-1)×(n-1)行列となり、トーマス法で約8n=800演算で解きます。中央x=0.5での撓みは解析解と比較して誤差2.1%程度です。演算時間はO(n)で高速です。

実務での注意点

  1. 刻み幅h過大時(n<20)は離散化誤差が5%超に。精度確保にはn≥50を推奨します。
  2. 材料非線形問題やニュートン法による修正が必要な場合、このアルゴリズムは線形方程式専用です。
  3. 数値安定性:マトリックス係数がhに反比例するため、h→0時の条件数悪化に注意してください。
  4. FEM解析に比べ構造が単純なため、1D弾性床反応解析やポアソン方程式初学向けに最適です。