科学计算中复杂算术的危险

计算科学 线性代数 软件 布拉斯 复数
2021-12-22 03:02:41

复内积有两个由约定决定的不同定义:在 BLAS 中,我找到了例程, , 和, 前两个例程实际上计算(一个假内积!),后两个例程共轭内积中的第一个向量。此外,根据任一定义(共轭),与共轭!此外,正如评论中所指出的,为多值复杂函数选择主值可能取决于约定。u,vu¯TvuTv¯cdotuzdotucdotczdotcuTvuvu,v=v,u¯

我的问题是:这种复杂性是否会对在科学计算中使用复杂算术造成真正的危险?deal.ii 的作者强调了这个问题,他们建议始终将复数拆分为实部和虚部,并仅使用实数算术。但是我从来没有发现拆分方法很方便。例如,考虑时谐麦克斯韦方程组的完美匹配层(PML) 。

除了 FreeFem++ 和 libmesh 之外,大多数开源 FEM 软件似乎都普遍存在使用复数的担忧。但即使对于这两个例外,复数算术的测试也比实数少。

我的最后一个问题是:我们应该总是避免使用复数吗?

2个回答

您说复数算术的问题在于,与实际情况中的一种方法相比,有不同的方法来定义复数向量的标量积。我认为复杂标量积的真正问题是另一个问题,但是,这与您的观察密切相关。

在复数算术中,标量积的参数顺序确实很重要,而在实数算术中则无关紧要。许多算法在复数和实数算术中基本相同,这意味着您只需编写一次它们,然后使用相同的代码进行复数和实数算术。(例如,在 C++ 中,您可以为此目的使用模板。)当您编写完代码后,通常会对其进行测试。要发现某些标量积中的参数排序错误,您必须使用复值测试用例来测试您的代码。

当您有复杂值问题的工作代码时,您通常会免费获得算法的实值代码。当您使用复数值测试用例测试您的代码时,该代码通常对于实数也是正确的。然而,将实值代码转换为复杂代码需要额外的工作。因此,对于实值问题,与复杂值问题相比,只有更多的代码可以工作(并且经过全面测试)。

我的问题是:这种复杂性是否会对在科学计算中使用复杂算术造成真正的危险?

我会用以下方式说“是”。当代码没有针对复值问题进行很好的测试时,代码中出现错误的可能性更高,但这取决于您正在查看的具体代码。当代码经过良好测试时,没有问题。

我的最后一个问题是:我们应该总是避免使用复数吗?

正如已经指出的,有些问题无法用实数解决。例如,计算非对称矩阵的特征值。因此,我们需要复杂的算术。

这篇论文是相关的:

基本复杂函数的分支削减或无事生非的符号位。

http://people.freebsd.org/~das/kahan86branch.pdf