【问题标题】:My method isn't working? What's the issue [closed]我的方法不行?有什么问题[关闭]
【发布时间】:2021-03-09 03:31:51
【问题描述】:

下面的代码是我的“消除方法”,它是关于高斯算法的。我正在努力理解为什么我的消除方法不起作用。其他 2 个(表示旋转的 pivotisiere 和表示求解方法的 loese)工作得非常好。我整天都坐在这里尝试编写代码,但没有找到解决方案,如果有任何帮助,我会很高兴。

该方法应该如何工作:矩阵对角线下方的数字需要转换为“0”,并且与 0(包括向量)在同一行中的其余数字需要相应地转换为好吧。

【问题讨论】:

  • 您是否尝试过使用调试器?使用高斯消除可能会做错很多事情。
  • 你的线性方程是什么?
  • 第一次发布所有足够的代码?
  • 好吧,你写的正是你所期望的,这已经很好了。你得到了什么?
  • @priyranjan 从他在given parameter 下写的内容来看,我认为7x +17y+29z=107-26y-46z=-386-6y-16z=-2520

标签: java arrays algorithm matrix gauss


【解决方案1】:

我无法解决您的问题,但您的代码中有一些逻辑错误。您没有使用数组的给定参数迭代数组 matrix 。在我的示例方法 printMatrix 中看看如何正确操作。

例如,您的代码从不使用变量z

还有一种更简单的方法来初始化多维数组。请看一下我的示例方法 getExampleAgetExampleB

package test;

public class Static {
    public static long[][] getExampleA() {
        long[][] matrix = new long [3][3];
        matrix[0][0] = 7; matrix[0][1] = 17; matrix[0][2] = 29;
        matrix[1][0] = 0; matrix[1][1] = -26; matrix[1][2] = -46;
        matrix[2][0] = 0; matrix[2][1] = -6; matrix[2][2] = -16;
        return matrix;
    }
    
    public static long[][] getExampleB() {
        long[][] matrix = {{7, 17, 29}, {0, -26, -46}, {0, -6, -16}};
        return matrix;
    }
    
    public static void printMatrix(long[][] matrix) {
        for(int i = 0; i < matrix.length; i++) {
            for(int j = 0; j < matrix[i].length; j++) {
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println("");
        }
        System.out.println("");
    }
    
    public static void main(String[] args) {
        printMatrix(getExampleA());
        printMatrix(getExampleB());
    }
}

【讨论】:

    【解决方案2】:

    如果我使用 LCM(最小公倍数)来计算因子,我得到的结果仍然正确(和整数!!!)但仍然与测试用例相差 2 倍:

    lcm(26,6) = 78
    
    78/6 = 13
    78/26 = 3
    

    然后我得到

    13*16 - 3*46 = 70
    13*186 - 3*386 = 1260
    

    这与预期的解决方案完全相同,但相差 2 倍。取决于测试用例的编写方式,这可能会通过或不会通过。

    无论如何,我认为在这里使用整数数学并确保不会发生舍入是很重要的。


    所以,在我看来,如果您只使用 26*6 而不是 lcm,则可以考虑因素 2:

    26*6 = 156
    
    156/6 = 23 (obviously)
    156/26 = 6 (obviously)
    

    然后我得到

    26*16 - 6*46 = 140
    26*186 - 6*386 = 2520
    

    所以换句话说,你只是被期望,而不是这样做:

    matrix[i][j] -= faktor * matrix[position][j]; 
    

    matrix[i][j] = matrix[i][j]*matrix[position][position] - matrix[i][position]*matrix[position][j];
    

    您未通过测试用例,因为您盲目地使用浮点数学,而没有考虑必须使用整数这一事实。

    【讨论】:

    • 嘿,所以你基本上是通过另一个计算解决了它?我可以试试底部的那个而不是你说的上面那个是吗?也非常感谢您的帮助
    • @EgZoShift 是的,只使用底部的,这似乎是预期的。
    • @EgZoShift 这不是真的不同的计算,但它确保你的 faktor 是一个整数。它还通过缩放你减去的东西来做到这一点。
    • 好的,所以如果我使用底部的,那么它会计算我的最后一个 0,这就是我想要的,比如 matrix[2][1] = 0 但我的 matrix[2][2] = 416 而不是-140
    • @EgZoShift 我相信你可以弄清楚,也许代码是错误的,我很难处理索引。这个想法是:而不是a - (a/b)*b = 0 使用b*a-a*b =0
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多