2.完整代码:
import java.util.Scanner;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
public class Matrix {
int size;
double[][] data;
double[][] L;
double[][] R;
double[] x;
double[] y;
double[] z;
double r;
double[][] I;
public Matrix() {
this.size=0;
data=new double[size][size];
}
public void init(){ //输入矩阵信息
System.out.print("请输入方阵大小:");
Scanner scanner=new Scanner(System.in);
size=scanner.nextInt();
data=new double[size][size];
System.out.print("请输入方阵:");
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
data[i][j]=scanner.nextDouble();
}
}
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public double[][] getData() {
return data;
}
public void setData(double[][] data) {
this.data = data;
}
public void test() { //测试数据
size=3;
r=6.1;
data=new double[size][size];
data[0][0]=4;data[0][1]=-1;data[0][2]=1;
data[1][0]=-1;data[1][1]=3;data[1][2]=-2;
data[2][0]=1;data[2][1]=-2;data[2][2]=3;
for(int i=0;i<3;i++)
data[i][i]-=r;
}
public void test2() { //测试数据
size=3;
r=-6.42;
data=new double[size][size];
data[0][0]=-1;data[0][1]=2;data[0][2]=1;
data[1][0]=2;data[1][1]=-4;data[1][2]=1;
data[2][0]=1;data[2][1]=1;data[2][2]=-6;
L=new double[3][3];
L[0][0]=1;L[0][1]=0;L[0][2]=0;
L[1][0]=0.369004;L[1][1]=1;L[1][2]=0;
L[2][0]=0.184502;L[2][1]=0.375148;L[2][2]=1;
R=new double[3][3];
R[0][0]=5.42;R[0][1]=2;R[0][2]=1;
R[1][0]=0;R[1][1]=1.681993;R[1][2]=0.630996;
R[2][0]=0;R[2][1]=0;R[2][2]=-1.218848*0.001;
}
public void print() { //输出矩阵
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
System.out.print(String.format("%.6f ",data[i][j]));
}
System.out.println();
}
}
public void Doolittle() { //LR分解
L=new double[size][size];
R=new double[size][size];
I=new double[size][size];
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++)
I[i][j]=0;
I[i][i]=1;
}
for(int i=0;i<size;i++) {
for(int j=i+1;j<size;j++) {
double times=data[j][i]/data[i][i];
for(int k=i;k<size;k++) {
data[j][k]-=data[i][k]*times;
}
for(int k=0;k<=i;k++)
I[j][k]-=I[i][k]*times;
}
}
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
R[i][j]=data[i][j];
}
}
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
L[i][j]=I[i][j];
}
}
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++)
I[i][j]=0;
I[i][i]=1;
}
for(int i=0;i<size;i++) {
for(int j=0;j<=i;j++)
I[i][j]/=L[i][i];
for(int j=i+1;j<size;j++) {
for(int k=0;k<=i;k++) {
I[j][k]-=I[i][k]*L[j][i];
}
}
}
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
L[i][j]=I[i][j];
}
}
System.out.println("L:");
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
System.out.print(String.format("%.6f"+" ",L[i][j]));
}
System.out.println();
}
System.out.println("R:");
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
System.out.print(String.format("%.6f"+" ",R[i][j]));
}
System.out.println();
}
}
public double eigenvalue(){ //迭代求值
x=new double[size];
y=new double[size];
z=new double[size];
for(int i=0;i<size;i++)
z[i]=1;
x=linear_equationsR(R, z);
double max_x=maxx();
for(int i=0;i<size;i++)
y[i]=x[i]/max_x;
int times=1;
System.out.println("第"+times+"次迭代:");
printxyz();
System.out.println();
while(true) {
z=linear_equationsL(L, y);
x=linear_equationsR(R, z);
max_x=maxx();
for(int i=0;i<size;i++)
y[i]=x[i]/max_x;
times++;
System.out.println("第"+times+"次迭代:");
printxyz();
System.out.println();
if(abs(max_x)>100||times>=5) {
r+=1.0/max_x;
break;
}
}
System.out.println("r:"+String.format("%.6f",r));
return r;
}
public double maxx() { //x[size]按模最大的分量
double s=x[0];
int t=0;
for(int i=1;i<size;i++)
if(s<abs(x[i])) {
s=abs(x[i]);
t=i;
}
return x[t];
}
public void printxyz() {
System.out.print("x=(");
for(int i=0;i<size;i++)
System.out.print(String.format("%.6f,",x[i]));
System.out.println(")");
System.out.print("y=(");
for(int i=0;i<size;i++)
System.out.print(String.format("%.6f,",y[i]));
System.out.println(")");
System.out.print("z=(");
for(int i=0;i<size;i++)
System.out.print(String.format("%.6f,",z[i]));
System.out.println(")");
}
private double abs(double d) {
// TODO Auto-generated method stub
if(d<0)
d=-d;
return d;
}
public double[] linear_equationsR(double[][] AA,double[] yy){
double[][] A=new double[size][size];
double[] y=new double[size];
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++)
A[i][j]=AA[i][j];
y[i]=yy[i];
}
/*for(int i=0;i<size;i++) {
for(int j=0;j<size;j++)
System.out.print(A[i][j]+" ");
System.out.println(y[i]+" ");
}
System.out.println();*/
for(int i=size-1;i>=0;i--) {
y[i]/=A[i][i];
for(int j=i-1;j>=0;j--) {
y[j]-=A[j][i]*y[i];
}
}
/*for(int i=0;i<size;i++) {
for(int j=0;j<size;j++)
System.out.print(A[i][j]+" ");
System.out.println(y[i]+" ");
}
System.out.println();*/
return y;
}
public double[] linear_equationsL(double[][] AA,double[] yy){
double[][] A=new double[size][size];
double[] y=new double[size];
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++)
A[i][j]=AA[i][j];
y[i]=yy[i];
}
for(int i=0;i<size;i++) {
y[i]/=A[i][i];
for(int j=i+1;j<size;j++)
y[j]-=y[i]*A[j][i];
}
return y;
}
public static void main(String []args) {
Matrix matrix=new Matrix();
//matrix.init();
matrix.test();
matrix.print(); //输出矩阵A
matrix.Doolittle(); //LR分解
matrix.eigenvalue();
}
}
输出:
-2.100000 -1.000000 1.000000
-1.000000 -3.100000 -2.000000
1.000000 -2.000000 -3.100000
L:
1.000000 0.000000 0.000000
0.476190 1.000000 0.000000
-0.476190 0.943739 1.000000
R:
-2.100000 -1.000000 1.000000
0.000000 -2.623810 -2.476190
0.000000 0.000000 -0.286933
第1次迭代:
x=(-3.520509,2.907932,-3.485136,)
y=(1.010150,-0.834381,1.000000,)
z=(1.000000,1.000000,1.000000,)
第2次迭代:
x=(-9.501761,9.455537,-9.488011,)
y=(1.001449,-0.996577,1.000000,)
z=(1.010150,-1.315405,2.722422,)
第3次迭代:
x=(-9.994101,9.992746,-9.993417,)
y=(1.000068,-0.999933,1.000000,)
z=(1.001449,-1.473458,2.867440,)
第4次迭代:
x=(-10.000026,9.999987,-10.000000,)
y=(1.000003,-0.999999,1.000000,)
z=(1.000068,-1.476156,2.869328,)
第5次迭代:
x=(-10.000005,10.000004,-10.000004,)
y=(1.000000,-1.000000,1.000000,)
z=(1.000003,-1.476190,2.869330,)
r:6.000000