【问题标题】:What is the logic behind dividing arrays of double precision matrix to a large number before sending that matrix to a solver?在将该矩阵发送到求解器之前,将双精度矩阵数组划分为一个大数的逻辑是什么?
【发布时间】:2017-01-12 06:26:53
【问题描述】:

在组装矩阵 [A] 时,我得到一个代码,它将 [A]{X}=[B] 中的 [A] 的成员除以 10^4。 然后它还将结果数组除以该数字以计算正确值。 我不明白为什么要这样做?双精度是否对它可以容纳的整数个数有限制?所以这个代码的制造者想要增加浮点数?还是他误解了双精度的概念?

【问题讨论】:

  • 什么是“组装”?代码在哪里?是 C++ 还是 Fortran?为什么两个标签?你会为所有可以遇到矩阵的语言添加标签吗?
  • @VladimirF 组装是指将成员 aij 添加到矩阵 [A] 以及相应的 i 和 j 的过程。
  • 您应该发布一段显示操作的代码。显然,仅仅划分矩阵并不会改变任何可能的病态。
  • 它确实会影响某些浮点运算的准确性。例如。加 1 到。 0000345 比 5e50 加 1 更准确。
  • 这取决于用于计算“结果数组”的算法。即使矩阵A不是病态的,一些矩阵求逆(或求解一组线性方程)稳定性较差的快速算法对非常大或非常小的值的存在很敏感,并且缩放可以减轻在这些情况下舍入错误。在这种情况下所需的比例因子取决于AB - 所以10^4 的固定值似乎是任意的。

标签: c++ arrays matrix fortran


【解决方案1】:

除以某个常数不会提高解的准确性,因为浮点数具有指数表示。因此,按某个大数缩放将在很大程度上影响指数,而在较小程度上影响有效位。 求解时的数值困难部分是添加不同数量级的浮点数,因为这会影响有效位数。但是,这不会受到全局缩放的影响,因为指数的差异保持不变。同样,除法、乘法和平方根也不受影响。

影响解决方案的是使用不同的缩放因子,例如强制对称 A 的对角线为 1。但是,这主要对迭代求解器有帮助,而 cholesky 分解和类似的方法只会受到轻微影响。

【讨论】:

    【解决方案2】:

    没有看到代码很难说。

    有时缩放是出于 IO 原因而不是计算原因。

    如果 '*1E-4' 是单精度的,那么它可能会对传入的数据进行离散化,然后计算可以是双精度的。

    显然查看代码会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多