java实现解一元n次多项式(二)

来源:互联网 发布:caffe在windows安装 编辑:程序博客网 时间:2024/06/01 15:47
package commonAlgorithm;public class PolynomialSoluter {    private double[][] matrix;    private double[] result;    private int order;    // public PolynomialSoluter() {    //    // }    // 检查输入项长度    private boolean init(double[][] matrixA, double[] arrayB) {        order = arrayB.length;        if (matrixA.length != order)            return false;        for (double[] arrayA : matrixA)            if (arrayA.length != order)                return false;        matrix = matrixA;        result = arrayB;        return true;    }    public double[] getResult(double[][] matrixA, double[] arrayB) {        if (!init(matrixA, arrayB))            return null;        // 高斯消元-正向        for (int i = 0; i < order; i++) {            // 如果当前行对角线项为0则与后面的同列项非0的行交换            if (!swithIfZero(i))                return null;            // 消元            for (int j = i + 1; j < order; j++) {                if (matrix[j][i] == 0)                    continue;                double factor = matrix[j][i] / matrix[i][i];                for (int l = i; l < order; l++)                    matrix[j][l] -= matrix[i][l] * factor;                result[j] -= result[i] * factor;            }        }        // 高斯消元-反向-去掉了冗余计算        for (int i = order - 1; i >= 0; i--) {            result[i] /= matrix[i][i];            for (int j = i - 1; j > -1; j--)                result[j] -= result[i] * matrix[j][i];        }        return result.clone();    }    private boolean swithIfZero(int i) {        if (matrix[i][i] == 0) {            int j = i + 1;            // 找到对应位置非0的列            while (j < order && matrix[j][i] == 0)                j++;            // 若对应位置全为0则无解            if (j == order)                return false;            else                switchRows(i, j);        }        return true;    }    // 调换行    private void switchRows(int i, int j) {        double[] tmp1 = matrix[i];        matrix[i] = matrix[j];        matrix[j] = tmp1;        double tmp2 = result[i];        result[i] = result[j];        result[j] = tmp2;    }    public static void main(String[] args) {        double[][] matrixA = { { 0, 0, 1 }, { 0, 1, 0 }, { 1, 0, 0 } };        double[] arrayB = { 1, 3, 2 };        PolynomialSoluter ps = new PolynomialSoluter();        for (double result : ps.getResult(matrixA, arrayB))            System.out.println(result);    }}

后来发现这个类要被调用太多次,但之前没考虑效率问题。所以重新写了这个类,之前的代码参考我之前的文章http://blog.csdn.net/strangerzz/article/details/45244249
主要就是去掉了数组里面赋值等操作,也不再生成增广矩阵了。虽然看起来比以前要难理解一下,但是效率应该会有所提升

0 0