プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

非線形方程式を解くための割線法(セカント法):アルゴリズムとC++実装例

割線法(セカント法)とは

割線法(セカント法)は、非線形方程式を解くために用いられる数値解法の一つです。この手法はニュートン・ラプソン法とよく似ていますが、関数 f(x) の微分を解析的に求める必要がない点が大きな特徴です。f(x) の値のみを用いて、ニュートンの差分公式(除算差分公式)により f'(x) を数値的に近似することができます。

まず、ニュートン・ラプソン法の公式は次のようになります。

非線形方程式を解くための割線法(セカント法):アルゴリズムとC++実装例

ここで差分公式を適用すると、f'(x) を次のように近似できます。

非線形方程式を解くための割線法(セカント法):アルゴリズムとC++実装例非線形方程式を解くための割線法(セカント法):アルゴリズムとC++実装例非線形方程式を解くための割線法(セカント法):アルゴリズムとC++実装例

ニュートン・ラプソン法の公式に含まれる f'(x) を、この新しい近似式で置き換えることで、非線形方程式を解くための割線法の公式が導かれます。

非線形方程式を解くための割線法(セカント法):アルゴリズムとC++実装例

注意: 割線法では、非線形方程式の根を反復計算で求める際の出発点として、任意の2つの初期値が必要です。初期値の選び方によっては収束しない場合もあるため、注意が必要です。

入力と出力

Input:
関数 f(x) = (x*x) - (4*x) - 10
Output:
根は: -1.74166

アルゴリズム

secant(x1, x2)

入力: 根に対する2つの初期推定値。

出力: 非線形方程式 f(x) の近似根。

Begin
    f1 := f(x1)
    f2 := f(x2)
    x3 := ((f2*x1) – (f1*x2)) / (f2 – f1)
    while relative error of x3 and x2 are > precision, do
        x1 := x2
        f1 := f2
        x2 := x3
        f2 := f(x2)
        x3 := ((f2*x1) – (f1*x2)) / (f2 – f1)
    done
    root := x3
    return root
End

C++による実装例

以下は、割線法を用いて関数 f(x) = x² − 4x − 10 の根を求めるC++プログラムの例です。

#include<iostream>
#include<cmath>
using namespace std;

double absolute(double value) {         //値の絶対値を求める
    if(value < 0)
        return (-value);
    return value;
}

double f(double x) {                     //与えられた関数 x^2-4x-10
    return ((x*x)-(4*x)-10);
}

double secant(double x1, double x2) {
    double x3, root;
    double f1, f2;
    f1 = f(x1);
    f2 = f(x2);
    x3 = (f2*x1-f1*x2)/(f2-f1);

    while(absolute((x3-x2)/x3) > 0.00001) {      //x3の精度を判定
        x1 = x2;          //xの値を更新
        f1 = f2;
        x2 = x3;
        f2 = f(x2);              //新しいx2を求める
        x3 = (f2*x1-f1*x2)/(f2-f1);      //新しいx3を計算
    }

    root = x3;
    return root;             //方程式の根
}

main() {
    double a, b, res;
    a = 0.5;
    b = 0.75;
    res = secant(a, b);
    cout << "根は: " << res;
}

実行結果

根は: -1.74166

このように、初期値 a = 0.5、b = 0.75 から反復計算を行うことで、方程式 x² − 4x − 10 = 0 の根 −1.74166 が高精度で求められました。割線法は微分を必要としないため、微分が困難な関数に対しても手軽に適用できる実用的な手法です。

  1. RubyのArray#zipメソッド徹底解説!2つの配列をスマートに結合する方法

    2つの配列を要素ごとに比較して、その違いを見つけたいと思ったことはありませんか? あるいは、各インデックスごとに最大の数値を求めたい、キーのリストと値のリストを組み合わせてハッシュを作りたい――そんな場面にも出会うことがあるでしょう。 …これを「面倒な方法」で実装すると、次のようなコードになります。 例:冗長な書き方 a = [1,2,3,4,5] b = [1,2,3,6,8] c = a.map.with_index { |_, idx| [a[idx], b[idx]] } # [[1, 1], [2, 2], [3, 3], [4, 6], [5, 8]] 確かに動作はしますが

  2. PCで『CoD: Warzone』が起動しない時の対処法6選|原因別の解決策を徹底解説

    『Call of Duty: Warzone』は、世界中で何百万人ものプレイヤーに愛されているバトルロイヤルアクションゲームです。しかし、いざプレイしようとした瞬間に「Warzoneが起動しない」というエラーに直面すると、非常にストレスを感じますよね。本記事では、さまざまなゲーミングフォーラムで推奨されている専門家の解決策を厳選してまとめました。この1本の記事を参考にするだけで、PCでWarzoneが起動しない問題を解決できるはずです。 PCでWarzoneが起動しない問題を解決する6つの方法 以下に、問題を解決するための方法を順番にご紹介します。すべての方法を実行する必要はありません。各方