ベアストウ法の数値計算例(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
|
|
|
|
|
|