0

私はいくつかの座標変換 (より具体的には Joukoswky Transform、Wikipedia Joukowsky Transform ) を書いています。私はパフォーマンスに興味がありますが、もちろん精度にも関心があります。私は2つの方法で座標変換をしようとしています:

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 つある単純な構造です。

2) 複雑な使用:

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

Z と chi は複素数です。興味深い部分は、確かにケース 1) の方が高速 (約 20%) ですが、精度が悪く、逆変換後のコンマの後の 3 番目の 10 進数にエラーが発生し、複素数は正確な数値を返します。それで、問題は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

この方法で計算すると、より正確かつ高速になります。

これらの値を Zx と Zy の式に代入すると、平方根も相殺されるため、基本的な算術演算のみが残ります。

于 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 に答える