【问题标题】:Matrix Inverse using MathNet.Numerics使用 MathNet.Numerics 的矩阵求逆
【发布时间】:2016-11-15 18:27:48
【问题描述】:

我正在编写一些使用 MathNet.Numerics.LinearAlgebra 的 C# 代码,并尝试将结果与教科书示例进行匹配。代码的一部分对 complex32 数组“Ybus”进行反转,并将其存储在另一个数组“Zbus”中:

Matrix<Complex32> Ybus = Matrix<Complex32>.Build.Dense(numBuses, numBuses);

Matrix<Complex32> Zbus = Matrix<Complex32>.Build.Dense(numBuses, numBuses);

我的 Ybus 完全符合书中的例子。

Ybus = j[ -13       5      4      0
            5   -13.5    2.5      2
            4     2.5     -9    2.5
            0       2    2.5   -4.5] 

但是当我做反转时

Zbus = Ybus.Inverse();

zbus的结果都是NaN

而书中的正确结果是这样的:

Zbus = j[ .15     .09    .12    .11
          .09     .15    .12    .13
          .12     .12    .25    .19
          .11     .13    .19    .39] 

有人知道问题可能是什么吗?也许复杂矩阵的求逆有一些问题?

经验教训:不要让你的数组太大,以至于它们有 0 的行,否则相反会爆炸:) ...这是正确的答案:

【问题讨论】:

  • 这对我来说似乎工作正常。我的猜测是你的Ybus 不是你想象的那样。由于您没有显示您是如何填充 Ybus 或您如何确定这是您声称的,所以很难说问题到底是什么。
  • 谢谢。我想我有足够的声誉来发布图片,所以我只是发布了数组元素的控制台打印屏幕截图。奇怪......两个数组之间的唯一区别是逆运算。除非在我的输入数组的引擎盖下有什么奇怪的东西..
  • 顺便说一句,在两种情况下都使用相同的方法/函数来打印数组元素,所以它不像是打印格式或其他什么问题......我认为
  • Oooppppss...对不起大家。我做了一个傻事。我的数组大小是 1 行/列太大,并且由于零行,反向爆炸了。我很抱歉。一切都很好:)

标签: c# matrix math.net


【解决方案1】:

正如 Jason 所说,这似乎工作正常。例如:

var y = Complex32.ImaginaryOne * CreateMatrix.Dense(4, 4, new Complex32[] {-13f,5f,4f,0f,5f,-13.5f,2.5f,2f,4f,2.5f,-9f,2.5f,0f,2f,2.5f,-4.5f});
y.ToString("F3");
y.Inverse().ToString("F3");

提供以下输出,与您的图书结果相匹配(图书中的错误舍入除外):

DenseMatrix 4x4-Complex32
(0.000, -13.000)    (0.000, 5.000)   (0.000, 4.000)   (0.000, 0.000)
  (0.000, 5.000)  (0.000, -13.500)   (0.000, 2.500)   (0.000, 2.000)
  (0.000, 4.000)    (0.000, 2.500)  (0.000, -9.000)   (0.000, 2.500)
  (0.000, 0.000)    (0.000, 2.000)   (0.000, 2.500)  (0.000, -4.500)

DenseMatrix 4x4-Complex32
(0.000, 0.153)  (0.000, 0.097)  (0.000, 0.126)  (0.000, 0.113)
(0.000, 0.097)  (0.000, 0.153)  (0.000, 0.124)  (0.000, 0.137)
(0.000, 0.126)  (0.000, 0.124)  (0.000, 0.256)  (0.000, 0.197)
(0.000, 0.113)  (0.000, 0.137)  (0.000, 0.197)  (0.000, 0.393)

【讨论】:

  • 谢谢克里斯托夫。很抱歉误报。我的数组大小太大,零行导致逆失败。哦,糟糕的四舍五入是我懒得为每个数字输入 8 位数字 :) 顺便说一句,非常感谢这个美妙的 MathNet 库。对于我们这些不想为矩阵求逆之类的东西编写详细代码的工程师来说,这是一个巨大的帮助。
猜你喜欢
  • 2014-05-07
  • 1970-01-01
  • 2013-05-05
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
相关资源
最近更新 更多