2010-04-05 55 views
0

我正在寫一些座標變換(更具體地說是Joukoswky變換,Wikipedia Joukowsky Transform),我對性能感興趣,但當然精確。我試圖做的方法有兩種座標變換:cos(atan2(y,x))與使用複數的精度<double>,C++

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; 

在Ch和Z是具有結構簡單雙x和y作爲成員。

2)使用複雜:

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

其中Z和志是複雜的。有趣的部分是確實情況1)更快(約20%),但精度很差,在逆變換之後的逗號之後的第三個十進制數字中出現錯誤,而複合體會返回確切的數字。 所以,問題在於cos(atan2),sin(atan2)?但是,如果是這樣,複合體如何處理?

編輯:只是發現這不完全是我心中的問題。我必須進行一般轉換,因爲上面的代碼是我想通過這種方式完成的。更確切地說,

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); 

也糾正Z.y.

+0

您是否在問複雜的如何處理計算? – Stephen 2010-04-05 21:30:16

+0

請原諒我的無知。不是'cos(atan2(y,x))== x,sin(atan2(y,x))== y'? (如果x,y被歸一化?) – 2010-04-05 21:37:42

回答

3

我認爲,1)它應該是

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

如果你想你可能想回到第一原則,遵守真正的好表現是

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

沒有sqrt()atan2()cos()sin()

+0

感謝您的回答!這真的是一個愚蠢的錯誤。我使用此表示法,因爲我不得不提高該表達式到n次冪,如 Z = 0.5(卡^ N +(1/CHI)^ N) 所以它成爲 平方= POW(R2,n)的 co = cos(n * atan2(chi.y,chi.x)) 到目前爲止,這是我發現要做到這一點的唯一方法。 – Ivan 2010-04-05 21:51:45

5

鑑於r = sqrt(x*x+y*y)

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

計算這種方式應該是更準確和快速。

當您將這些值插入到Z.x和Z.y的公式中時,平方根也將相互抵消,因此您將只剩下基本的算術運算。

+0

正是我在想什麼。 – 2010-04-05 21:47:23

+0

在明確的情況下,是的,但不是在一般情況下z = 1/5(chi^n +(1/chi)^ n)。我應該更精確,對此感到抱歉 - 我已更正原始帖子。謝謝你的幫助! – Ivan 2010-04-05 21:52:43

相關問題