0

我正在编写一些坐标变换(更具体地说是 Joukoswky 变换,维基百科 Joukowsky 变换),我对性能感兴趣,但当然对精度感兴趣。我正在尝试以两种方式进行坐标转换:

1) 分别计算实部和复部,使用双精度,如下:

double r2 = chi.x*chi.x + chi.y*chi.y;

//double sq = pow(r2,-0.5*n) + pow(r2,0.5*n); //slow!!!
double sq = sqrt(r2); //way faster!
double co = cos(atan2(chi.y,chi.x));
double si = sin(atan2(chi.y,chi.x));

Z.x = 0.5*(co*sq + co/sq);
Z.y = 0.5*si*sq;

其中 chi 和 Z 是具有双 x 和 y 作为成员的简单结构。

2)使用复杂:

Z = 0.5 * (chi + (1.0 / chi));

其中 Z 和 chi 是复数。有趣的是,情况 1) 确实更快(大约 20%),但精度很差,逆变换后逗号后的第三个小数会出现错误,而复数会返回确切的数字。那么,问题出在 cos(atan2)、sin(atan2) 上吗?但如果是的话,综合体如何处理呢?

编辑:刚刚发现这并不是我想到的问题。我必须做一般的转变,因为

Z = 1/2*(chi^n + (1/chi)^n),到目前为止,上面的代码是我想办法做到的。更确切地说,

    double sq = pow(sqrt(r2),n); //way faster!
double co = cos(n*atan2(chi.y,chi.x));
double si = sin(n*atan2(chi.y,chi.x));

Z.x = 0.5*(co*sq + co/sq);
Z.y = 0.5*(si*sq - sq/si);

还纠正了 Zy 上的错误

4

2 回答 2

5

给定r = sqrt(x*x+y*y)

cos(atan2(y,x)) == x/r
sin(atan2(y,x)) == y/r

Calculating it this way should be more accurate and faster.

When you plug these values into the formulas for Z.x and Z.y, the square root will cancel out as well, so you'll be left with only basic arithmetic operations.

于 2010-04-05T21:37:12.627 回答
3

我认为在 1)它应该是

Z.y = 0.5*(si*sq - si/sq);

如果你想要真正好的表现,你可能想回到第一原则并遵守

1/(a+ib) = (a-ib)/(a*a+b*b)

sqrt()atan2()cos()sin()

于 2010-04-05T21:32:07.740 回答