我正在寫一些座標變換(更具體地說是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.
您是否在問複雜的如何處理計算? –
Stephen
2010-04-05 21:30:16
請原諒我的無知。不是'cos(atan2(y,x))== x,sin(atan2(y,x))== y'? (如果x,y被歸一化?) – 2010-04-05 21:37:42