Te sugerimos que revises esta solución en un entorno controlado antes de pasarlo a producción, un saludo.
Solución:
Hay tres problemas con esto:
- No se puede convertir m/s a radianes. Para introducir componentes de viento en
atan2
, debe normalizarlos, pero no lo hace multiplicando m/s porpi/180
(que hiciste para conseguiru_rad
yv_rad
). Debes hacer una columna de la velocidad del viento absoluta (sqrt(u_ms^2 + v_ms^2)
) y tomaratan2(u_ms/wind_abs, v_ms/wind_abs)
. (también tenga en cuenta que atan2 toma el componente y primero; asegúrese de que eso es lo que desea) atan2
le dará una respuesta en las coordenadas del círculo unitario, que aumentan en sentido antihorario y tienen un cero en el eje x. Desea una respuesta en coordenadas cardinales que aumentan en el sentido de las agujas del reloj y tienen un cero en el eje y. Para convertir el círculo unitario en coordenadas cardinales, debe restar el ángulo del círculo unitario de 90.- Debe saber si la información del viento se refiere a la dirección de la que proviene el viento (estándar para coordenadas cardinales) o la dirección en la que sopla el viento (estándar para operaciones trigonométricas/vectoriales)
si te dan u_ms = = -3.711
y v_ms = -1.471
(en el círculo unitario sopla hacia abajo y ligeramente hacia la izquierda, por lo que viene del noreste), luego:
wind_abs = sqrt(u_ms^2 + v_ms^2)
wind_dir_trig_to = atan2(u_ms/wind_abs, v_ms/wind_abs)
wind_dir_trig_to_degrees = wind_dir_trig_to * 180/pi ## -111.6 degrees
Luego debes convertir este vector de viento a la convención meteorológica de la dirección de donde viene el viento:
wind_dir_trig_from_degrees = wind_dir_trig_to_degrees + 180 ## 68.38 degrees
Luego debe convertir ese ángulo de coordenadas “trigonométricas” a coordenadas cardinales:
wind_dir_cardinal = 90 - wind_dir_trig_from_degrees
[1] 21.62284 #From the northeast.
Si bien la respuesta aceptada tiene la idea correcta, tiene un defecto. Como se menciona en los comentarios, no es necesario normalizar el componente u y v para usar atan2
en ellos. El defecto viene cuando u == v == 0
y wind_abs
se convierte en 0. En C#, las dos divisiones devolverán infinito (de conformidad con IEEE 754) y atan2
devolverá NaN. Cuando no se normalizan los componentes atan2(0,0)
felizmente regresa 0
. Por lo tanto, no solo no es necesario normalizar, sino que también introduce un error.
Tenga en cuenta también que la firma de función más común de atan2
es atan2(y, x)
— Microsoft Excel es una excepción.
En Python:
Dir=np.mod(180+np.rad2deg(np.arctan2(U, V)),360)
Esto conduce a un viento del Sur (180 grados) para un [0,1] vector, un viento del Norte (0 grados) para un [0,-1] vector, un viento del Sudoeste (225 grados) para un [1,1] vector:
U
Out[86]:
array([[ 0. ],
[ 0. ],
[ 1. ],
[-3.47]])
V
Out[87]:
array([[ 1. ],
[-1. ],
[ 1. ],
[-1.47]])
np.mod(180+np.rad2deg(np.arctan2(U, V)),360)
Out[89]:
array([[180. ],
[ 0. ],
[225. ],
[ 67.04097233]])
Puntuaciones y reseñas
Tienes la opción de corroborar nuestra tarea ejecutando un comentario o dejando una valoración te damos las gracias.