2015年5月31日日曜日

積分方法の比較

FORTRANの環境作ったし、実際に計算させてみた
やっぱJavaより早い気がするw
今回は積分のプログラミング方法3パターンの比較を行って、収束具合、正確性を見ていく

 積分の計算種類
\[ \begin{eqnarray} \int_a^b f(x) dx \end{eqnarray} =\lim_{n \to \infty} \sum^n_{i=0}f(x)\Delta x \] 基本的に積分は上記式のように区分求積法で計算していくわけだけど、「$n \to \infty$」はプログラムでは実現できない。なので、様々な計算法で近似して数値解を求める必要がある。
  1. 長方形近似
  2. 一番基本形。積分する領域を長方形に切り刻んで全部足す方法
    ・数式 \[ \begin{eqnarray} \int_a^b f(x) dx \end{eqnarray} =\sum^n_{i=a}f(i)\Delta x \]
    刻み幅$\Delta x$はループ数$N$を使い、$\Delta x = (b - a) / N$となる

    $x$座標の始点、終点、ループ回数を引数にした関数だとこんな感じ
  3. 台形近似
  4. 長方形近似の上位互換。積分する領域を台形に刻むことで、勾配を配慮した形
    ・数式 \[ \begin{eqnarray} \int_a^b f(x) dx \end{eqnarray} =\sum^n_{i=a}\frac{f(i)+f(i+\Delta x)}{2}\Delta x \]
    刻み幅$\Delta x$はループ数$N$を使い、$\Delta x = (b - a) / N$となる

    $x$座標の始点、終点、ループ回数を引数にした関数だとこんな感じ
  5. シンプソンの公式
  6. f(x) を二次関数 P(x) で近似する数値解析方法
    ・数式 \[ \begin{eqnarray} \int_a^b f(x) dx \end{eqnarray} =\frac{h}{3}\Bigl\{f(a)+4\sum^m_{i=1}f(x_{2i-1})+2\sum^{m-1}_{i=1}f(x_{2i})+f(b)\Bigr\} \]
    $h=(b-a)/(2m)$ $x_i=a+ih$ $(i=1,2,3...2m-1)$

    $x$座標の始点、終点、ループ回数を引数にした関数だとこんな感じ
 積分の比較
次に3つの積分方法の正確性、収束性、計算スピードについてみていく
  1. 正確性
  2. 下記式の左辺の数値解をそれぞれを求め、$\pi$にどれだけ近づくか見てみる \[ \begin{eqnarray} \int_0^1 \frac{4}{1+x^2} dx \end{eqnarray} =\pi \]
    計算方法解析解正確性[%]
    長方形近似 3.17157602 100.9544002 
    台形近似 3.16147637 100.6329184 
    シンプソンの公式 3.15489316 100.4233683 
    刻み回数100回の場合の積分結果
    どの結果も同じオーダーなので、違いが分かりにくい。。。

  3. 収束性
  4. 解の収束度合はどうだろうか。
    x軸に刻み回数、y軸に数値解とし、刻み回数と解の収束をグラフ化した
    sekibun1→長方形近似、sekibun2→台形近似、sekibun3→シンプソンの公式、pi→$\pi$
    収束度合の数値化がちょっとできてないけど、シンプソンの公式がかなり早い段階で収束することがわかる。

  5. 計算スピード
  6. 最後に計算速度の差について
    この程度なら差を感じないけど、計算に一週間かかる場合とかだと重要になってくる。それぞれのアルゴリズムの計算回数からだいたいの計算時間のオーダーを求める
    $f(x)$の計算ステップが$F$、分割数$N$とすると
    計算方法オーダー
    長方形近似$N(4+F)$
    台形近似$N(6+2F)$
    シンプソンの公式$N(6+F)$


    つまり、長方形近似>シンプソンの公式>台形近似の順で早いことになる。
    特に$f(x)$の計算ステップが異常にかかる系だと、台形近似が大変

 結論
シンプソンの公式が収束率、計算速度が優れていてよさげ
でも、実装が一番楽な長方形近似で分割数を膨大に増やして計算するのが、実装ミス、手間が省けて効率いいかも思った
以上

0 件のコメント:

コメントを投稿