【问题标题】:Matrix Inverse in Visual BasicVisual Basic 中的矩阵求逆
【发布时间】:2021-04-02 14:29:23
【问题描述】:

我正在编写一个程序来使用 Datagridview 对 n 变量(方程组)执行 Newton Raphson 方法。我的问题是确定雅可比矩阵的逆矩阵。我已经在互联网上搜索以找到解决方案,但直到现在才真正得到它,所以如果有人可以帮助我,我将非常感激。提前致谢。

【问题讨论】:

  • 请记住,如果您要计算x = inverse(A) . y,则可以等效地求解线性系统y = A . x。可能更容易找到或编写代码来求解线性方程组,而不是计算逆。
  • 来自 Math.NET Numerics 的 Linear Equation Systems 有帮助吗?
  • 非常感谢。我从未使用过 Math.NET 数字。但是,似乎这会有所帮助。非常感谢。

标签: vb.net visual-studio math matrix datagridview


【解决方案1】:

如果您要求推荐一个库,这在 Stack Overflow 中显然是题外话。但是下面我提到了一些常用的算法;这可以帮助你找到或写下你需要的东西。不过,我不建议您编写任何东西,除非您真的想这样做,因为要正确使用这些算法可能会很棘手。如果你决定写点东西,我推荐 QR 方法,因为它最容易写,虽然理论有点微妙。

首先你真的需要计算逆吗?例如,如果您需要做的是计算

x = inv(J)*y

那么将这个问题处理为更快更准确

solve J*x = y for x

下面的所有方法都将 J 分解为其他矩阵,对此可以完成此解决方案。实现分解的好包也将具有执行解决方案的代码。

如果你真的真的需要逆运算,最好的方法是求解,一次一列

J*K = I for K, where I is the identity matrix

LU分解

这可能是此处描述的算法中最快的,但也是最不准确的。重要的一点是该算法必须包括(部分)旋转,否则它将不适用于所有可逆矩阵,例如它将在旋转 90 度时失败。 你得到的是 J 的因式分解:

J = P*L*U
where P is a permutation matrix, 
L lower triangular, 
U upper triangular

因此,分解后,为了求解 x,我们需要执行三个步骤,每个步骤都很简单,并且每个步骤都可以就地完成(即所有 x 可以是同一个变量)

Solve P*x1 = y for x1
Solve L*x2 = x1 for x2
Solve U*x = x2 for x

二维码分解

这可能比 LU 慢一些,但更准确。从概念上讲,这将 J 分解为

J = Q*R

其中 Q 是正交的,R 是上三角的。然而,正如通常实现的那样,您实际上将 y 和 J 传递给例程,它返回 R(在 J 中)和 Q'*y(在传递的 y 中),所以要求解 x,您只需要求解

R*x = y

鉴于 R 是上三角形,这很容易。

SVD(奇异值分解)

这是最准确的,但也是最慢的。此外,与其他人不同的是,即使 J 是奇异的,您也可以取得进展(您可以计算应用于 y 的“广义逆”)。

我建议阅读此内容,但建议不要自己实施。

简而言之,你将 J 分解为

J = U*S*V' 

其中 U 和 V 是正交的,S 是对角线的。

当然,还有许多其他方法可以解决这个问题。例如,如果您的矩阵非常大(以数千为单位),那么使用迭代方法可能会更快,特别是如果它们是稀疏的(很多零)。

【讨论】:

  • 非常感谢您的澄清 dmuir。现在改为计算逆矩阵,我发现我可以轻松使用其他非常好的方法。其中之一是高斯消除白衣旋转。非常感谢。
  • 如果您的问题已经解决,请考虑accepting the answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多