【发布时间】: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