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


11

复杂的内积具有由惯例决定两个不同的定义:ˉ Ù Ť vü Ť ˉ v。在BLAS中,我找到了例程cdotu,zdotu和cdotc,zdotc。前两个例程实际上计算u T v(伪内积!),而后两个例程将内积中的第一个向量共轭。另外,通过任一定义(共轭Ùv),ü v = ¯ v ù u,vu¯TvuTv¯uTvuvu,v=v,u¯与共轭!此外,正如评论中指出的那样,为多值复杂函数选择主要值可能取决于惯例。

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

在大多数开源FEM软件中,除FreeFem ++和libmesh之外,似乎都普遍担心使用复数。但是,即使有两个例外,复杂算法的测试也比实数少。

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


3
有人真的知道根是ii吗?似乎软件开发人员应该在其回归套件中包括一小套测试示例,以防止在任何冗长的复杂算术计算链中引入不一致的共轭。1ii
hardmath

@hardmath谢谢!我在问题中添加了它。
张慧

@hardmath:“少量测试示例”-在大多数全面实现线性代数运算的库中,可能会有数十或数百个地方取内积。要验证其正确性,将需要进行数百次测试,可能需要花费数月才能正确实施。当然,这并非不可能,而且某些库已经做到了。这只是一项繁重的工作,并不是所有的图书馆作者都对它们的
正确性充满信心

@WolfgangBangerth,也许您可​​以解释Deal.ii的设计决定?
比尔·巴特

3
我们是否应该始终避免使用复数?请不。我相信每个计算科学家都需要非对称特征值分解。
Federico Poloni 2015年

Answers:


2

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

在复杂算术中,标量乘积的参数顺序很重要,而在实际算术中则无所谓。许多算法在复杂运算和实数运算中本质上是相同的,这意味着您只需编写一次,然后对复杂运算和实数运算使用相同的代码。(例如,在C ++中,您可以为此使用模板。)完成编写代码后,通常会对其进行测试。为了发现某些标量产品中参数排序的错误,您必须使用复杂值测试用例来测试代码。

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

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

我会以下列方式说“是”。如果没有针对复杂值问题对代码进行良好的测试,则代码中出现错误的可能性更高,但这取决于您正在查看的具体代码。只要对代码进行良好的测试,就不会有问题。

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.