質問

私はいくつかの座標変換を書いている(具体的にJoukoswky変換を、ウィキペディアJoukowskyはの変換します)、と私はパフォーマンスに興味があるんだけど、もちろん精度の。私は、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;

ここで、カイとZメンバーとして二重xおよびyを有する単純な構造である。

2)錯体の使用

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

Zとカイは複雑です。そこ興味深い部分は確かにケース1))は約20%(高速であるということですが、精度は逆変換後に複雑なバック正確な数を与えながら、コンマの後に第三進数のエラーを与え、悪いです。 だから、問題はCOS(ATAN2)、罪(ATAN2)の上にいるのですか?しかし、それであれば、どのように複雑な処理する?

編集:ただ、これは私が念頭に置いていたことを正確に問題がなかったことを考え出しました。私は

のように、一般的な変換を行う必要があります

Z = 1/2 *(カイ^ N +(1 /カイ)^ 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);

またZ.y上のバグを修正ます。

役に立ちましたか?

解決

I)が1で、それが

でなければならないことだと思います
Z.y = 0.5*(si*sq - si/sq);
あなたは本当に良いパフォーマンスをしたい場合は、

あなたは、第一原理に戻って、

ということを観察することもできます
1/(a+ib) = (a-ib)/(a*a+b*b)

ノーsqrt()atan2()またはcos()またはsin()ます。

他のヒント

を考えるr = sqrt(x*x+y*y)ます:

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

この方法は、より正確かつ迅速にする必要があり、それを計算します。

あなたはZ.xとZ.yための式にこれらの値を接続すると、あなただけの基本的な算術演算で残されますので、平方根が、同様に相殺されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top