3.4x + 50.2y = 44.5
2.1x + .55y = 5.9写程序计算得出, x 和 y 的值

解决方案 »

  1.   

    package com.mybolgs.common;import java.math.BigDecimal;
    import java.math.RoundingMode;public class Equation {
     private static final BigDecimal ZERO = new BigDecimal("0");
        private static final BigDecimal ONE = new BigDecimal("1");
     
        public static void main(String[] args) {
            /**
             * 方程组
             * 3.4x + 50.2y = 44.5
             * 2.1x + 0.55y = 5.9          */
            BigDecimal[][] matrix = new BigDecimal[][]{
                    {new BigDecimal("3.4"), new BigDecimal("50.2"), new BigDecimal("44.5")},
                    {new BigDecimal("2.1"), new BigDecimal("0.55"), new BigDecimal("5.9")}
            };
            BigDecimal[] rst = new Equation().solveEquation(matrix, 3, RoundingMode.HALF_UP);
            for (int i = 0; i < rst.length; ++i) {
                System.out.println(rst[i]);
            }
        }
     
        /**
         * 解多元一次方程组
         * 只能解决n个变量n个方程的情况,即矩阵是n*(n+1)的形式
         * @param matrix 矩阵
         * @param scale 精确小数位数
         * @param roundingMode 舍入模式
         * @return
         */
        public BigDecimal[] solveEquation(BigDecimal[][] matrix, int scale, RoundingMode roundingMode){
            if(isNullOrEmptyMatrix(matrix)){
                return new BigDecimal[0];
            }
            BigDecimal[][] triangular = elimination(matrix, scale, roundingMode);
            return substitutionUpMethod(triangular, scale, roundingMode);
        }
     
     
        /**
         * 用高斯消元法将矩阵变为上三角形矩阵
         *
         * @param matrix
         * @param scale 精确小数位数
         * @param roundingMode 舍入模式
         * @return
         */
        private BigDecimal[][] elimination(BigDecimal[][] matrix, int scale, RoundingMode roundingMode) {
            if(isNullOrEmptyMatrix(matrix) || matrix.length != matrix[0].length - 1){
                return new BigDecimal[0][0];
            }
            int matrixLine = matrix.length;
            for (int i = 0; i < matrixLine - 1; ++i) {
                //第j行的数据 - (第i行的数据 / matrix[i][i])*matrix[j][i]
                for (int j = i + 1; j < matrixLine; ++j) {
                    for (int k = i + 1; k <= matrixLine; ++k) {
                        //matrix[j][k] = matrix[j][k] - (matrix[i][k]/matrix[i][i])*matrix[j][i];
                        matrix[j][k] = matrix[j][k].subtract((matrix[i][k].divide(matrix[i][i], scale, roundingMode).multiply(matrix[j][i])));
                    }
                    matrix[j][i] = ZERO;
                }
            }
            return matrix;
        }
     
        /**
         * 回代求解(针对上三角形矩阵)
         *
         * @param matrix 上三角阵
         * @param scale 精确小数位数
         * @param roundingMode 舍入模式
         */
        private BigDecimal[] substitutionUpMethod(BigDecimal[][] matrix, int scale, RoundingMode roundingMode) {
            int row = matrix.length;
            for (int i = 0; i < row; ++i) {
                if (matrix[i][i].equals(ZERO.setScale(scale))) {//方程无解或者解不惟一
                    return new BigDecimal[0];
                }
            }
            BigDecimal[] result = new BigDecimal[row];
            for (int i = 0; i < result.length; ++i) {
                result[i] = ONE;
            }
            BigDecimal tmp;
            for (int i = row - 1; i >= 0; --i) {
                tmp = ZERO;
                int j = row - 1;
                while (j > i) {
                    tmp = tmp.add(matrix[i][j].multiply(result[j]));
                    --j;
                }
                result[i] = matrix[i][row].subtract(tmp).divide(matrix[i][i], scale, roundingMode);
            }
            return result;
        }
     
        /**
         * 判断系数矩阵是否是null或空数组
         * @param matrix 系数矩阵
         * @return null或空数组返回true,否则返回false
         */
        private static boolean isNullOrEmptyMatrix(BigDecimal[][] matrix){
            if(matrix == null || matrix.length == 0){
                return true;
            }
            int row = matrix.length;
            int col = matrix[0].length;
            for(int i = 0; i < row; ++i){
                for(int j = 0; j < col; ++j){
                    if(matrix[i][j] == null){
                        return true;
                    }
                }
            }
            return false;
        }
    }摘自 http://www.oschina.net/code/snippet_657390_47828
      

  2.   

    /**
     * 求二元一次方程的解 
     * @param a [3.4,50.2,44.5]
     * @param b [2.1,55,5.9]
     * @return   
     */
    public static double[] arithmetic_a_b(double[] a,double[] b) {
    double[] result=new double[a.length-1];
    if (a!=null&&b!=null) {
    result[1]=(a[2]*b[0]-b[2]*a[0])/(a[1]*b[0]-b[1]*a[0]);
    result[0]=(a[2]-a[1]*result[1])/a[0];
    }
    return result;
    }
    完整程序参考——http://www.dingwave.com/bbs/forum.php?mod=viewthread&tid=132&extra=