特殊関数デモ — ガンマ・ベッセル・ゼータを計算する
sangi の特殊関数モジュールは、ガンマ関数・ベッセル関数・ゼータ関数といった 数理物理や統計に頻出する関数を統一的に扱える。 このページでは 3 つのデモで代表的なユースケースを紹介する。
Demo 1: ガンマ関数と組合せ論
ガンマ関数 $\Gamma(x)$ は階乗を実数・複素数へ拡張したもので、$\Gamma(n)=(n-1)!$、$\Gamma(1/2)=\sqrt{\pi}$ という有名な値を持つ。二項係数も計算できる。
=== Demo 1: Gamma function ===
gamma(0.5) = 1.772453851 (= sqrt(pi))
gamma(5.0) = 24 (= 4! = 24)
binomialCoefficient(10, 3) = 120
$\Gamma(1/2)=\sqrt{\pi}\approx1.7724539$、$\Gamma(5)=4!=24$。連続な階乗としてのガンマ関数が確かめられる。
Demo 2: 誤差関数とベッセル関数
誤差関数 $\operatorname{erf}(x)$ は正規分布の積分で、統計や拡散方程式に現れる。ベッセル関数 $J_\nu(x)$ は円柱座標の波動方程式の解で、$J_0(0)=1$, $J_1(0)=0$ という値を持つ。
=== Demo 2: Error and Bessel functions ===
erf(1.0) = 0.8427007929
besselJ(0, 0.0) = 1 (= 1)
besselJ(1, 0.0) = 0 (= 0)
$\operatorname{erf}(1)\approx0.8427$ は標準正規分布で $\pm1/\sqrt{2}\sigma$ 内に入る確率に対応する。$J_0(0)=1$ は太鼓の中心の基本振動に対応。
Demo 3: ゼータ関数と楕円積分
リーマンゼータ関数 $\zeta(s)=\sum_{n\ge1} n^{-s}$ は偶数で閉じた値を持ち、$\zeta(2)=\pi^2/6$(バーゼル問題)、$\zeta(4)=\pi^4/90$ が有名。完全楕円積分 $K(k)$ は単振り子の周期などに現れ、$K(0)=\pi/2$。
=== Demo 3: Zeta function and elliptic integral ===
zeta(2.0) = 1.644934067 (= pi^2/6)
zeta(4.0) = 1.082323234 (= pi^4/90)
ellipticK(0.0) = 1.570796327 (= pi/2)
$\zeta(2)=\pi^2/6\approx1.6449$ はバーゼル問題の答え。$K(0)=\pi/2$ は振幅が小さい極限での単振り子の($1/4$ 周期に比例する)値。
ソースコードと実行方法
example_specialfunctions.cpp (完全なソースコード)
// example_specialfunctions.cpp — Special functions demo
#include <math/special/special.hpp>
#include <iostream>
#include <iomanip>
using namespace sangi;
using namespace sangi::special;
int main() {
std::cout << std::setprecision(10);
// --- Demo 1: Gamma function and combinatorics ---
std::cout << "=== Demo 1: Gamma function ===\n";
std::cout << " gamma(0.5) = " << gamma(0.5) << " (= sqrt(pi))\n";
std::cout << " gamma(5.0) = " << gamma(5.0) << " (= 4! = 24)\n";
std::cout << " binomialCoefficient(10, 3) = " << binomialCoefficient(10, 3) << "\n";
// --- Demo 2: Error function and Bessel function ---
std::cout << "\n=== Demo 2: Error and Bessel functions ===\n";
std::cout << " erf(1.0) = " << erf(1.0) << "\n";
std::cout << " besselJ(0, 0.0) = " << besselJ(0, 0.0) << " (= 1)\n";
std::cout << " besselJ(1, 0.0) = " << besselJ(1, 0.0) << " (= 0)\n";
// --- Demo 3: Zeta function and elliptic integral ---
std::cout << "\n=== Demo 3: Zeta function and elliptic integral ===\n";
std::cout << " zeta(2.0) = " << riemannZeta(2.0) << " (= pi^2/6)\n";
std::cout << " zeta(4.0) = " << riemannZeta(4.0) << " (= pi^4/90)\n";
std::cout << " ellipticK(0.0) = " << ellipticK(0.0) << " (= pi/2)\n";
return 0;
}
API の詳細は Special Functions API リファレンス を参照のこと。
ビルドと実行
cd sangi
mkdir build && cd build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release --target example-specialfunctions
examples\Release\example-specialfunctions.exe