DAS Forum für Enthusiasten

L1 berechnen

L1 berechnen

2 Tage 11 Stunden her - 2 Tage 11 Stunden her
#11807
Es geht um den Lagrangepunkt von zwei beliebigen Körpern mit den Massen M und m im stabilen (Kreis)-Orbit im Abstand bzw Radius D.

Es ist natürlich eine (blitzschnelle) Iteration, für die Darstellung als Kurve geht aber die Umkehrfunktion.

Der Eingbewert ist my = m/(M+m) = 1/(1+M/m) < 0,5 oder my = M/(M+m) = 1/(1+m/M) > 0,5 und der Rückgabewert ist fn_Li(my)=Li/D

function fn_Li(my) {
    //plausi
        if (my > 1) return err("maximal fn_Li(1)"), -999;
        if (my < 0) return err("mindestens fn_Li(0)"), -999;
    // 1. Robuster Startwert (Hill-Radius)
    let li = Math.cbrt(my / 3);
    let li_alt = 0;
    let count = 0;
    // 2. Die Schleife (Konvergenz-Garantie)
    // Wir iterieren, bis die Änderung kleiner als das Maschinen-Epsilon ist
    // oder maximal 10 Mal (für L1 reicht das locker)
    while (Math.abs(li - li_alt) > 1e-17 && count < 100) {
        li_alt = li;
        // Ihr heute verifizierter "Klammer-Marathon"
        // Nutzt Math.cbrt für Vorzeichensicherheit
        let zaehler = my * Math.pow(1 - li, 2);
        let nenner = (li * li) + li * (my - 3) + (3 - 2 * my);
        li = Math.cbrt(zaehler / nenner);
        count++;
    }
//    alert(count);
    return li;
}
Letzte Änderung: 2 Tage 11 Stunden her von Rainer Raisch.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Re: L1 berechnen

1 Tag 21 Stunden her
#11808
Ich sehne mich nach den Zeiten ohne KI herbei.
Niemand ist unantastbar.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

  • FabsOtX
  • FabsOtXs Avatar
  • Offline
  • Forum Meister
  • Forum Meister
  • i.A. aHaBotX a.D.     CC BY-NC 4.0
  • Beiträge: 779
  • Thanks: 41

Re: L1 berechnen

1 Tag 20 Stunden her - 1 Tag 14 Minuten her
#11809

        count++;
    }
//    alert(count);
   
}
Ich muss mir immer alles anschauen können würde es in der Test Version wohl eher so schreiben.
Code:
count++; console.log(count); // Jeder schritt einschließlich Endergebnis } console.log(count); // Nur Endergebnis

Dann im Browser F12 ->Konsole sehr viel informativer als der alert();
Die count Ausgabe ist jetzt nicht so Interessant aber geht halt mit jeden Wert in dem Loop.
NULLIUS IN VERBA

"Zu nah an der Wahrheit
Zu nah am Leben
Zu penetrant um
Ignoriert zu werden" Böhse Onkelz 1996

"Gedankenexperimente beginnen bei mir grundsätzlich im leeren Raum." Ich! Hier, am 18.05.2024 ;)
Letzte Änderung: 1 Tag 14 Minuten her von FabsOtX.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

  • FabsOtX
  • FabsOtXs Avatar
  • Offline
  • Forum Meister
  • Forum Meister
  • i.A. aHaBotX a.D.     CC BY-NC 4.0
  • Beiträge: 779
  • Thanks: 41

Re: L1 berechnen

23 Stunden 57 Minuten her
#11810
Ich sehne mich nach den Zeiten ohne KI herbei.

Warum?

Orginal
Code:
let zaehler = my * Math.pow(1 - li, 2); let nenner = (li * li) + li * (my - 3) + (3 - 2 * my); li = Math.cbrt(zaehler / nenner);

Optimiert
Code:
const my3 = my - 3; const c32my = 3 - 2 * my; let d = 1 - li; li = Math.cbrt((my * d * d) / (li * li + li * my3 + c32my));

Die Original-Version nutzt Math.pow(), was flexibel, aber rechenintensiv ist. Die optimierte Version berechnet Invarianten (Werte, die sich in der Schleife nicht ändern) vorab, was bei großen Datenmengen oder Echtzeit-Visualisierungen die CPU entlastet.

Test:

Zeit (1 Mio. Aufrufe) Org. = 859 ms Opt. = 781 ms
NULLIUS IN VERBA

"Zu nah an der Wahrheit
Zu nah am Leben
Zu penetrant um
Ignoriert zu werden" Böhse Onkelz 1996

"Gedankenexperimente beginnen bei mir grundsätzlich im leeren Raum." Ich! Hier, am 18.05.2024 ;)
Danke von: Rainer Raisch

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Re: L1 berechnen

12 Stunden 25 Minuten her - 12 Stunden 8 Minuten her
#11811
Ich muss mir immer alles anschauen können würde es in der Test Version wohl eher so schreiben.
Ich mag keine Konsole, die stört doch nur. Und wo da etwas außer Fehlern angezeigt wird, habe ich noch nicht herausgefunden. Na das habe ich wohl deaktiviert.
Es ging ja nur um die Fehlerkontrolle, weil er abgestürzt ist, bzw weil er gar nicht aufgerufen wurde und schon vorher abstürzte.
Inzwischen lege ich mir allerdings ein Logbuch an:
    logbuch("loops in fn_Li: "+count);
Optimiert

 
Du hast vollkommen Recht, allerdings dauert es keinen Wimpernschlag, weil meine Formel von Haus aus optimiert ist. und der Anfangswert mit der Daumenformel fast schon eine Punktlandung ist. Da schaue ich mir die Lösung der KI gar nicht so genau an. Aber diese Marotte mit Math.pow kann ich ihm nicht austreiben. Bei jeder Korrektur baut er es wieder ein.
Zeit (1 Mio. Aufrufe) Org. = 859 ms Opt. = 781 ms
Ja wie dicht hast Du die Gesamtkurve denn berechnet. 0,5/1000000
Dafür genügt wie gesagt die Umkehrfunktion ohne Iteration. Das muss man dann nur spiegeln bzw eben in der Grafik y und x vertauschen.
Letzte Änderung: 12 Stunden 8 Minuten her von Rainer Raisch.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.