JP / EN

Chandrasekhar's H-equation

チャンドラセカールのH方程式

\[ H(\mu) = 1 + c \mu H(\mu) \int_0^1 \frac{H(\mu')}{\mu + \mu'} d\mu' \]

Unknown function: $H(\mu)$
Parameter: $c$ (Albedo, $0 \le c \le 1$)

概要

回路シミュレータ「SPICE」が持つ、強力な「非線形方程式ソルバー」としての能力を試すため、天体物理学(輻射輸送論)などで現れる有名な積分方程式「チャンドラセカールのH方程式」を解いてみました。

注:$\mu'$(ミューダッシュ)は微分ではありません
式中に $\mu$ と $\mu'$ が出てきますが、このダッシュ($'$)は微分を表すものではありません。
  • $\mu$:いま値を求めようとしている「特定の方向」。定数として扱います。
  • $\mu'$:積分計算のために $0$ から $1$ まで変化させる「別の方向」。
プログラミングで言えば、$\mu$ が関数の引数、$\mu'$ が forループのカウンタ変数のようなものです。

SPICEで解くための「離散化」プロセス

この方程式をコンピュータ(SPICE)で解くためには、式の中に含まれる「積分」を「有限個の足し算」に変換し、連立方程式の形に書き下す必要があります。
ここでは、その導出過程をステップ・バイ・ステップで解説します。

ステップ1:ターゲットとなる積分部分

元のチャンドラセカールのH方程式の右辺にある積分項(インテグラル)に注目します。ここを $I(\mu)$ と置きます。この $I(\mu)$ を、和の形 $\sum$ に直すことが目標です。

\[ I(\mu) = \int_0^1 \frac{H(\mu')}{\mu + \mu'} d\mu' \]
ステップ2:ガウス・ルジャンドル求積法の導入

数値積分の強力な手法である「ガウス・ルジャンドル求積法」を使います。この公式は、積分区間が $[-1, 1]$ のときに使える魔法の公式です。

\[ \int_{-1}^{1} g(t) dt \approx \sum_{j=1}^N w'_j g(t_j) \]

($t_j$: ルジャンドル多項式のゼロ点、$w'_j$: 対応する重み)

しかし、今回の積分 $I(\mu)$ の区間は $[0, 1]$ です。このままでは公式が使えないため、変数変換を行います。

ステップ3:変数変換(区間の調整)

積分区間 $[0, 1]$ を、公式が使える $[-1, 1]$ に対応させるため、変数 $\mu'$ を新しい変数 $t$ に置き換えます。

\[ \mu' = \frac{1}{2}t + \frac{1}{2} \]

この式を微分すると $d\mu' = \frac{1}{2} dt$ となります。これを元の積分 $I(\mu)$ に代入します。

\[ \begin{aligned} I(\mu) &= \int_{\mu'=0}^{1} \frac{H(\mu')}{\mu + \mu'} d\mu' \\ &= \int_{t=-1}^{1} \frac{H\left(\frac{t+1}{2}\right)}{\mu + \left(\frac{t+1}{2}\right)} \cdot \underbrace{\frac{1}{2} dt}_{d\mu'} \end{aligned} \]

積分区間が $[-1, 1]$ になり、末尾に変換係数の $\frac{1}{2}$ が現れました。

ステップ4:和の公式への当てはめ

区間が $[-1, 1]$ になったので、ガウス求積法の公式を適用して、積分 $\int$ を和 $\sum$ に書き換えます。
ここで、式を簡単にするために、変換後の座標 $t_j$ に対応する元の座標を $\mu_j$ と定義しておきます。

\[ \begin{aligned} I(\mu) &\approx \sum_{j=1}^N w'_j \cdot \left( \frac{H(\mu_j)}{\mu + \mu_j} \cdot \frac{1}{2} \right) \\ &= \frac{1}{2} \sum_{j=1}^N \frac{w'_j H(\mu_j)}{\mu + \mu_j} \end{aligned} \]

係数 $\frac{1}{2}$ をシグマの外に出しました。

ステップ5:最終的な連立方程式の導出

最後に、求めた $I(\mu)$ を元のH方程式に戻し、連続変数 $H(\mu)$ を離散変数 $x_i$ に置き換えると、SPICEに実装すべき最終式が得られます。

\[ x_i = 1 + \frac{c}{2} x_i \sum_{j=1}^N \frac{w'_j \mu_i x_j}{\mu_i + \mu_j} \quad (i=1, \dots, N) \]

これで、複雑な積分方程式が、四則演算だけで計算できる連立方程式に変換されました。

計算点の算出 (Python)

「ルジャンドル多項式のゼロ点」を手計算するのは困難ですが、Pythonを使えば一瞬で算出できます。以下のコードで、今回のシミュレーションに使用した $\mu_i$ と重み $w_i$ を生成しました。

import numpy as np

# 1. ルジャンドル多項式のゼロ点 t と重み w_prime を取得(定義域 -1 to 1)
N = 100
t, w_prime = np.polynomial.legendre.legauss(N)

# 2. 今回の積分区間 [0, 1] に変換
# mu  : SPICEのノード電圧に対応する変数
# w   : 抵抗値計算などに使う重み(0.5倍する)
mu = 0.5 * t + 0.5 
w  = 0.5 * w_prime

print(f"x1   (min) = {mu[0]:.6f}")
print(f"x100 (max) = {mu[-1]:.6f}")

解析結果

100変数の非線形方程式を解くため、SPICEの .DC解析(直流掃引解析) を活用しました。パラメータ $c$ を $0$ から $1.0$ まで連続的に変化させながら解を追跡します。

Graph: H(mu) vs c
Graph: H(mu) vs c

シミュレーションの結果、$c=1.0$ における両端($x_1$ と $x_{100}$)の値は以下の通りとなりました。

変数 ($\mu$の位置) SPICE 実測値 理論値 (目安) 判定
$x_1$ ($\mu \approx 0$) 1.01845 1.018 Good
$x_{100}$ ($\mu \approx 1$) 2.89526 2.899 Good

アナログ回路シミュレータであるSPICEを用いて、100変数の複雑な積分方程式を約 0.1% の精度で解くことに成功しました。

解析環境

  • SPICE: Mac SPICE3
  • PC: MacBook
  • OS: macOS Monterey 12.7.6
  • CPU: 1.2GHz デュアルコア Intel Core m5
  • メモリ: 8GB

この規模の計算では現在のPC環境であればすぐに計算が完了するため、詳細な計算時間の計測は割愛いたします。