Java的高斯消元法

算法虽然会,但是用数组的形式进行求值是一件非常非常恶心的事情。

更恶心的是,公司里面的逻辑居然要用到方程组求解,万分无奈之下,上网找了一份Java代码。

谁知道居然是个算法数组从1开始的。

好吧,认了吧,我就把你改过来。

调试通过。

留个代码做纪念。

 

package com;

public class EquationSolver {

	/**
	 * @列主元高斯消去法
	 */
	static double a[][];
	static double b[];
	static double x[];
	static int n;
	static int n2; //记录换行的次数
    public static void Elimination(){  //消元
    	PrintA();
		for(int k=0;k<n;k++)
		{
			Wrap(k);
			for(int i=k+1;i<n;i++)
			{
				double l=a[i][k]/a[k][k];
				a[i][k]=0.0;
				for(int j=k+1;j<n;j++)
					a[i][j]=a[i][j]-l*a[k][j];
				b[i]=b[i]-l*b[k];
			}
			System.out.println("第"+k+"次消元后:");
			PrintA();
		}
				
	}
    public static void Back()//回代
    {
    	x[n-1]=b[n-1]/a[n-1][n-1];
    	for(int i=n-2;i>=0;i--)
    		x[i]=(b[i]-jisuan(i))/a[i][i];
    }
    public static double jisuan(int i){
    	double he=0.0;
    	for(int j=i;j<=n-1;j++)
    		he=he+x[j]*a[i][j];
    	return he;
    }
    public static void Wrap(int k){//换行
    	double max=Math.abs(a[k][k]);
    	int n1=k;                   //记住要交换的行
    	for(int i=k+1;i<n;i++)     //找到要交换的行
    	{
    		if(Math.abs(a[i][k])>max){
    			n1=i;
    			max=Math.abs(a[i][k]);
    		}
    	}
    	if(n1!=k)
    	{
    		n2++;
    	System.out.println("当k="+k+"时,要交换的行是:"+k+"和"+n1);
    	for(int j=k;j<n;j++)  //交换a的行
    	{
    		double x1;
    		x1=a[k][j];
    		a[k][j]=a[n1][j];
    		a[n1][j]=x1;
    	}
    	double b1;   //交换b的行
		b1=b[k];
		b[k]=b[n1];
		b[n1]=b1;
		System.out.println("交换后:");
		PrintA();
    	}
    }
    public static void Determinant(){//求行列式
    	double DM=1.0;
    	for(int i=0;i<n;i++)
    	{
    		double a2=a[i][i];
    	    DM=DM*a2;
    	}
    	double n3=(double)n2;
    	DM=DM*Math.pow(-1.0, n3);
    	System.out.println("该方程组的系数行列式:det A = "+DM);
    }
    public static void PrintA(){//输出增广矩阵
    	System.out.println("增广矩阵为:");
    	for(int i=0;i<n;i++)
    	{
    		for(int j=0;j<n;j++)
    			System.out.print(a[i][j]+"    ");
    		System.out.print(b[i]+"    ");
    		System.out.print("\n");
    	}
    }
    public static void Print(){//输出方程的根
    	System.out.println("方程组的根为:");
    	for(int i=0;i<n;i++)
    		System.out.println("x"+i+" = "+x[i]);
    }
	public static void main(String[] args) {
		//Scanner as=new Scanner(System.in);
        System.out.println("输入方程组的元数:");
        //n=as.nextInt();
        n=2;
        a=new double[n][n];
        b=new double[n];
        x=new double[n];
        
        double inputA[][] = {{1,1},{1,-1}};
        a = inputA;
        
        double inputB[] = {2,0};
        b = inputB;
        
        double inputX[] = {1,1};
        
        System.out.println("输入方程组的系数矩阵a:");
//        for(int i=1;i<=n;i++)
//        	for(int j=1;j<=n;j++)
//        		a[i][j]=as.nextDouble();
        System.out.println("输入方程组矩阵b:");
//        for(int i=1;i<=n;i++)
//        	b[i]=as.nextDouble();
        Elimination();
        Back();
        Print();
        Determinant();
	}
}

 

转载于:https://my.oschina.net/dacoolbaby/blog/352953

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值