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