MeanWindAngle
Gepost door Eelke van den Bos op 08-01-2011 20:17.
Kleine functie die de gemiddelde windhoek bepaalt. De berekening van deze gemiddelde hoek is niet zo makkelijk als hij in eerste instantie lijkt. Een simpele rekensom als:
| 1 | Bereken de gemiddelde windrichting wanneer deze een uur vanuit 358 graden waait en een uur vanuit 2 graden. |
De twee bij elkaar op tellen en delen door 2 zal je niet bij het goede antwoord brengen.Het volgende script zal je echter wel het goede antwoord nemen door de volgende berekeningen te maken:
- Bereken van alle hoeken de x waarde.
- Bereken van alle hoeken de y waarde.
- Bereken vervolgens de gemiddelde waarde van alle x en alle y
- Doormiddel van de arctan(gemiddeldy/gemiddeldx) wordt de uiteindelijke hoek verkregen.
Bestanden van dit script
meanwindangle.php
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | <?php
/*
function to calculate mean windangle
eelkevdbos 8 Jan 2011
$s_im to determine the inputmode (d for degrees as default)
$s_om " " outputmode (d for degrees as default)
$i_digits " " precision (1 digits as default)
*/
function meanWindAngle($a_input, $s_im = 'd', $s_om = 'd', $i_digits = 1) {
//check if input is array
if(!is_array($a_input))
return 'N/A';
//count number of elements in array
$i_count = count($a_input);
//convert degrees to radials if needed
if($s_im == 'd')
$a_input = array_map('deg2rad', $a_input);
//convert all elements in array to cos and sin of that element
$a_tocos = array_map('cos', $a_input);
$a_tosin = array_map('sin', $a_input);
//avg of cos and sin arrays
$d_avgocos = array_sum($a_tocos)/$i_count;
$d_avgosin = array_sum($a_tosin)/$i_count;
//get angle by using arc tangent function
$d_result = atan2($d_avgosin, $d_avgocos);
//function atan2 returns -PI to +PI
//for ease of use convert to a range from ZERO to 2*PI
if($d_result < 0)
$d_result += 2*pi();
//return in required format and precision
return round($s_om == 'd' ? rad2deg($d_result):$d_result, $i_digits);
}
//dummy values
$a = array(315, 45, 0, 360, 360, 360);
$b = array_map('deg2rad', $a);
echo "<pre>";
echo "Input:\n";
print_r($a);
echo "\nCalculation with Degrees:\n";
echo meanWindAngle($a);
echo "\n\nInput:\n";
print_r($b);
echo "\n\nCalculation with Radians:\n";
echo meanWindAngle($b, 'r', 'r', 8);
echo "</pre>";
?> |

