Pregunta

Estoy escribiendo algunas transformaciones de coordenadas (más específicamente la Joukoswky Transform, Wikipedia Joukowsky Transform ), y estoy interesado en el rendimiento, pero la precisión de curso. Estoy tratando de hacer lo transformaciones de coordenadas de dos maneras:

1) Cálculo de las partes reales y complejos en separada, usando doble precisión, como a continuación:

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;

donde chi y Z son estructuras simples con doble x e y como miembros.

2) Uso de complejo:

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

Donde Z y chi son complejos. Hay parte interesante es que, efectivamente, el caso 1) es más rápido (aproximadamente 20%), pero la precisión es malo, que da un error en el tercer número decimal después de la coma después de la transformada inversa, mientras que el complejo te devuelven el número exacto. Por lo tanto, el problema está en el cos (atan2), sin (atan2)? Pero si es así, cómo maneja complejos que?

EDIT: acabo de descubrir que esto no era exactamente la pregunta que tenía en mente. Tengo que hacer la transformación general, como

Z = 1/2 * (chi ^ n + (1 / chi) ^ n), y hasta ahora el código anterior era la manera que he descubierto para hacerlo. Más precisamente,

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

Además de corregir el error en Z.y.

¿Fue útil?

Solución

Creo que en 1) debe ser

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

Si quieres realmente buena actuación es posible que desee volver a los primeros principios y observar que

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

No se sqrt(), atan2() o cos() o sin().

Otros consejos

r = sqrt(x*x+y*y) Teniendo en cuenta:

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

El cálculo de esta manera debe ser más preciso y más rápido.

Al conectar estos valores en las fórmulas para Z.x y Z.y, la raíz cuadrada, se cancelará a cabo, así, por lo que le dejó con operaciones aritméticas básicas única.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top