みその計算物理学
ホーム はじめに リンク集
2変数のニュートン法の数値計算例(C言語)
  • プログラムソース

    今回は x*x+y*y=2 と y=x の2つの方程式があった場合の解を、2変数のニュートン法で求める。

    #include <stdio.h>
    #include <math.h>
    
    #define eps 1.0e-10             //精度
    #define max 1000                //最大繰り返し回数
    
    double f1(double x1,double x2)
    {
            return x1*x1+x2*x2-2.0;
    }
    
    double f2(double x1,double x2)
    {
            return x2-x1;
    }
    
    double J11(double x1,double x2)
    {
            return 2.0*x1;
    }
    
    double J12(double x1,double x2)
    {
            return 2.0*x2;
    }
    
    double J21(double x1,double x2)
    {
            return -1.0;
    }
    double J22(double x1,double x2)
    {
            return 1.0;
    }
    
    void newton2()
    {
            int n;
            double x1,x2,c1,c2,det;
    
            n=0;
            x1=x2=5.0;
    
            do {
                    if(n>max) {
                            printf("解が求まりませんでした。\n");
                            break; //無限ループを防ぐために一定回数繰り返したら終了
                    }
                    n++;
    
                    det=J11(x1,x2)*J22(x1,x2)-J12(x1,x2)*J21(x1,x2);
                    c1=-(J22(x1,x2)*f1(x1,x2)-J12(x1,x2)*f2(x1,x2))/det;
                    c2=-(-J21(x1,x2)*f1(x1,x2)-J11(x1,x2)*f2(x1,x2))/det;
                    x1+=c1;
                    x2+=c2;
    
            } while (c1*c1+c2*c2 > eps );
    
            printf("解は %f と %f \n",x1,x2);
    }
    
    int main()
    {
            newton2();
    
            return 0;
    }
    
  • プログラム実行結果
    解は 1.000000 と 1.000000

    ちなみに、x1 と x2 の初期値をうまく設定すれば、解 -1 と -1 も求まる。