Pade 近似の係数を求めるプログラムを C で書いてみた
Pade 近似とは
関数 を有理関数 *1で近似する方法。
次までのマクロリーン展開の係数が両者で一致することが条件。
詳しくは参考 URL まで。
アルゴリズム
の 次のマクロリーン展開係数を と書く。
また、 と の多項式の係数をそれぞれ 、 とする。*2
Pade 近似の条件は
となります。
なお、有理式の形なので とおいてよく、それにより も導かれます。
条件は 元連立方程式 を解くことと同値です。
ここで、、、および
です。あとは拡大係数行列を定義して掃き出し法使ってもいいし、 の逆行列求めてしまってもいい。*3
実装
C で書きました。行列計算の部分は部分 Pivot 法を用いた掃き出し法を使いました。
実用上、係数読み込みの部分が若干長くなってます。Pade 近似の部分は後半。
コンパイルするときは、
$ gcc pade.c -o pade
とすれば OK。
微係数 or 展開係数をファイルから読み込むときはそれをコマンドライン引数に加える。
ファイル形式は、係数が , で区切られて一行で書かれているもの。
空行と行先頭が # なものは無視するようにしています。
外部ファイルに出力したければ標準出力で。
例
# input.dat # f(x) = e^x # Differential Coefficients 1.0, 1.0, 1.0, 1.0, 1.0
というファイルを作って、
$ ./pade input.dat > output.dat
とすればいい。
[補足] Global Pade 近似
参考 URL に Global Pade 近似なるものを発見。 が小さいところは普通の Pade 近似で合わせて、大きいところは漸近形に従うように定義するもの。
格子比熱に関するデバイの式や電気抵抗率に関するグリューナイゼンの式と言った積分形式で書かれたものを Pade 近似して Fitting を行うときにも用いられている。詳しくは以下の論文を見て下さい。
Structural, Thermal, Magnetic and Electronic Transport Properties of the LaNi2(Ge1-xPx)2 System
R. J. Goetsch et al. : Phys. Rev. B 85, 054517 (2012)., arXiv:1112.1864
なお、ねがてぃぶろぐ Scilabで関数フィッティング: 金属の電気抵抗 によると積分の形式のまま再帰的に Fitting 出来るらしい。Scilab を使っているらしいがどういった計算が中でされているかは分かりません。*4
参考になるもの
http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/numeanal2/node19.html
Pade 近似の詳しい説明があります。ただ、「Pade の有理関数近似アルゴリズム」には以下の間違いがあります。
- (4) の変数 は
- (6) の代入式は
まあ正直、一旦全部の要素を 0 にしてしまって、上のような行列を作るという指針(私の pade.c はこういう指針。)のほうがいいと思います。for ループは確かに増えますが正直大きいループではないし。
あと、このサイトの行列 は拡大係数行列です。
近似について
http://www.ep.sci.hokudai.ac.jp/~yamasita/phys-math-approx.pdf (PDF 直リン)
最後の方で Global Pade 近似について書かれている。
追記 (2014-10-12)
Scipy に Pade 近似の関数 scipy.misc.pade — SciPy v0.14.0 Reference Guide がありました。
さすがというべきか…。
一応こいつは [m, m]-type の Pade 近似らしいんで、分母と分子の次数を変えたいって時はこいつは使えません。