Método de promedio vectorial para medir la dirección del viento

Hace un año, describí una estación meteorológica con un instrumento de medición para la dirección y velocidad del viento. En base a la experiencia de dos temporadas operativas, se hicieron algunos cambios y mejoras, que se describen parcialmente allí además del texto principal.

Uno de estos cambios se refiere al cálculo de la dirección promedio del viento. Para mi sorpresa, no encontré nada sensato sobre este tema en la Web, solo en uno de los foros las personas mismas casi pensaron en el método de promediación de vectores (pero solo casi, no resolvieron el problema en términos generales). Por lo tanto, me pareció útil poner este tema en una publicación separada; de repente, alguien más será útil. El método se puede usar para promediar cualquier cantidad de vectores, no solo viento o corriente.

Tenga en cuenta que el método canónico para realizar mediciones meteorológicas del viento es el siguiente: promediar el vector (es decir, tanto la velocidad como la dirección) durante 10 minutos (en Rusia y en la mayoría de los países del mundo se acepta de esa manera, dicen, en los EE. UU. Y algunos otros países de manera diferente). En este caso, las mediciones se toman a una altura de 10 m de la superficie de la Tierra. Asegurar todo esto bajo condiciones de rodilla es bastante difícil: uno no puede alcanzar una altura de 10 m en espacio abierto (no construya una torre especial, lejos de casas y árboles que distorsionen el flujo del viento), y la temperatura con humedad debe, por el contrario, medirse a la sombra y cerca desde la superficie El sensor portátil se transforma de un dispositivo compacto en un sistema de medición completo (ver foto del territorio de una estación meteorológica en la ciudad de Kirov).

Estación meteorológica en Kirov

Y el resultado, un promedio de 10 minutos, será poco informativo. Cerca de la superficie, el viento es mucho más fuerte que en altitud, en 10 minutos puede cambiar la velocidad y la dirección veinte veces, y la información sobre estas ráfagas es mucho más informativa para la persona promedio que el valor promedio. Permítame recordarle que el sensor de velocidad aquí muestra el valor máximo de cuatro mediciones por ciclo de 8 s, y resultó ser la elección correcta (de hecho, obtuvimos un sensor de ondulación en lugar del sensor de velocidad promedio).

Pero la veleta resultó ser más malhumorada que el sensor de velocidad. Según el algoritmo inicial de mi estación meteorológica (que se seleccionó en función del máximo ahorro de energía posible), la dirección se midió una vez por ciclo, es decir, incluso las pulsaciones no funcionaron: hubo muestras aleatorias del proceso continuo de colgar la veleta de ida y vuelta con una frecuencia mucho mayor que una vez cada 8 y Más de 16 segundos.

Por lo tanto, se decidió promediar la dirección del vector de velocidad por ciclo, tomando mediciones cada dos segundos y calculando el promedio. Y la cuestión no es que pueda resolverse con una media patada: los valores de dirección no forman una matriz uniforme de números que se puedan agregar y dividir directamente (una palabra es un vector, no un escalar de mierda). Por lo general, se da un ejemplo con valores de 1 grado y 359 grados: es fácil darse cuenta de que en promedio será exactamente 360 ​​(o 0, sin diferencia), pero la aritmética ordinaria dará el número 180 grados.

No hay necesidad de inventar nada, todo ya ha sido inventado antes que usted. El problema se resuelve mediante el método de promediación de vectores, bien conocido por aquellos que se ocuparon de mediciones de vientos o corrientes. El método es esencialmente muy simple: dado que no podemos promediar directamente los ángulos, entonces promediemos las proyecciones del vector en el eje de coordenadas, que, por definición, es un valor escalar, es decir, puede someterse a la aritmética ordinaria sin ninguna duda.

Las proyecciones del vector de viento actual W '(el apóstrofe desempeña el papel de un superíndice) en los ejes X e Y son wx = Wa • cos (α) y wy = Wa • sin (α), donde Wa es el módulo del vector (valor de velocidad), y α - el valor del ángulo entre el vector y el eje de coordenadas cero. Si promediamos estos valores de las proyecciones, y luego convertimos los promedios nuevamente en un vector, entonces obtenemos el verdadero valor de la velocidad y dirección promedio del viento.

Nota para particularmente corrosivo
Para un promedio completamente correcto de esta manera, es necesario que el valor de Wa (valor de velocidad) se mida estrictamente simultáneamente con el valor del ángulo. En la práctica, esto debe ser monitoreado solo si los períodos de fluctuaciones significativas en la amplitud del flujo son menores o comparables con el tiempo de las mediciones. Para el viento (y para casi todos los casos del flujo natural de agua), generalmente no es necesario monitorear, ya que el tiempo de medición para nosotros es un máximo de una fracción de segundo, y las pulsaciones significativas del viento, por supuesto, duran más. Podemos descuidar las inhomogeneidades de alta frecuencia del flujo, porque no afectan nada: la inercia de los cuerpos físicos reales (incluidos los sensores) es mucho mayor que estas inhomogeneidades, y simplemente no las sentiremos: un trozo de papel temblará, pero nada más. En casos extremos, saldrán como un pequeño ruido aleatorio que no afecta significativamente la calidad de las mediciones.

Este maravilloso método (llamémoslo promedio de vectores completo) tiene un inconveniente cardinal desde un punto de vista práctico: en ausencia de un sujeto de medición (es decir, cuando hay una calma total, que es un caso bastante común), da un resultado matemáticamente incorrecto: dado que la velocidad del viento es cero, entonces y ambas proyecciones son iguales a cero, lo que no puede ser (ya que sin y cos son funciones complementarias). Más precisamente, puede ser, pero es fundamentalmente imposible extraer información de tal situación. ¿Qué quieres mostrar en la pantalla? Para ser honesto, todavía no sé la forma correcta de solucionar esta situación (en los medidores de flujo que una vez diseñé, los ciclos promedio fueron horas, y se creía que al menos se produciría algo de agitación).

Pero en nuestro caso, la tarea, afortunadamente, es más fácil: no necesitamos promediar la velocidad, y podemos hacerlo con proyecciones únicas del vector, sin tener en cuenta la magnitud de su módulo. En otras palabras, uno puede operar con senos y cosenos puros, que nunca toman cero a la vez: incluso cuando no hay viento, una veleta congelada en bienes raíces muestra alguna dirección. Llamamos a este método un vector promedio simplificado de una dirección (tal vez tiene algún nombre oficial, pero no lo sé).

Ahora solo había una dificultad: convertir los valores de proyección promedio calculados nuevamente en el valor del ángulo. Para esto, generalmente se usa la función α = arctan (sin (α) / cos (α)), pero si calculamos a través de las funciones trigonométricas inversas, entonces es más simple tomar simplemente arcos (cos (α)) (o arcsin (sin (α)), de todos modos), y para complementar este resultado para obtener un círculo completo (es decir, de 0 a 359 grados), analizando los signos de las proyecciones, aún debe hacerlo en cualquier caso: todas las funciones inversas dan el resultado dentro de un semicírculo (de 0 a 180 o de -90 a +90). (Ver UPD sobre esto al final del artículo).

Formalizamos todo lo anterior en un algoritmo real (con referencia a Arduino). Para comenzar, leeremos las indicaciones de dirección no en cada ciclo, sino en cada medición (después del valor de la frecuencia del anemómetro). Convertiremos el resultado en código Gray (en nuestro país fue designado como wind_Gray de tipo byte, vea esa publicación ) a código binario ordinario y, al igual que la frecuencia del anemómetro, lo colocaremos en una matriz global, que declararemos como wDirAvr [4], donde 4 es el número de mediciones en el ciclo. No pintaremos la conversión del código Gray de cuatro dígitos a código binario; esto se puede hacer de varias maneras a discreción del programador y se describe en cualquier referencia.

Este código binario tomará valores de 0 a 15, y estamos de acuerdo en que contaremos los ángulos, no como geógrafos / topógrafos / navegadores desplazados, sino como personas normales que estudiaron trigonometría en la escuela, en sentido antihorario. Es decir, si el norte corresponde al valor cero, entonces 90 grados no es el este, como en los "desplazados", sino el oeste. Como tenemos 16 gradaciones de dirección, necesitamos multiplicar el valor del código por 22.5 (360/16) para obtener la dirección en grados ordinarios del arco.

Ahora, el algoritmo real de promediado vectorial simplificado de la dirección a partir de 4 valores de código:

. . . . . float wSin=0; // sin float wCos=0; // cos float wind_Rad; //   for (byte i=0; i<4; i++){ wind_Rad= ((float(wDirAvr[i])*22.5)*M_PI/180); //   wSin=wSin+sin(wind_Rad);//    sin wCos=wCos+cos(wind_Rad);//    cos } // wSin=wSin/4;// sin –    ,   wCos=wCos/4; // cos wind_Rad = acos(wCos); //     arccos if (wSin<0) wind_Rad=2*M_PI-wind_Rad; //   sin int wind_G = round ((wind_Rad*180/M_PI)/22.5); //    0-15 . . . . . 

La última línea convertimos el promedio, expresado en radianes, al promedio, expresado en nuestro código de 0 a 15. Luego puede convertirlo nuevamente al código Gray, luego ni siquiera tiene que cambiar el programa en el módulo principal para mostrar la dirección.

Aquí, de hecho, está todo el algoritmo. Tenía miedo de que el cálculo de cosenos-arcosinas desacelere el débil controlador (para los tiempos de 32 bits de hoy), pero no pasó nada: se tragó el código sin siquiera parpadear ... un LED, probablemente.

UPD : Para el autor, el algoritmo funciona de esta forma durante varios meses sin fallas. Sin embargo, los comentaristas me llevaron a un posible error, aunque extremadamente improbable en la práctica: si los datos contienen dos grupos de mediciones que están aproximadamente separados 180 grados entre sí cerca del valor del coseno cero (es decir, alrededor de 90 y 270 grados), entonces el algoritmo producirá un error valor Para evitarlo, en lugar de acos (), utilice la función atan2 (wSin, wCos), que proporciona inmediatamente el resultado correcto teniendo en cuenta los signos seno y coseno (gracias aamonster por la ayuda). La línea donde se calcula el valor promedio de wSin no debe comentarse, y la línea ajustada para el signo wSin no es necesaria. En su lugar, debe insertar la conversión a valores positivos del ángulo (ya que atan2 proporciona valores de pi a -pi):
 if (wind_Rad<0) wind_Rad=2*M_PI+wind_Rad; 

Source: https://habr.com/ru/post/es423243/


All Articles