【问题标题】:numerical problem after iterations in MatlabMatlab中迭代后的数值问题
【发布时间】:2021-10-21 05:16:11
【问题描述】:

我在 MatLab 上运行仿真时遇到了一些数值问题。请在这里找到问题:

  1. 我发现A*A'(矩阵乘以它的转置)在 MatLab 中不能保证是对称的。我能知道是什么原因吗?因为我将拥有A*C*A',其中C 是一个对称矩阵,我想保持A*C*A' 对称。有什么方法可以修复转置操作产生的数值差异?

  2. 我在 Matlab 中实现了一个 for 循环来计算一组矩阵。每轮中的小数值差异(大约10^(-10))累积到下一次运行,并在大约30轮后最终发散。有什么方法可以修复每次运行的小错误,同时不影响结果。

感谢您阅读我的问题!

【问题讨论】:

  • 如您所见,SO 不支持 LaTeX。请使用代码(附在背包中)来谈论计算。另外,请在每篇文章中只问一个问题。第一个问题this post解释,不是转置导致差异,而是矩阵乘法——上下三角形的运算顺序不同,因此舍入误差也不同。
  • 另一个我不明白的问题,你无法修复错误,如果你知道错误是什么,那么你就不会犯错误。您需要开发对舍入误差具有鲁棒性的算法。这就是使用数值方法的成本。
  • 感谢您的回答!下次我会申请代码。
  • 你现在可以edit你的问题,下次不用等了。

标签: matlab numeric


【解决方案1】:

“我发现 A*A'(矩阵乘以它的转置)在 MatLab 中不能保证是对称的。”

我会对书面声明提出异议。 MATLAB 解析器足够智能,可以识别 A*A' 的操作数相同,并在后台调用 symmetric BLAS 例程来完成这项工作,然后手动将一个三角形复制到另一个生成的三角形中在完全对称的结果中。通常遇到麻烦的地方是编写解析器无法识别的代码。例如,

A = whatever;
B = whatever;
X = A + B;
(A+B) * (A+B)'  <-- MATLAB parser will call generic BLAS routine
X * X'  <-- MATLAB parser will call symmetric BLAS routine

在上面的第一个矩阵乘法中,MATLAB 解析器可能不够聪明,无法识别对称性,因此可以调用通用矩阵乘法 BLAS 例程(例如 dgemm)来完成工作,但不能保证结果是完全对称。但在上面的第二个矩阵乘法中,MATLAB 解析器确实识别对称性并调用对称 BLAS 矩阵乘法例程。

对于 ACA' 的情况,我不知道有任何方法可以强制 MATLAB 生成精确的对称结果。您可以在事后手动将一个生成的三角形复制到另一个三角形中。我想您也可以将 C 分解为 X*X' 两部分,然后重新组合,但这对于您正在尝试做的事情来说似乎工作量太大。

【讨论】:

  • 是的,谢谢您的回答。在描述它时,我试图简化场景。细节在第一个声明之后。我遇到的情况是 'ACA'' 不是对称的。我通过将结果与转置相加并将矩阵总和除以 2 来修复数值错误。
猜你喜欢
  • 1970-01-01
  • 2015-05-08
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多