前向淘汰实施的问题

时间:2019-12-04 20:29:06

标签: c# .net algorithm linear-equation

下面根据C#

public static void ForwardElimination(double[,] AugmentedMatrix)
        {
            int N = AugmentedMatrix.GetLength(0);

            for (int k = 0; k < N; k++)
            {
                for (int i = k + 1; i < N; i++)
                {
                    double factor = AugmentedMatrix[i, k] / AugmentedMatrix[k, k];

                    for (int j = k; j < N; j++)
                    {
                        AugmentedMatrix[i, j] -= factor * AugmentedMatrix[k, j];
                    }
                }
            }
        }

上面实现的伪代码是:

enter image description here

使用NUnit测试

public void TestOfForwardElimination()
        {
            double[,] array = new double[,] { { 1, 2, 3 }, { 4, 5, 6 } };
            NumericalMethods.ForwardElimination(array);
            Assert.That(array, Is.EqualTo(new double[,] { { 1, 2, 3 }, { 0, -3, -6 } }));
        }

有一个错误的值,如下所示

Message: 
      Expected and actual are both <System.Double[2,3]>
      Values differ at index [1,2]
      Expected: -6.0d
      But was:  6.0d

代码哪里有错误以及如何解决?

2 个答案:

答案 0 :(得分:3)

解决方案中的问题是此行。在这里,您必须遍历所有列,因此应为j <= N而不是j

for (int j = k; j <= N; j++)

您粘贴的算法用于方阵N x N而不是N x M,即您的情况(2 x 3)。如果是方形矩阵,则解决方案会很好。

这是@Petro的另一种做法-您可以做的是创建2个变量,一个用于行,一个用于cols。

int m = AugmentedMatrix.GetLength(0);
int n =  AugmentedMatrix.GetLength(1);

对于前2个循环,它将为m;对于最后一个循环,请使用n,即

for (int k = 0; k < m; k++)
for (int i = k + 1; i < m; i++)

最后一个

for (int j = k; j < n; j++)

如果m> n,这也将不起作用。还在每次迭代中打印i,j,k以调试和捕获范围,例如

Console.WriteLine("i:" + i + ", k:" + k + ", factor: " + factor);

答案 1 :(得分:0)

请使用以下代码替换您的代码:

        public static void ForwardElimination(double[,] AugmentedMatrix)
        {
            int N0 = AugmentedMatrix.GetLength(0);
            int N1 = AugmentedMatrix.GetLength(1);

            for (int k = 0; k < N0; k++)
            {
                for (int i = k + 1; i < N1-1; i++)
                {
                    double factor = AugmentedMatrix[i, k] / AugmentedMatrix[k, k];

                    for (int j = k; j < N1; j++)
                    {
                        AugmentedMatrix[i, j] -= factor * AugmentedMatrix[k, j];
                    }
                }
            }
        }