みその計算物理学
ホーム はじめに リンク集
ベアストウ法の数値計算例(Java)
  • 解く方程式

    今回は
    (x-5)(x-4)(x-3)(x-2)(x-1)=0
    を解く。

  • プログラムソース
    import java.io.*;
    
    class Co
    {
            static final int N=5;   //方程式の最高次数
            static final double eps=1.0e-5; //精度決定定数
    }
    
    class Bairstow
    {
            public static void main(String arg[])
            {
                    int n;
                    double a[]={1.0,-15.0,85.0,-225.0,274.0,-120.0};        //方程式の係数を最高次数のものから入れる
    
                    n=Co.N;
    
                    Bairstow bs=new Bairstow();
                    bs.bairstow(n,a);
            }
    
            /*解の公式を用いて2次方程式の解を求める関数*/
            void answer(double a,double b,double c)
            {
                    double Re1,Re2,Im1,Im2,D;     
                    D=b*b-4*a*c;            //解の判別式                 
                    if(D>0) 
                    {
                            Re1=(-b+Math.sqrt(D))/(2*a);
                            Re2=(-b-Math.sqrt(D))/(2*a);
                            Im1=0;
                            Im2=0;
                    }
                    else if(D==0)
                    {
                            Re1=-b/(2*a);
                            Im1=0;
                            Re2=Im2=0;
                    }
                    else
                    {
                            Re1=-b/(2*a);
                            Re2=Re1;
                            Im1=Math.sqrt(-D)/(2*a);
                            Im2=-Im1;
                    }
    
                    if(D==0)
                    {
                            System.out.println( Re1 + "+" + "i" + Im1);
                    }
                    else
                    {
                            System.out.println( Re1 + "+" + "i" + Im1);
                            System.out.println( Re2 + "+" + "i" + Im2);
                    }
            }
    
            void bairstow(int n,double p[])
            {
                    int i,max;
                    double det,db,dc,q[]=new double[Co.N+1],u[]=new double[Co.N+1],w[]=new double[Co.N+1];
                    double xxx,b,c;
    
                    max=0;
                    xxx=1.0;                //関数answerの引数aに1を渡すため
            
                    for(;;) 
                    {
                            b=c=1.0;
    
                            do 
                            {
                                    max++;
    
                                    for(i=0;i<=n;i++) 
                                    {
                                            if(i==0) q[i]=p[i];
                                            else if(i==1) q[i]=p[i]-b*q[i-1];
                                            else q[i]=p[i]-b*q[i-1]-c*q[i-2];
                                    }
                                    for(i=0;i<=n;i++) 
                                    {
                                            if(i==0) u[i]=0.0;
                                            else if(i==1) u[i]=-q[i-1]-b*u[i-1];
                                            else u[i]=-q[i-1]-b*u[i-1]-c*u[i-2];
                                    }
                                    for(i=0;i<=n;i++) 
                                    {
                                            if(i==0) w[i]=0.0;
                                            else if(i==1) w[i]=-b*w[i-1];
                                            else w[i]=-q[i-2]-b*w[i-1]-c*w[i-2];
                                    }
    
                                    det=u[n-1]*w[n]-w[n-1]*(u[n]+q[n-1]);
                                    db=1.0/det*(q[n]*w[n-1]-q[n-1]*w[n]);
                                    dc=1.0/det*(-q[n]*u[n-1]+q[n-1]*(u[n]+q[n-1]));
    
                                    b+=db;
                                    c+=dc;
                            }while ( db*db+dc*dc > Co.eps*Co.eps ); //精度を満たすまで計算
    
                            for(i=0;i<=n-2;i++) p[i]=q[i];
    
                            if(n>=3) 
                            {
                                    answer(xxx,b,c);
                                    n-=2;
                            }
                            else if(n==2) 
                            {
                                    answer(p[0],p[1],p[2]);
                                    break;
                            }
                            else if(n==1) 
                            {
                                    System.out.println(-p[1]/p[0]+ "i" + "0");
                                    break;
                            }
                    }
            }
    }
    
  • プログラム実行結果
    1.9999999999999787+i0.0
    1.0000000000000009+i0.0
    3.9999998420141938+i0.0
    3.0000001582963338+i0.0
    5.0000000530529247i0
    Press any key to continue