Question

J'écris une transformations de coordonnées (plus précisément la Joukoswky Transformer, Wikipédia Joukowsky Transformer ), et je suis intéressé par la performance, mais la précision du cours. Je suis en train de faire les transformations de coordonnées de deux façons:

1) Calcul des parties réelles et complexes séparés, en utilisant la double précision, comme ci-dessous:

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;

où chi et Z sont des structures simples avec des doubles x et y en tant que membres.

2) en utilisant le complexe:

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

Où Z et chi sont complexes. Il partie intéressante est que effectivement le cas 1) est plus rapide (environ 20%), mais la précision est mauvaise, ce qui donne une erreur dans le troisième nombre décimal après la virgule après la transformation inverse, alors que le complexe rend le nombre exact. Donc, le problème est sur le cos (atan2), sin (atan2)? Mais si elle est, comment gère le complexe?

EDIT: Tout compris que ce n'était pas exactement la question que j'avais à l'esprit. Je dois faire la transformation générale, comme

Z = 1/2 * (chi ^ n + (1 / chi) ^ n), et jusqu'à présent, le code était au-dessus de la façon dont je l'ai pensé à le faire. Plus précisément,

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

corriger aussi le bug sur Z.y.

Était-ce utile?

La solution

Je pense que 1) il devrait être

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

Si vous voulez vraiment une bonne performance, vous pouvez revenir aux principes de base et d'observer que

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

Non sqrt(), atan2() ou cos() ou sin().

Autres conseils

Compte tenu r = sqrt(x*x+y*y):

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

Le calcul de cette façon devrait être plus précis et plus rapide.

Lorsque vous branchez ces valeurs dans les formules pour Z.x et Z.y, la racine carrée annulera aussi bien, de sorte que vous serez à gauche avec seulement des opérations arithmétiques de base.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top