应用高等数学作业

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

posted @ 2020-11-10 10:32  四叶草的诉说  阅读(186)  评论(0编辑  收藏  举报