工程计算-列主元Gauss消去法

import java.util.Scanner;

/**
 * @author Janus
 * @creator 2020-03-09-9:42
 */
public class Gauss {
    private int rowNum;
    private int columnNum;
    private double[][] matrix;

    public static void main(String[] Args) {
        Scanner scanner = new Scanner(System.in);

        Gauss obj = new Gauss(scanner.nextInt(),scanner.nextInt());
        obj.Input();
        obj.Output();
        obj.GaussElimination();
        obj.Output();
        System.out.printf("行列式的值为: %f \n",obj.det());

    }

    public void GaussElimination(){
        double max;
        int maxRowNum;
        for(int i=0;i<rowNum-1;++i){
            max=matrix[i][i];
            if(max==0){
                System.err.printf("行列式等于0");
                System.exit(1);
            }
            maxRowNum=i;
            for(int j=i+1;j<rowNum;++j){
                if(Math.abs(max)<Math.abs(matrix[j][i])){
                    max=matrix[j][i];
                    maxRowNum=j;
                }
            }
            swapRow(i+1,maxRowNum+1);
            for(int j=i+1;j<rowNum;++j){
                RowAdd(j+1,i+1,(-matrix[j][i]/matrix[i][i]));
            }
        }
        GaussEliminationAnswer();
    }

    private void GaussEliminationAnswer(){
        double[] ans=new double[rowNum];
        double temp;
        for(int i=rowNum-1;i>=0;--i){
            temp=matrix[i][columnNum-1];
            for(int j=i+1;j<rowNum;++j){
                temp-=ans[j]*matrix[i][j];
            }
            ans[i]=temp/matrix[i][i];
        }
        for(int i=0;i<rowNum;++i){
            System.out.printf("X%d = %f\n",i,ans[i]);
        }
    }


    public Gauss (int r, int c) {
        if(c-r>1){
            System.err.printf("方程有无穷多解\n");
            System.exit(1);
        }
        this.rowNum = r;
        this.columnNum = c;
        matrix = new double[r][c];
    }

    public double det(){
        double sum=1;
        for(int i=0;i<rowNum;++i){
            sum*=matrix[i][i];
        }
        return sum;
    }

    public void RowAdd(int r1, int r2, double rate) {
        r1--;
        r2--;
        for (int i = 0; i < columnNum; ++i) {
            matrix[r1][i] += matrix[r2][i] * rate;
        }
    }

    public void ColumnAdd(int c1, int c2, double rate) {
        c1--;
        c2--;
        for (int i = 0; i < rowNum; ++i) {
            matrix[i][c1] += matrix[i][c2] * rate;
        }
    }

    public void swapRow(int r1, int r2) {
        r1--;
        r2--;
        double temp;
        for (int i = 0; i < columnNum; ++i) {
            temp = matrix[r1][i];
            matrix[r1][i] = matrix[r2][i];
            matrix[r2][i] = temp;
        }
    }

    public void swapColumn(int c1, int c2) {
        c1--;
        c2--;
        double temp;
        for (int i = 0; i < rowNum; ++i) {
            temp=matrix[i][c1];
            matrix[i][c1]=matrix[i][c2];
            matrix[i][c2]=temp;
        }
    }

    public void multiplyRow(int r,double rate) {
        for(int i=0;i<columnNum;++i){
            matrix[r][i]*=rate;
        }
    }

    public void multiplyColumn(int c,double rate) {
        for(int i=0;i<rowNum;++i){
            matrix[i][c]*=rate;
        }
    }

    public final void Output() {
        for (int i = 0; i < rowNum; ++i) {
            for (int j = 0; j < columnNum; ++j) {
                System.out.printf("%+3.6f\t", matrix[i][j]);
            }
            System.out.printf("\n");
        }
        System.out.printf("\n");
    }

    public void Input() {
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < rowNum; ++i) {
            for (int j = 0; j < columnNum; ++j) {
                matrix[i][j] = scanner.nextDouble();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值