zoukankan      html  css  js  c++  java
  • 应用高等数学作业

    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

  • 相关阅读:
    JSON.NET C# 类库
    javascript绑定事件,JQuery绑定事件
    C#批量上传图片
    关闭或重启Windows Server 操作系统时,系统会弹出一个提示窗口
    Asp.net组织结构图控件,思维导图控件
    C# 判断是否可以连接服务器?
    javascript获取select,checkbox,radio的值
    IE、FF、Safari、OP不同浏览器兼容报告
    Microsoft Windows Server 2008 Standard Edition激活码申请方法
    自动修改电脑IP地址.bat
  • 原文地址:https://www.cnblogs.com/siyecaodesushuo/p/13952521.html
Copyright © 2011-2022 走看看