C++ | ニュートン法で方程式を解く

方程式を解くための求根アルゴリズムのひとつにニュートン法があります。
\(x_{n+1} = x_n – \frac{f(x_n)}{f'(x_n)}\) の漸化式を反復的に計算して \(x\) の収束値を算出するアルゴリズムです。

この記事では、C++ でのニュートン法のプログラム例を紹介します。

ニュートン法 プログラム例

早速ですが実装例です。

ニュートン法への入力引数としては次のものが必要になります。

引数説明
f\(f(x)\) の関数
f_prime\(f'(x)\) の関数
x0\(x\) の初期値
torelance誤差許容値
max_iter最大試行回数

漸化式を逐次計算するだけのため、実装はとてもシンプルです。
次のようになります。

C++
#include <cmath>
#include <functional>

double newton_method(
    std::function<double(double)> f,
    std::function<double(double)> f_prime,
    double x0,
    double torelance,
    std::size_t max_iter) {

    double x = x0;
    for (std::size_t i = 0; i < max_iter; ++i) {
        double fx = f(x);
        if (std::abs(fx) < torelance) {
            return x;
        }

        x -= fx / f_prime(x);
    }

    throw std::runtime_error("最大試行回数に達しました");
}

ニュートン法 実行例

以下、\(f(x) = x^2 – 2\) の方程式をニュートン法で計算する例です。

C++
#include <cmath>
#include <functional>
#include <iomanip>
#include <iostream>

double newton_method(
    ...
}

double f(double x) {
    return x * x - 2.0;
}

double f_prime(double x) {
    return 2.0 * x;
}

int main() {
    auto y = newton_method(f, f_prime, 1.0, 1e-12, 100);
    std::cout << std::fixed << std::setprecision(11) << y << std::endl;
    // Output: 1.41421356237
    return 0;
}

ニュートン法では、\(f(x)\) の他に、\(f'(x)\) を計算するための関数も必要になります。
\(f'(x) = 2x\) の関数をf_primeとして定義します。

実行結果として \(\sqrt{2} = 1.414\cdots\) が得られます。

目次

自動微分によるニュートン法の改良

ニュートン法の改良として、自動微分を活用することで一次微分式 f_prime の定義を不要にすることができます。
以下の記事で解説します。

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次