1D有限体積法シミュレーター — 定常拡散 戻る
数値解析

1D有限体積法シミュレーター — 定常拡散

1次元の定常拡散方程式を有限体積法(FVM)で解くツールです。領域を制御体積セルに分け、各セルでフラックスの収支を取って三重対角行列を組み立て、Thomas法で求解します。制御体積数や発生項を変えると、セル中心のφ分布・解析解との誤差・収束の様子がリアルタイムで分かります。

パラメータ設定
制御体積数 N
領域を分割する等幅セルの個数
拡散係数 Γ
熱伝導率や拡散率に相当する係数
領域長さ L
m
左端境界値 φL
x=0 で固定する φ の値(ディリクレ)
右端境界値 φR
x=L で固定する φ の値(ディリクレ)
体積発生項 S
各セルに一様に加わる生成・消滅項。0で線形解、≠0で放物線解
計算結果
制御体積数 N
セル幅 Δx (m)
中央セルの φ
左端拡散流束
解析解との最大誤差
発生項の影響
制御体積セルと φ プロファイル

領域をN個の制御体積セルに分割し、各セル中心ノード(白丸)で求めた φ をバーで表示します。両端の青枠は固定境界値 φL・φR。色の脈動は反復計算のイメージです。

φ 分布 — 数値解と解析解
最大誤差 vs 制御体積数 N
理論・主要公式

$$\frac{d}{dx}\!\left(\Gamma\frac{d\phi}{dx}\right)+S=0$$

1次元の定常拡散方程式。Γ:拡散係数、φ:求めたいスカラー量、S:体積発生項。両端でディリクレ境界条件 φ(0)=φL、φ(L)=φR を課す。

$$a_P\phi_P=a_W\phi_W+a_E\phi_E+S\,\Delta x,\quad a_P=a_W+a_E$$

各制御体積(セルP)の離散化された収支式。a_W・a_E は西・東の面コンダクタンス(内部面 Γ/Δx、境界面 2Γ/Δx)、Δx:セル幅。FVMはこの式により、すべての制御体積で保存則を厳密に満たす。

$$\phi_{\text{exact}}(x)=\phi_L+(\phi_R-\phi_L)\frac{x}{L}+\frac{S}{2\Gamma}\,x(L-x)$$

一様発生項に対する厳密解。S=0 なら直線、S≠0 なら放物線。このツールはセル中心での厳密解と数値解の差から最大誤差を評価する。

有限体積法とは

🙋
「有限体積法」って名前は聞いたことあるんですけど、有限差分法とは何が違うんですか?どっちも微分方程式を解く方法ですよね。
🎓
いい質問だね。有限差分法は微分そのものをテイラー展開で差分に置き換える方法だ。一方、有限体積法(FVM)は発想がちょっと違う。領域を「制御体積」という小さな箱に分けて、その箱ひとつひとつで「入ってくる量と出ていく量の収支」を立てるんだ。つまり、微分方程式を解くというより、保存則を箱ごとに足し算で組み立てるイメージだよ。
🙋
箱ごとに収支を取る…それって何かいいことがあるんですか?
🎓
最大のメリットは「保存性」だね。隣り合う2つの箱は1枚の面を共有しているだろう。FVMでは、左の箱から出ていくフラックスと、右の箱に入ってくるフラックスを、必ず同じ式で評価する。だから足し合わせるとぴったり打ち消し合って、領域全体でも保存則がきれいに成り立つ。熱量や質量が「いつの間にか消えたり湧いたり」しないんだ。だからCFD(流体解析)ではFVMが標準になっている。上の「制御体積セル」の絵で、まさにその箱が並んでいるのが見えるよ。
🙋
なるほど。このツールでNを8にしても、解析解との誤差がほぼ0って出てます。これってちゃんと計算できてるんですか?
🎓
むしろ「ちゃんと計算できている証拠」だよ。発生項 S=0 のとき、定常拡散の厳密解は左の値から右の値へ向かう「直線」になる。FVMが使う中心差分のフラックス評価は、直線をぴったり再現できる性質があるんだ。だから粗いメッシュでも誤差が出ない。試しに発生項 S を 30 くらいにしてごらん。今度は厳密解が放物線になって、有限のセル幅では誤差が出てくる。下の「最大誤差 vs N」グラフを見ると、Nを増やすほど誤差が下がっていくのが分かるよ。
🙋
そうか、Sを入れると放物線になるんですね。その誤差はNを増やせばどんどん小さくなるんですか?
🎓
そう。このスキームは2次精度だから、セル幅 Δx を半分にすると誤差は約4分の1になる。グラフのカーブがどんどん0に近づいていくのがその証拠だ。ただし現実の解析では、メッシュを細かくするほど計算コストも増える。だから「どこまで細かくすれば十分か」を見極めるのが大事で、これを「メッシュ依存性の確認(グリッドスタディ)」と呼ぶ。このツールはまさにその関係を体感するための練習台なんだ。
🙋
最後にひとつ。三重対角行列とかThomas法って言葉が出てきましたが、これは何ですか?
🎓
1次元のFVMでは、各セルが「自分・左隣・右隣」の3つだけと関係する。だから連立方程式の係数行列は、対角線とそのすぐ上下だけに値が入る「三重対角行列」になるんだ。これは一般の行列より圧倒的に解きやすい。Thomas法(追い掛け法)は、その三重対角専用の解法で、計算量がセル数に比例するだけ。だから N=30 でも一瞬で解ける。FVMの実装が軽いのは、この行列構造のおかげでもあるんだよ。

よくある質問

有限差分法は微分方程式の微分項をテイラー展開で差分近似します。一方、有限体積法は領域を「制御体積(コントロールボリューム)」というセルに分け、各セルで保存則(出入りするフラックスの収支)を直接立てます。FVMの最大の長所は、各セルでフラックスが厳密に保存されることです。隣り合うセルの共有面では、出ていくフラックスと入ってくるフラックスが必ず同じ式で評価されるため、領域全体でも保存則が破れません。このため熱・質量・運動量の保存が重要な流体解析(CFD)ではFVMが標準的に使われます。
1次元の定常拡散方程式 d/dx(Γ dφ/dx) + S = 0 を、区間[0,L]上で両端ディリクレ境界条件 φ(0)=φL、φ(L)=φR のもとで解いています。領域をN個の等しい制御体積に分け、各セル中心でφを評価するセル中心法を使います。内部面のコンダクタンスは Γ/Δx、境界面はセル中心から境界までが半セル分のため 2Γ/Δx となります。これらから三重対角行列 A·φ = b を組み立て、Thomas法(追い掛け法)で解いています。
発生項 S=0 のとき、定常拡散方程式の厳密解は φ(x)=φL+(φR−φL)x/L という直線になります。FVMで使う中心差分のフラックス評価は1次関数(直線)を厳密に再現できるため、離散解とセル中心の厳密解が一致し、最大誤差はほぼ0(丸め誤差レベル)になります。一方 S≠0 では厳密解が放物線になり、有限のセル幅では離散化誤差が生じます。この誤差は制御体積数Nを増やすと2次精度で減少します。
このツールは両端で値を固定するディリクレ境界条件のみを扱います。実務では、フラックス(勾配)を固定するノイマン境界条件や、対流熱伝達のようなロビン境界条件もよく使います。FVMではこれらも自然に扱えます。ノイマン境界では境界面のフラックスを直接 b に与え、境界セルの境界側コンダクタンスを0にします。ロビン境界では伝達係数を含む実効コンダクタンスを境界面に設定します。いずれも「セルの収支式にフラックスをどう与えるか」という同じ枠組みで統一的に扱えるのがFVMの利点です。

実世界での応用

熱伝導解析:定常拡散方程式は、そのまま定常熱伝導方程式でもあります。Γを熱伝導率、φを温度、Sを内部発熱と読み替えれば、壁や配管断熱材の温度分布、電子部品の放熱、断熱性能の評価などにそのまま使えます。FVMは各セルの熱収支を厳密に取るため、出入りする熱流束の整合性が保証され、エネルギーバランスのチェックが容易です。

CFD(数値流体力学)の基礎:OpenFOAM、ANSYS Fluent、STAR-CCM+ など主要なCFDソルバーはほぼすべて有限体積法をベースにしています。実際の流れ解析では、ここで扱った拡散項に加えて対流項・圧力項が入りますが、「制御体積ごとにフラックス収支を取る」という骨格はまったく同じです。この1次元拡散問題は、複雑なCFDを理解するための最も基本的な出発点になります。

物質拡散・濃度分布:Γを拡散係数、φを濃度と読めば、半導体プロセスの不純物拡散、フィルターや膜を通る物質移動、地下水中の汚染物質拡散などのモデルになります。発生項Sは化学反応による生成・消滅を表します。定常状態での濃度プロファイルを素早く見積もりたいときに、この種の離散化が役立ちます。

数値解析教育とコード検証:FVMを初めて学ぶとき、1次元の定常拡散はほぼ必ず最初の題材になります。厳密解(直線・放物線)が手で書けるため、自作コードの正しさを「解析解との誤差」で直接確認できるからです。S=0で誤差がゼロになること、S≠0で誤差がNの増加とともに2次精度で減ることは、実装が正しいかを判定する標準的なベンチマークになっています。

よくある誤解と注意点

まず多いのが、「セル中心の値とセル境界(節点)の値を混同する」ことです。このツールはセル中心法を採用しており、求めた φ はセルの中央 x_i=(i+0.5)Δx での値です。境界 x=0 や x=L そのものの値ではありません。境界面のフラックスを評価するとき、セル中心から境界までの距離は Δx/2 になるため、境界面のコンダクタンスは内部面の2倍(2Γ/Δx)になります。この「半セル」の扱いを忘れると、境界付近の流束や温度がずれます。FVMの実装ミスで最も多いのがこの境界の半セル処理です。

次に、「誤差がゼロだから万能だと思い込む」こと。このツールで S=0 のとき誤差がほぼ0になるのは、厳密解が直線で、中心差分が直線を完全に再現できるという特殊な事情によるものです。発生項が入ったり、拡散係数が場所によって変わったり、対流項が加わったりすると、必ず離散化誤差が生じます。「ある問題で誤差ゼロだったから、別の問題でも大丈夫」とは言えません。実務では必ず、Nを変えて解が収束しているか(メッシュ依存性)を確認する必要があります。

最後に、「保存性と精度を同じものだと考える」こと。FVMは制御体積ごとにフラックスを厳密に保存しますが、これは「答えが正確」という意味ではありません。粗いメッシュでも保存則自体は破れませんが、解の形は厳密解からずれます。つまり保存性は「質量や熱が勝手に消えない」という性質であって、精度(厳密解にどれだけ近いか)とは別の話です。両方を区別して理解することが、FVMを正しく使う第一歩になります。

使い方ガイド

  1. 制御体積数(nNum)を10~100の範囲で設定し、計算領域を分割します。セル幅Δxは自動計算されます。
  2. 物性値として熱伝導率λ(W/m·K)と発生項係数S(W/m³)を入力し、Dirichlet境界条件(左端φL、右端φR)を指定します。
  3. 「計算実行」をクリックするとThomas法(三重対角行列法)で連立方程式を求解し、各セル中心の温度分布φとセル界面の拡散流束を出力します。

具体的な計算例

計算領域0~1mのアルミニウム板(λ=237 W/m·K)で、左端φL=100℃、右端φR=0℃、発生項S=1000 W/m³の場合、制御体積数N=20で計算するとセル幅Δx=0.05m、中央セル(x=0.5m)の温度はφ≈47.6℃となります。左端拡散流束は約24700 W/m²、解析解との最大誤差は0.8%以下に収束します。

実務での注意点