GaussJordan消除算法Java

GaussJordan消除算法Java,java,algorithm,matrix,linear-algebra,Java,Algorithm,Matrix,Linear Algebra,我的高斯-乔丹消去法有些问题。它看起来有点过于简单,但在纸面上应该是可行的。它将轴设置为1,考虑到在0的情况下必须执行交换。然后,它将该行减去具有相同轴列索引号的剩余行的值conindex 我在最后的算法中使用了这些方法 行乘法: public static double[] rowMul(double[] row, double scalar) { BigDecimal[] temp = new BigDecimal[row.length]; BigDecimal s = ne

我的高斯-乔丹消去法有些问题。它看起来有点过于简单,但在纸面上应该是可行的。它将轴设置为1,考虑到在0的情况下必须执行交换。然后,它将该行减去具有相同轴列索引号的剩余行的值conindex

我在最后的算法中使用了这些方法

行乘法:

public static double[] rowMul(double[] row, double scalar) {
    BigDecimal[] temp = new BigDecimal[row.length];
    BigDecimal s = new BigDecimal(scalar);
    double[] newrow = new double[row.length];

    for (int i = 0; i < row.length; i++) {
        temp[i] = new BigDecimal(row[i]).multiply(s);
        newrow[i] = temp[i].doubleValue();
    }
    return newrow;
}
它不知何故跳过了左边3 x 3方阵的中间列并返回

1.0 0.375 0.0 0.625 
0.0 1.75  0.0 2.25 
0.0 1.5   1.0 2.5 
预期结果是:

1.0 0.0 0.0 0.14286
0.0 1.0 0.0 1.28571
0.0 0.0 1.0 0.57143
有人能帮我找到我一定忽略了的东西吗。我只是希望这没什么明显的!谢谢你的麻烦。

mat[j]=subtractRowmat[j],rowMulmat[I],mat[j][I]

这似乎是错误的。有了它,mat[j][i]的新值是mat[j][i]-mat[i][i]*mat[j][i],这是!=0.

我想应该是这样

mat[j]=减去rowmat[j],rowMulmat[i],mat[j][i]/mat[i][i]

有了它,mat[j][i]的新值是mat[j][i]-mat[i][i]*mat[j][i]/mat[i][i],实际上是0

此外:

如果mat[行][行]==0{

这对双打来说是有风险的。我会建议像数学这样的东西。absmat[row][row]<1e-9


我希望这会有帮助。

请包括预期结果我还没有得到你问题的答案,但你似乎以一种非常奇怪的方式混合了双精度和大十进制。尝试用这两种类型中的任何一种来做代数的问题是,它们都不能精确地表示1/3这样的简单分数,因此应该给你提供行操作实际上,0没有。我建议尝试寻找有理数的实现。好的,谢谢你的反应。我会调查的。我必须承认这是一些让我有点不安的事情。我想我知道一种实现有理数的方法,特别是在除法中。但不知怎的,我感觉不出是什么导致了这种情况fic问题。尽管如此,我还是会把你的建议放在心上。再次感谢你的回复。我会仔细考虑的!再次感谢你的回复,特别是如果mat[row][row]==0{更改是我没有考虑的。但是mat[I][I]在那个阶段,allready应该是1吗?所以我不明白你加上这个除法是什么意思?你能再澄清一下吗?再次感谢!哦,我错过了mat[I]=rowDivmat[I],mat[I][I];。在这一点上,我什么都没有。老实说,我从来没有见过一个版本你迭代fori=0;。forj=0;…我一直使用fori=0;。forj=I+1;…结果是一个三角形矩阵。然后我做了第二次扫描,但使用了不同的循环:fori=n-1;I>=0;I-forj=I-1;j>=0;j-来获得对角矩阵。谢谢你,知道你有什么帮助吗我非常喜欢你们的双扫法,因为你们的双扫法适用于任何地方,效果很好!一个完美的结果。干杯!!
public static boolean checkPivot(double[][] mat, int row) {
    if (mat[row][row] == 0) {
        return true;
    } else {
        return false;
    }
}
// Keeps track of the number of swaps performed to secure a finite solution.
private static int swapcount = 0;

// Mind giving the index value. So row starting from 0 up instead of 1!
public static double[][] swapRow(double[][] mat, int row) {
    swapcount++;
    if (swapcount >= mat.length - row) {
        System.out.println("no possible combinations.");
        swapcount = 0;
        return mat;
    }
    double[] temp = mat[row];
    for (int i = row; i < mat.length - 1; i++) {
        mat[i] = mat[i + 1];
    }
    mat[mat.length - 1] = temp;
    if (checkPivot(mat, row) == true) {
        mat = swapRow(mat, row);
    }
    swapcount = 0;
    return mat;
}
public static double[][] gaussJordan(double[][] matrix) {
    double[][] mat = matrix;
    int m = mat.length;
    for (int i = 0; i < m; i++) {
        if (checkPivot(mat, i) == true) {
            mat = swapRow(mat, i);
        }
        mat[i] = rowDiv(mat[i], mat[i][i]);
        for (int j = 0; j < m; j++) {
            if (j == i) {
                j++;
            } else {
                mat[j] = subtractRow(mat[j], rowMul(mat[i], mat[j][i]));
            }
        }
    }
    return mat;
}
private static double[][] elim = {
    {-20,-10,10,-10},
    {  0, 10,-5, 10},
    {-10, 10,15, 20}
};
1.0 0.375 0.0 0.625 
0.0 1.75  0.0 2.25 
0.0 1.5   1.0 2.5 
1.0 0.0 0.0 0.14286
0.0 1.0 0.0 1.28571
0.0 0.0 1.0 0.57143