13 votos

¿Cómo se calcula el ángulo entre dos vectores expresados en coordenadas esféricas?

Dados dos vectores $u, v \in \mathbb{R}^d$ representados en coordenadas esféricas, ¿existe una fórmula simple para calcular el ángulo entre los dos vectores? Sin pérdida de generalidad, podemos asumir que los vectores $u$ y $v$ tienen norma unitaria.

No estoy seguro de que la siguiente notación sea estándar, pero asumo que el vector $u$ está definido con $\rho = 1$ y los componentes angulares $\theta_1, \ldots, \theta_{d-1}$. Podemos obtener los componentes euclídeos de la siguiente manera: $$u_{x_1} = \cos \theta_1$$ $$u_{x_2} = \sin \theta_1 \cos \theta_2$$ $$\ldots$$ $$u_{x_{d-1}} = \sin \theta_1 \ldots \sin \theta_{d-2} \cos \theta_{d-1}$$ $$u_{x_d} = \sin \theta_1 \ldots \sin \theta_{d-2} \sin \theta_{d-1}.$$

Una forma de encontrar el ángulo es representar los dos vectores en coordenadas euclídeas y calcular el arco coseno del producto punto. ¿Existe una forma más simple?

Como se señaló en los comentarios, ¿hay alguna generalización de la fórmula Haversine?

4voto

Justin Voss Puntos 2407

Aquí hay una idea recursiva que podría funcionar. Deja que $s_1$, $s_2$,..., $s_{n-1}$ sean los senos de los ángulos del primer vector en $S^{n-1}$, $c_1$, ..., los cosenos, y $s'_{\nu}$ y $c'_{\nu}$ los del segundo. Con $p$ siendo el producto escalar, tenemos $p=1$ para $n=1$, $p=c c'+s s'$ para $n=2$ y genéricamente $$p(n)=c_1 c'_1 + s_1 s'_1 p(n-1)$$ donde $p(n-1)$ es el producto escalar de los vectores dados por los ángulos $[\theta_2,...]$ y $[\theta'_2,...]$ en $S^{n-1}$ (es decir, al remover el primer ángulo de cada secuencia).

Esto, por supuesto, todavía requiere todos los senos y cosenos, pero mi idea es simplificar $p(n-2)$ usando la fórmula del semiverseno y esperar que esto reduzca el número de llamadas a funciones trigonométricas.

3voto

j13r Puntos 237

Fórmula simple y alternativa de la derivación de la fórmula de Ralf, sin necesidad de adivinar:

Ángulo entre los vectores: $$\alpha = \arccos\left({{u \cdot v}\over{|u| |v|}}\right)$$ $$u \cdot v = \sum_i u_i v_i $$ en coordenadas hiperesféricas (n+1 dimensiones, por lo tanto, n ángulos): $$u_i(n) = |u| \cos(\theta_i) \prod_{j=1}^{i-1}{\sin(\theta_j)} $$ excepto cuando i=n: $$u_n(n) = |u| \prod_{j=1}^{n}{\sin(\theta_j)} $$ y similar para v (usaré $\phi$ para los ángulos de v).

Con vectores unitarios combinamos las tres fórmulas de la siguiente manera: $$\cos(\alpha) = \sum_{i=1}^{n-1}{\cos(\theta_i)\cos(\phi_i) \prod_{j=1}^{i-1}{\sin(\theta_j)\sin(\phi_j)}} + \prod_{i=1}^{n}{\sin(\theta_j)\sin(\phi_j)} $$ que se puede escribir como una regla recursiva: $$\cos(\alpha)_n = \cos(\theta_{n-1})\cos(\phi_{n-1}) \cos(\alpha)_{n-1} + \prod_{j=1}^{n}{\sin(\theta_j)\sin(\phi_j)} $$

Lo cual es similar a lo que contiene la respuesta de Ralf (se intercambian cos/sin).

0voto

lagerdalek Puntos 123

Tal vez un cambio a una base diferente en coordenadas esféricas podría hacer el problema más sencillo, o incluso llevar a una solución directa. Por ejemplo, si quieres saber el ángulo subtendido por el arco de Nueva York a Cleveland, podrías deslizar las líneas de latitud/longitud hasta que el meridiano pasara por ambas ciudades y una estuviera en el ecuador.

Por supuesto, cuando empiezas con lo que parece ser un enfoque diferente, a menudo te encuentras haciendo la misma aritmética.

0voto

lagerdalek Puntos 123

No nos compliquemos. Podemos asumir que la longitud de cada vector es 1. Calcula las coordenadas (x,y,z) de los vectores, y luego la distancia euclidiana, d, entre ellos. Entonces el ángulo es uno de los ángulos de un triángulo isósceles con dos lados = 1 y un lado = d.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X