0 Daumen
1,6k Aufrufe

Ich bin mir gerade eine Programm am Basteln Das die Fläche eines Sphärisches Dreiecks errechnet.

Leider bekomme ich nur Negativ Werte raus und die Ergebnis sehen auch nicht wirklich aus als wenn sie stimmen würden. Ich Kontrolliere mit einer Normalen Dreiecks Flächen Berechnung und der Wert sollte ja etwa dran kommen.

Programm Code könnte etwas irritieren. Die Frage in ein Programmier Forum zu posten ist was banal da es ein Mathe Problem ist. ich kann es aber auch wieder in Reguläre Mathe ausdrücke umwandeln falls jemand Probleme hat.

// sind aus kommentierte teile. So habe ich es zuerst versucht.

gegeben:

$Alat = 51.078875;

$Alng = 6.317525;

$Blat = 50.953745;

$Blng = 6.643854;

$Clat = 50.768479;

$Clng = 6.502682;

$R = 6378.137; //in KM. Ja wir sind auf der Erdkugel


Berechnung:

    $a = acos((sin($Alat)*sin($Blat)) + ((cos($Alat)*cos($Blat)) * cos($Blng-$Alng)));

    $b = acos((sin($Clat)*sin($Blat)) + ((cos($Clat)*cos($Blat)) * cos($Blng-$Clng)));

    $c = acos((sin($Clat)*sin($Alat)) + ((cos($Clat)*cos($Alat)) * cos($Alng-$Clng)));

//    $cosalpha = cos($a) / (cos($b) * cos($c) + sin($b) * sin($c));

//    $cosbeta = cos($b) / (cos($a) * cos($c) + sin($a) * sin($c));

//    $cosgamma = cos($c) / (cos($a) * cos($b) + sin($a) * sin($b));

//    $alpha = acos($cosalpha);

//    $beta = acos($cosbeta);

//    $gamma = acos($cosgamma);


      $alpha = asin(sinh($a));

      $beta = asin(sinh($b));

      $gamma = asin(sinh($c));


//    $exzess = $alpha + $beta + $gamma - M_PI;

//    $flaeche = $exzess * $R * $R;


    $exzess = $alpha + $beta + $gamma - 180;

    $flaeche = $exzess * ((M_PI * $R * $R) / 180);

Avatar von

Erkelenz - Bergheim - Düren in NRW sind die Koordinaten :)


hast Du darauf geachtet, dass Du die ganze Zeit im Bogenmaß rechnest, bzw. die Formeln entsprechend angepasst, falls Du mit dem Gradmaß arbeitest? Weisst Du womit Dein Programm standardmässig rechnet, bzw. hast Du da mal eine Kontrollausgabe für einen Testwert berechnet?

Ich weiss klingt banal, aber manchmal liegt es an solchen Dingen... Ist mir schon zu oft passiert.

Gruss

ok ich hab die 360 / 2*PI vergessen. ist es den jetzt echt real das ein Sphärisches Dreieck ca. 500% mehr Fläche hat als ungekrümmt?

Je nach Größe und Krümmung ist das unterschiedlich. Ich kann mir aber nicht vorstellen, dass es bei den Entfernungen hier so richtig ist. Gibt doch Deine Koordinaten einfach mal in einen entsprechenden Rechner ein und hol Dir so ein Kontrollergebnis.

Ich dreh gleich druch!

ich hab den hier gefunden:

http://www.arndt-bruenner.de/mathe/scripts/sphaerischr.htm

ich setzte ein:

a:0.27
b:0.22
c:0.34

erhalte:

alpha: 0.926041386759
beta: 0.712746135708
gamma: 1.53276696819

Stimmt mit mir überein.

Für den Exzess nimmt er jetzt die gleiche Formel wie ich:

e = alpha + beta + gamma - pi

er hat raus  0,000009036740458601145

ich habe aber 0.02996183707 raus

meine Fläche geht total daneben seine ist sehr nah zum Dreieck Flächen Ergebnis. Das ist doch nur + und - wo rechne ich da falsch? Ich habs mit dem Programm und Taschenrechner gerechnet.

Hmm, was setzt Du für pi ein? Hast Du den aktuellen Code mal für mich? Ist das C oder Powershell, oder ...?

das ist php. Beim PI hab ich auch schon gezweifelt und es mir mal schwarz auf weis geben lassen.

code:

    $R = 6378.137;


    $a = round(acos((sin($Alat)*sin($Blat)) + ((cos($Alat)*cos($Blat)) * cos($Blng-$Alng))), 6);

    $b = round(acos((sin($Clat)*sin($Blat)) + ((cos($Clat)*cos($Blat)) * cos($Blng-$Clng))), 6);

    $c = round(acos((sin($Clat)*sin($Alat)) + ((cos($Clat)*cos($Alat)) * cos($Alng-$Clng))), 6);

$alpha = round(acos((cos($a)-cos($b) * cos($c)) / (sin($c) * sin($b))) * (360 / (2 * M_PI)),2 );

 $beta = round(acos((cos($b)-cos($c) * cos($a)) / (sin($c) * sin($a))) * (360 / (2 * M_PI)),2 );

$gamma = round(acos((cos($c)-cos($a) * cos($b)) / (sin($a) * sin($b))) * (360 / (2 * M_PI)),2 );

  $pi = M_PI;

    $exzess = $alpha + $beta + $gamma - $pi;

    $flaeche = $exzess * $R * $R;

ausgabe:

PI: 3.14159265359
exzess:178.568407346 //mir dem roten teil
exzess:0.0284073464102 //ohne dem roten teil
a:0.268471
b:0.218815
c:0.342482
alpha: 52.17
beta: 40.27
gamma: 89.27

alpha: 0.91
beta: 0.7
gamma: 1.56

flaeche 7264275593.01

flaeche 1155628.79378

Hmm, sind alpha, beta und gamma bei Dir auf 2 Stellen gerundet? Das wuerde den Unterschied beim Exzess erklären. Arbeitest Du mit double oder wie hast Du die Winkel definiert?

Der rote Teil ist nur sinnvoll, wenn PHP nicht in Bogenmaß rechnet, aber Deine werden scheinen ja zu stimmen, wenn Du den Teil weglässt, also wirds wohl Bogenmaß sein.

also errundet ja auf 4 standard mässig ich habs mal auf 6 gestellt und es kommt immer noch
exzess:0.0296583464102

und nicht 0,000009036740458601145

wenn ich alpha + beta + gamma - pi rechne 

0,91+0,7+1,56-3,14

kann da ja nix mit 0,000000... raus kommen da muss noch irgendwo was sein? was ich nicht verstehe.

Ich habe die gleichen a, b und c Werte wie Du eingegeben. Ich komme aber auf folgenden Output:

alpha = acos((cos(a)-cos(b)·cos(c))/(sin(c)·sin(b)))
      = 0,9160540579674722

beta = acos((cos(b)-cos(c)·cos(a))/(sin(c)·sin(a)))
     = 0,7027465191345859

gamma = acos((cos(c)-cos(a)·cos(b))/(sin(a)·sin(b)))
      = 1,5228011132281938

e = alpha + beta + gamma - pi
  = 0,000009036740458601145

Der weicht ja schon etwas von Deinem ab.

OKOK ich hab es noch mal mit Taschenrechner durchgerechnet. Ist also ab jetzt ein Programmier Problem :/

hab die rounds raus genommen komme aber immer noch nicht annähernd hin.

Danke für deine Hilfe.

Die Frage, die sich mir stellt ist, wie genau ist die Berechnung am Anfang in Deinem Programm. Falls Du da nicht genug Stellen hinter dem Komma berechnest, kann sich das als Fehler am anderen Ende stark genug auswirken, so dass Dein Ergebnis nicht passt.

Du hast ja auch schon einmal alpha beta und gamma mit nur 2 Stellen angegeben. Da es am Ende aber zu 0,00000x kommen muss, spielen da eine Menge mehr stellen eine Rolle, vor allem wenn noch mit dem Quadrat des Erdradius multipliziert wird.

ohne rundungen bin ich jetzt auf:
exzess:0.029658675828

a:0.26847126318
b:0.218814708136
c:0.342482411302
alpha: 0.910484765506
beta: 0.702766233712
gamma: 1.5580003302

Hehe, hast Du mal die Eingabe in dem Rechner überprüft? Du gibst ja a, b und c in Bogenmaß an, oder? Standardmässig steht es da auf Grad. Irgendwo passt da noch etwas mit den Einheiten nicht...

1 Antwort

+1 Daumen
 
Beste Antwort

Ich habe auf beiliegender Excel-Tabelle mit deinen Koordinaten gerechnet, einmal mit deinen Formeln so wie ursprünglich in der Frage angegeben (rote Fläche), und einmal mit dem Satz des L'Huilier (Exzess berechnet aus den Seitenlängen, grüne Fläche).

Bei der roten Fläche sind schon die Winkel unplausibel, und auch ich habe eine negative Fläche erhalten.

Bei der grünen Fläche scheint mir das Ergebnis plausibel zu sein.

Wenn man ein großes Dreieck eingibt, mit den Eckpunkten 0° N 0° E, Nordpol und 0° N 90° E, also ein Achtel der Erdoberfläche (Total 510 Mio km^2), rechnet die Tabelle tatsächlich einen Achtel davon.

Dreieck.xlsx (11 kb)

Erklärt findet man den Herrn Huilier z.B. unter http://numerical.recipes/whp/HuiliersTheorem.pdf

Avatar von 43 k

DANKE so funktioniert es :) 
ich hatte von vorne rein ein Problem was gar nicht aufgefallen ist. Ich habe die Länge mit Grad und nicht in RAD berechnet. Was bei kleinen Außenkanten scheinbar nicht aufgefallen ist :/ (snoop24 hatte da recht) ich hab eben dann mal eine grössere Fläche begutachtet und da ist es mir aufgefallen.
Werde mir das mal angewöhnen RAD/DEGREE in den variablen mit an zu geben.

Das sieht bei mir jetzt so aus:

    $R = 6371; // Radius of earth in KM. alternativ 6378.137

    $U = 40.000; // umfang in km


    $AlatRad = $Alat * M_PI / 180;

    $AlngRad = $Alng * M_PI / 180;


    $BlatRad = $Blat * M_PI / 180;

    $BlngRad = $Blng * M_PI / 180;


    $ClatRad = $Clat * M_PI / 180;

    $ClngRad = $Clng * M_PI / 180;


    $aRad = acos((sin($AlatRad)*sin($BlatRad)) + ((cos($AlatRad) * cos($BlatRad)) * cos($BlngRad - $AlngRad)));

    $bRad = acos((sin($ClatRad)*sin($BlatRad)) + ((cos($ClatRad) * cos($BlatRad)) * cos($BlngRad - $ClngRad)));

    $cRad = acos((sin($ClatRad)*sin($AlatRad)) + ((cos($ClatRad) * cos($AlatRad)) * cos($AlngRad - $ClngRad)));


    $alength = $aRad * $R;  // KM

    $blength = $bRad * $R;  // KM

    $clength = $cRad * $R;  // KM



    $s = ($aRad + $bRad + $cRad) / 2;


    //http://numerical.recipes/whp/HuiliersTheorem.pdf

    $exzess = 4 * atan(sqrt(tan($s / 2) * tan(($s - $aRad) / 2) * tan(($s - $bRad) / 2) * tan(($s - $cRad) / 2)));

    $volume = $exzess * $R * $R;

Wenn man die Flächenformel (in Abhängigkeit des Erdradius und der drei Koordinaten) an einem Stück schreibt, also nicht so wie ein Programmierer, dann wird sie groß. Ich habe mal die FullSimplify-Prozedur von Mathematica angeworfen um zu schauen, ob es eine Vereinfachung findet.

Den Umfang U brauchst du in deinem Programm nicht.

--> Mathematica hat in ein paar Stunden keine Vereinfachung der Formel gefunden.

freut mich, dass Du jetzt eine Lösung hast. Habe mir gerade noch einmal meinen ersten Kommentar durchgelesen, weil Du schriebst ich hätte recht gehabt. Musste schmunzeln, wegen der Zeit die wir da später noch gegrübelt haben.

Naja, positiv gesehen: sowas passiert einem dafür nicht zweimal.

Gruß

Die Formel für die Fläche (in Quadratkilometern) schaut also so aus:

Bild Mathematik

Die Formel für die Fläche (in Quadratkilometern) schaut also so aus:

Bild Mathematik

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community