列主元素高斯消去法(java 实现)

这两天刚开始学习java,涉及的知识面比较浅,但相信和我一样的小伙伴们应该挺多吧,一起加油努力吧!


如下图:

先解释下什么是列主元素高斯消去法:(主要还是得会手工计算)

1.写出方程组的增广矩阵

2.把当前要消元的第一列的绝对值最大的元素所在的行与要消元的第一行互换

3.按照高斯消去法进行消元(可自行百度下高斯消元法)

上java代码:

public class Lwvuyrgcsixnqufa {
    public static void main(String[] args){
        double[][] array=creatArray();
        fun(array);
    }

    public static double[][] creatArray(){    //生成增广矩阵的二维数组
        double[][] arrays={
            {1.1348,3.8326,1.1665,3.4017,9.5342},
            {0.5301,1.7875,2.5330,1.5435,6.3941},
            {3.4129,4.9317,8.7643,1.3142,18.4231},
            {1.2371,4.9998,10.6721,0.0147,16.8237}
        };                            //可自行随意更换该增广矩阵矩阵
        /*double[][] arrays={         
            {-3,2,6,4},
            {10,-7,0,7},
            {5,-1,5,6}
        };*/
        return arrays;
    }

    public static void fun(double[][] a){     
        int row=a.length,col=a[0].length;
        int p=0,k=0;
        while(sjjn(a)){        //循环终止的条件是方程的非增广矩阵形成了上三角矩阵
            double max=Math.abs(a[p][p]);
            for(int i=p+1;i<row;i++){        //选出主元,将下标赋值给k
                if(Math.abs(a[i][p])>max){
                    max=a[i][p];
                    k=i;
                }
            }
            if(k!=0){                        //将主元行与参与运算的第一行互换
                for(int i=p;i<col;i++){        
                    double temp=a[p][i];
                    a[p][i]=a[k][i];
                    a[k][i]=temp;
                }
            }
            yysr1(a,p);            //进行运算,用当前主元行消去下面的所有行的第一个元素
            p++;k=0;
        }
        print(a);
        yysr2(a);            //此时形成了非增广上三角矩阵,即可从下往上运算出x的值
    }

    public static boolean sjjn(double[][] arrays){    //检测是否形成了非增广上三角矩阵
        for(int i=1;i<arrays.length;i++){
            for(int j=0;j<i;j++)
                if(arrays[i][j]!=0)
                    return true;
        }
        return false;
    }

    public static void yysr1(double[][] a,int p){    //进行第一步运算,用主元消去其他元
        for(int i=p+1;i<a.length;i++){
            double e=(a[i][p]/a[p][p]*(-1));
            a[i][p]=0;
            for(int j=p+1;j<a[0].length;j++){
                a[i][j]+=e*a[p][j];
            }
        }
    }

    public static void print(double[][] a){    //输出消元完成后的矩阵
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a[0].length;j++){
                System.out.printf("%5.4f\t\t\t",a[i][j]);
            }
            System.out.println();
        }
    }

    public static void yysr2(double[][] a){    //进行第二步运算
        double[] list=new double[20];
        int row=a.length,col=a[0].length,k=0;
        double vi=0;
        list[k]=a[row-1][col-1]/a[row-1][col-2];    //保存x值的数组
        k++;
        int t1=row-2,t2=col-2;            
        for(int i=0;i<row-1;i++){    //这段逻辑关系也不是很深,可以自己研究下
            vi=a[t1][col-1];
            for(int j=0;j<i+1;j++){
                vi-=a[t1][t2]*list[j];
                t2--;
            }
            list[k]=vi/a[t1][t2];
            k++;
            t1--;
            t2=col-2;
        }
        printlist(list,k);        //输出x的值
    }

    public static void printlist(double[] list,int k){    //输出x的值
        for(int i=0,j=k;i<k;i++,j--){
            System.out.printf("x%d=%5.4f",j,list[i]);    //输出的精度可自行控制
            System.out.println();
        }
    }

}

运行截图:

有什么疑问可以在评论区问我~~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓晓的雨夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值