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>";

?>

Commentaar

Inloggen wachtwoord vergeten? Aanmelden