========================================================= 割線法 ( secant solver ) ========================================================= 割線法は, *Newton-Raphson* 法における微分評価を数値微分とした求解アルゴリズムである. 割線法のアルゴリズム ====================================== 方程式 :math:`f(x)=0` を解く割線法のアルゴリズムは *Newton-Raphson* 法とほぼ同様であり,微分評価の手法が異なる. 1. n 回目における座標 :math:`x_n, x_{n+1}` における関数値 :math:`f(x_n), f(x_{n+1})` を求める. 2. 次のステップでの座標 :math:`x_{n+2}` を次式から評価する .. math:: x_{n+2} = x_{n+1} - \dfrac{ f( x_{n+1} ) }{ f^{\prime}( x_{n+1} ) } = x_{n+1} - \dfrac{ f( x_{n+1} ) }{ \dfrac{ f( x_{n+1} ) - f( x_n ) }{ x_{n+1} - x_n } } 3. 得られた数値解が許容誤差より低ければ ( :math:`f(x_{n+2}) < \epsilon` ),解探索を終了し,許容誤差より大きければステップ1に戻って,解をもう1ステップ進める. 割線法の特徴 ====================================== 長所 * 解くべき関数のみを与えれば良い. ( *Newton-Raphson* 法では,解析的な関数とその解析微分が必要 ) * 一般的に,二分法よりも収束が速い ( :math:`O(\Delta^2)` の収束 ) 短所 * 収束の安定性が保証されていない. サンプルコード ====================================== サンプルコードを以下に示す. .. literalinclude:: code/main.f90 :caption: main.f90 :language: fortran :linenos: .. literalinclude:: code/secantSlvMod.f90 :caption: secantSlvMod.f90 :language: fortran :linenos: 実行結果例 ====================================== 実行結果例を以下に示す. .. code-block:: shell kent@euler ~/fortran/secantSolver $ ./main answer :: x1 == -0.26188657207873522 residual :: x2 == -1.1102230246251565E-016 y1 - theory == -1.1102230246251565E-016 theory L.H.S. == 0.70699999999999985 theory R.H.S. == 0.70699999999999996