如何计算参数(z1z2⋯zn)arg⁡(z1z2⋯zn)尽量减少结果错误?

计算科学 数字 复分析
2021-11-30 21:52:16

如标题所示,哪种方法最适合数值计算: arg(z1z2zn)

方法一:可以先计算再计算Z=z1z2znarg(Z)

方法2:使用属性arg(z1z2zn)=arg(z1)++arg(zn)

或者也许是别的什么?

3个回答

正如 Brian Borchers 指出的那样,这个问题只对以下因素有意义2π. 我假设你想要一个答案[0,2π)然后。

如果量级真的有很大的对比|z1|,,|zn|在您查看的数字中,由于取消错误,您可能会得到一些虚假的结果。在这种情况下,可以说先计算所有参数然后添加结果可能会更好,因为产品的大小甚至不是您关心的。另一方面,您可以通过采用z1=i,z2==zn=eiϵ对于非常小的ϵ,并且所有这些数字都具有相同的大小。因此,根据输入的性质,这可能是一个折腾。您可能想要使用成对求和或更好的Kahan summation,这两者都可以显着提高大和的准确性。

无论您选择如何解决问题,自己衡量结果总是比互联网上陌生人的建议更好。程序herbgrind是一个用于查找浮点表达式哪里出错的工具。您还可以尝试使用诸如GMP之类的任意精度浮点运算库来检查一种方法相对于另一种方法的效果。

因为arg环绕在2π,问题是病态的。你可以得到一个前向错误2π(当参数的总和接近于2π) 的后向误差接近 0。这对于您提出的两种方法都是正确的。

总而言之,该论点工作得更快,微积分误差更小。我认为这是最好的方式。

如果我们执行产品Z=z1×z2×...×zn错误将是:

dZ=z2z3...zndz1+z1z3....zndz2+...+z1z2...zn1dzn

我们得出结论:

dZZ(1/z1+1/z2+...1/zn)dz

在哪里dz是每个因素的近似误差。

论据中的错误Z将与此误差成正比。

如果我们对参数求和,错误将是:

darg(Z)=k=1ndzkndz