みその計算物理学
ホーム はじめに リンク集
2変数のニュートン法の数値計算例(Java)
  • プログラムソース
    import java.io.*;
    import java.util.*;
    
    class Newton2
    {
            public static void main()
            {
                    int n,max;
                    double x1,x2,c1,c2,det,eps;
                    String s;
    
                    n=0;
                    max=1000;               //最大繰り返し回数
                    eps=1.0e-5;             //精度
                    x1=x2=0.0;
    
                    Newton2 f=new Newton2();
    
                    System.out.println("初期値2つをスペースを空けて入力してください。");
    
                    try
                    {
                            InputStreamReader isr=new InputStreamReader(System.in);
                            BufferedReader br=new BufferedReader(isr);
                            s=br.readLine();
                            StringTokenizer st=new StringTokenizer(s," ");
                            x1=Double.parseDouble(st.nextToken());
                            x2=Double.parseDouble(st.nextToken());
                    }
                    catch(Exception e)
                    {
                            System.out.println(e);
                    }
    
                    do
                    {
                            if(n>max)
                            {
                                    System.out.println("解が求まりませんでした。");
                                    break;
                            }
    
                            n++;
    
                            det=f.J11(x1,x2)*f.J22(x1,x2)-f.J12(x1,x2)*f.J21(x1,x2);
                            c1=-(f.J22(x1,x2)*f.f1(x1,x2)-f.J12(x1,x2)*f.f2(x1,x2))/det;
                            c2=-(-(f.J21(x1,x2)*f.f1(x1,x2)-f.J11(x1,x2)*f.f2(x1,x2)))/det;
                            x1+=c1;
                            x2+=c2;
                    } while (c1*c1+c2*c2 > eps);
    
                    System.out.println("解は" + x1 + "と" + x2 + "です。");
            }
    
            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;
            }
    
    }
    
  • プログラム実行結果
    初期値2つをスペースを空けて入力してください。
    5.0 5.0
    解は1.0000000000107445と1.0000000000107445です。
    Press any key to continue

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