高斯列主元消去法

利用高斯列主元的方法解n元一次方程组,对方程组的要求是对应的系数矩阵是非奇异的。

课本中的题目是:

| -3  2   6  |     |x1|      |4|

| 10 -7  0  |     |x2|  =  |7|    

| 5  -1  5   |     |x3|      |6|

其中,采用的语言是 java ,代码如下,

import java.text.NumberFormat;
import java.util.Scanner;

/**
 * Created by 一粟 on 2017/11/23.
 */
public class Gaussian {
    private int n;//含有x的个数
    private double a[][];//增广矩阵

    public Gaussian(int n, double[][] a) {
        this.n = n;
        this.a = a;
    }
    public void elimination(){  //消元
        for(int k = 0;k<n-1;k++){
            select(k);
            for(int i = k+1; i<n;i++){
                double C = a[i][k]*1.0/a[k][k];
                for(int j = k;j<=n;j++){
                    a[i][j] = a[i][j]-C*a[k][j];
                }
            }
        }
    }
    public void select(int k){ //选取主元并交换
        int max = k;
        double maxNum = a[k][k];
        for(int i = k+1;i<n;i++){
            if(a[i][k]>maxNum){
                max = i;
                maxNum = a[i][k];
            }
        }
        if(max != k){
            double temp;
            for(int i = k;i<=n;i++){
                temp = a[k][i];
                a[k][i] = a[max][i];
                a[max][i] = temp;
            }
        }
    }
    public void  solve(){  //回代求解,并将解放在了最后一列中
        for(int i = n-1;i>=0;i--){
            double sum = 0.0;
            for(int j= i+1;j<n;j++){
                sum += a[i][j] * a[j][n];
            }
            a[i][n] = (a[i][n] - sum)/a[i][i];
        }
    }
    public void print(){   //打印方程的解
        for(int i = 0;i<n;i++){
        	NumberFormat ddf1=NumberFormat.getNumberInstance() ;
        	ddf1.setMaximumFractionDigits(2); 
        	String s= ddf1.format(a[i][n]) ; 
            System.out.println(s);
        }
    }
    public static void main(String [] args){
        Scanner scanner = new Scanner(System.in);
        int n;
        System.out.println("请输入X的个数");
        n = scanner.nextInt();
        double [][]shuzu = new double[n][n+1];
        System.out.println("请输入系数矩阵");
        for(int i=0;i<n;i++){
            shuzu[i] = new double[n+1];
            for(int j = 0;j<n+1;j++){
                shuzu[i][j] = scanner.nextInt();
            }
        }
        Gaussian gaussian = new Gaussian(n,shuzu);
        gaussian.elimination();
        gaussian.solve();
        gaussian.print();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值