【问题标题】:Problem with Forward elimination implementation前向消除实施的问题
【发布时间】:2019-12-04 20:29:06
【问题描述】:

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];
                    }
                }
            }
        }

上面实现的伪代码是:

使用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

代码中的错误在哪里以及如何修复它?

【问题讨论】:

  • 正如您在@PraveenB 的回答中看到的,您对于大小为 N 的线性方程组的增广矩阵不是 N x N,而是 N x N+1。在伪代码的图像中,有一个大 N 和一个小 n,它们不是相同的值。除了这个问题,您应该考虑 A[k, k] == 0 导致 DivideByZeroException。看看旋转。
  • @Petro - 更新了答案。放置调试语句,以便您可以遵循逻辑。

标签: c# .net algorithm linear-equation


【解决方案1】:

您的解决方案中的问题是这一行。在这里,您必须遍历所有列,因此它应该是 j

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

您粘贴的算法适用于方阵 N x N 而不是 N x M,即您的情况( 2 x 3 )。如果是方阵就好了。

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

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);

【讨论】:

  • 这个版本给出了一个超出范围的异常,即使对于 NxN 大小的数组它也不起作用
  • 您必须修改 NxN 的解决方案,因为在这种情况下它将超出边界。这 j
  • 这是一个简单的解决方法,但我希望您尝试一下,而不是直接给您解决方案。
  • 真的不知道要在那里改变什么,任何步骤都会超出范围异常
  • Damien 你还没有阅读整篇文章。它不是 NxN+1 的方阵。
【解决方案2】:

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

        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];
                    }
                }
            }
        }

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 2011-05-04
    • 1970-01-01
    • 2020-04-16
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多