💭

ニュートン法を用いて方程式 4𝑥^3+2𝑥^2−10=0を解くCプログラム

2024/11/14に公開

【ニュートン法】
反復的に近似解を求めるアルゴリズム。
f(x)=0の解を求めるための反復的な数値解析手法
微分と反復計算を用いて初期値から解に近づく
どんどんと範囲を狭めていって解きたい値がなんなのかを明確にしていく。


引用:https://www.youtube.com/watch?v=4sjfMvuitnE
xnの接線求める→接線とx軸との交点をxn+1とする→xn+1のy軸から接線ひく→αの方向に接線が引かれる→...
このようにしてαというf(x)=0の解αに近い値を求めることができる。

接線の公式理解(↓)のために役立つ。
https://www.try-it.jp/chapters-6916/sections-6917/lessons-6954/

【プログラム】

#include <stdio.h>
#include <math.h>

// 方程式 f(x) = 4x^3 + 2x^2 - 10 の定義
double f(double x) {
    return 4 * x * x * x + 2 * x * x - 10;
}

// 導関数 f'(x) = 12x^2 + 4x の定義
double df(double x) {
    return 12 * x * x + 4 * x;
}

•ニュートン法においてf(x)の導関数を求める必要があるのでそれを定義
•doubleは浮動小数点数を扱うためのデータ型
•floatより多くの桁を表現できる

// ニュートン法を用いた解法
//xinit:初期値
//tokerance:許容値
//max_iterations:最大反復回数
double newton(double xinit, double tolerance, int max_iterations) {
    double x = xinit;

//100回ループを回す
    for (int i = 0; i < max_iterations; i++) {

        //今のxに対してのf(x)とf'(x)の算出
        double y = f(x);
        double dy = df(x);

        //導関数小すぎると処理終了
        if (fabs(dy) < 1e-8) {
            printf("導関数が小さすぎます。反復を停止します。\n");
            break;
        }

        double next_x = x - y / dy;

     //各反復での近似値を表示
        printf("反復回数 %d: x = %.6f\n", i + 1, next_x);

double next_x = x - y / dy;は以下の右辺のとこ


        //近似値(fabs)の変化が許容誤差未満(tolerance)であれば、解が収束(理想の値に近づく)
        if (fabs(next_x - x) < tolerance) {
            return next_x; // 収束した場合
        }

        x = next_x;
    }
    return x; // 最大反復数に到達した場合
}

•近似値とは?:真の値に近い数値のこと
•収束するとは?

参照:https://www.youtube.com/watch?v=4sjfMvuitnE

int main() {
    double xinit = 1.0; // 初期値
    double tolerance = 1e-6; // 許容誤差
    int max_iterations = 100; // 最大反復回数

    printf("4x^3 + 2x^2 - 10 = 0をニュートン法を用いて解くと...\n");

//f(x)=0の近似値を計算し、その結果をrootに格納
    double root = newton(xinit, tolerance, max_iterations);
    printf("解: x = %.6f\n", root);

    return 0;
}

•int main():メイン関数

•許容誤差1e-6とは?
•十分に正確と見做せる範囲を定める値のこと。
•ex)最終的に求めたい値が1で、許容誤差が0.1だった場合、1.1が出た時点で、そのプログラムは終了とする

double root = newton(xinit, tolerance, max_iterations);ではf(x)=0の近似解を計算する.
•f(x)=0は方程式の解を求める問題を表す。ニュートン法はこの解を効率的に近似する数値計算手法。
•「4x^3 + 2x^2 - 10 が0となるようなxを求めよ。」という問いなので、「f(x) = 4x^3 + 2x^2 - 10」とし、これが「f(x) = 0」の場合を考える

【実行結果】

ニュートン法を用いて 4x^3 + 2x^2 - 10 = 0 を解くと...
反復回数 1: x = 1.250000
反復回数 2: x = 1.210526
反復回数 3: x = 1.209356
反復回数 4: x = 1.209355
反復回数 5: x = 1.209355
解: x = 1.209355

Discussion