Как рассчитать направление ветра по U и V компонентам ветра в R


У меня есть данные о компонентах ветра U и V, и я хотел бы вычислить направление ветра из этих значений в R.

Я хотел бы закончить с данными о направлении ветра в масштабе 0-360 градусов, с 0° или 360°, указывающими на ветер, дующий на север, 90°, указывающий на ветер, дующий на восток, 180°, указывающий на ветер, дующий на юг, и 270°, указывающий на ветер, дующий на Запад.

Ниже приведены некоторые примеры данных:

> dput(wind)
structure(list(u_ms = c(-3.711, -2.2417, -1.8188, -1.6164, -1.3941, 
-1.0682, -0.57611, -1.5698, -1.4976, -1.3537, -1.0901, -0.60403, 
-0.70812, -0.49045, -0.39849, 0.17875, 0.48356, 1.5082, 1.4219, 
2.5881), v_ms = c(-1.471, -1.6118, -1.6613, -1.7037, -1.7388, 
-1.8748, -1.8359, -1.6766, -1.6994, -1.7505, -1.4947, -0.96283, 
-1.1194, -0.6849, -0.7847, -0.80349, -0.19352, -0.97815, -1.0835, 
-0.81666), u_rad = c(-0.064769155, -0.039125038, -0.031744042, 
-0.028211496, -0.02433163, -0.018643603, -0.010055014, -0.027398173, 
-0.026138045, -0.023626517, -0.01902583, -0.01054231, -0.012359023, 
-0.008559966, -0.006954961, 0.003119775, 0.008439712, 0.02632305, 
0.024816831, 0.045170857), v_rad = c(-0.025673788, -0.028131211, 
-0.028995149, -0.029735168, -0.030347779, -0.032721426, -0.032042493, 
-0.029262184, -0.029660119, -0.030551982, -0.026087431, -0.01680455, 
-0.019537212, -0.011953758, -0.013695596, -0.014023543, -0.00337756, 
-0.017071935, -0.018910639, -0.014253403)), .Names = c("u_ms", 
"v_ms", "u_rad", "v_rad"), class = "data.frame", row.names = c(NA, 
-20L))

Я использовал следующий код, чтобы попробовать и получить направление ветра (столбец td), но я не уверен, что возвращаемые углы являются теми, которые я хочу (например, 0°/360°, указывающие на ветер, дующий на север, 90°, указывающие на ветер, дующий на восток и т. д.).

u = wind$u_rad # u component in radians
v = wind$v_rad # v component in radians

d = (180/pi)*(atan2(u,v))
td = as.matrix(d + 180)
df = cbind(wind, d, td)

> df
       u_ms     v_ms        u_rad       v_rad         d        td
1  -3.71100 -1.47100 -0.064769155 -0.02567379 -111.6228  68.37716
2  -2.24170 -1.61180 -0.039125038 -0.02813121 -125.7164  54.28357
3  -1.81880 -1.66130 -0.031744042 -0.02899515 -132.4087  47.59129
4  -1.61640 -1.70370 -0.028211496 -0.02973517 -136.5062  43.49379
5  -1.39410 -1.73880 -0.024331630 -0.03034778 -141.2788  38.72124
6  -1.06820 -1.87480 -0.018643603 -0.03272143 -150.3269  29.67308
7  -0.57611 -1.83590 -0.010055014 -0.03204249 -162.5780  17.42199
8  -1.56980 -1.67660 -0.027398173 -0.02926218 -136.8842  43.11576
9  -1.49760 -1.69940 -0.026138045 -0.02966012 -138.6118  41.38819
10 -1.35370 -1.75050 -0.023626517 -0.03055198 -142.2844  37.71557
11 -1.09010 -1.49470 -0.019025830 -0.02608743 -143.8963  36.10365
12 -0.60403 -0.96283 -0.010542310 -0.01680455 -147.8980  32.10204
13 -0.70812 -1.11940 -0.012359023 -0.01953721 -147.6830  32.31699
14 -0.49045 -0.68490 -0.008559966 -0.01195376 -144.3939  35.60607
15 -0.39849 -0.78470 -0.006954961 -0.01369560 -153.0774  26.92258
16  0.17875 -0.80349  0.003119775 -0.01402354  167.4578 347.45783
17  0.48356 -0.19352  0.008439712 -0.00337756  111.8112 291.81121
18  1.50820 -0.97815  0.026323050 -0.01707193  122.9656 302.96561
19  1.42190 -1.08350  0.024816831 -0.01891064  127.3077 307.30771
20  2.58810 -0.81666  0.045170857 -0.01425340  107.5128 287.51279
Я был бы признателен за любые советы о том, является ли мой метод правильным, и если нет, то как я мог бы правильно получить желаемые значения направления ветра. В то время как вычисление направления ветра из U и V составляющих ветра с использованием lapply или ifelse было полезно, код сделал работайте с моими данными, и я уверен, что есть более легкий способ получить направление ветра. Большое спасибо!
2 7

2 ответа:

С этим есть три проблемы:

  1. вы не можете преобразовать м/с в радианы. Чтобы ввести компоненты ветра в atan2, Вы должны нормализовать их, но вы не делаете этого, умножая m/s на pi/180 (что вы сделали, чтобы получить u_rad и v_rad). Вы должны сделать колонку абсолютной скорости ветра (sqrt(u_ms^2 + v_ms^2)) и взять atan2(u_ms/wind_abs, v_ms/wind_abs). (также обратите внимание, что atan2 сначала принимает y-компонент - убедитесь, что это то, что вы хотите)
  2. atan2 даст вам ответ в координатах единичного круга, который увеличьте против часовой стрелки и получите ноль на оси X. Вы хотите получить ответ в кардинальных координатах, которые увеличиваются по часовой стрелке и имеют ноль на оси Y. Чтобы преобразовать единичную окружность в кардинальные координаты, необходимо вычесть угол единичной окружности из 90.
  3. Вы должны знать, относится ли информация о ветре к направлению ветра (стандарт для кардинальных координат) или к направлению ветра (стандарт для тригонометрических/векторных операций)

Если вам дано u_ms = = -3.711 и v_ms = -1.471 (на единичном круге он дует вниз и немного влево, поэтому он идет с северо-востока), затем:

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

Затем вы должны преобразовать этот вектор ветра в метеорологическое соглашение о направлении, откуда ветер приходит:

wind_dir_trig_from_degrees = wind_dir_trig_to_degrees + 180 ## 68.38 degrees

Затем вы должны преобразовать этот угол из координат "тригонометрии" в кардинальные координаты:

wind_dir_cardinal = 90 - wind_dir_trig_from_degrees
[1] 21.62284 #From the northeast.

В то время как принятый ответ имеет правильную идею, он имеет недостаток. Как упоминалось в комментариях , не нужно нормализовать компонент u и v, чтобы использовать на них atan2. Недостаток возникает, когда u == v == 0 и wind_abs становятся равными 0. В C# два подразделения вернут бесконечность (в соответствии с IEEE 754) и atan2 вернется Нэн. При не нормализации компонентов atan2(0,0) счастливо возвращается 0. Так что не только нормализация не нужна, она также вводит ошибка.

Обратите внимание, что наиболее распространенной сигнатурой функции atan2 является atan2(y, x) - исключение составляет Microsoft Excel.