RegistrierenRegistrieren   LoginLogin   FAQFAQ    SuchenSuchen   
Formel gesucht: Winkelmaß für Erde um die Sonne - Seite 4
Gehe zu Seite Zurück  1, 2, 3, 4 
Neue Frage »
Antworten »
    Foren-Übersicht -> Astronomie
Autor Nachricht
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18115

Beitrag TomS Verfasst am: 26. Nov 2023 16:53    Titel: Antworten mit Zitat

Sorry, jetzt wird's leider ganz falsch:

Code:
var psi_new = (om_t + ecc) * Math.sin(psi);


Es gibt da keine Klammer. So ist's richtig:

Code:
var psi_new = om_t + ecc * Math.sin(psi);


U.a. wg. Tests hatte ich drei völlig verschiedene Lösungsmethoden für das selbe Problem implementiert. Konsistenzchecks sind Pflicht, solltest du auch machen, andernfalls findest du bestimmte Fehler nicht. Und da du keine gute Testdaten im Web findest oder evtl. bei der Übersetzung solcher Daten in Tests nochmal Fehler machst, sind verschiedene Ansätze sinnvoll.

_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
sembel



Anmeldungsdatum: 14.07.2019
Beiträge: 46

Beitrag sembel Verfasst am: 26. Nov 2023 17:36    Titel: Antworten mit Zitat

@TomS , wo hast du den Fehler her? Den habe ich schon gefunden. Dusseligkeitsfehler beim 1:1 umschreiben von Python nach JavaScript deiner letzten Version von contract_Kepler_eq(). Macht sich sofort auf das Ergebnis spürbar. Konsistenzchecks und vieles vieles mehr laufen und kommen noch ... viel Arbeit.

Zum Benchmark
Diese schneidet ein bisschen besser ab als die 1:1 von deinem Python umgeschriebene:
Code:
var prec = 9; // position after decimal point
prec = Math.pow(10, prec);
function contract_Kepler_eq(t) {
  ...
  if (Math.round(psi * prec) == Math.round(psi_check * prec)) {
  ...

Der Unterschied sind wenige Millisekunden (Skriptlaufzeit bei 15 Inputs in Schleife).

Sowie beide besser als:
Code:
  if (psi == psi_check) {

Der Unterschied sind ~10 Millisekunden (Skriptlaufzeit bei 15 Inputs in Schleife).

PS:
- Klammern in Kalkulationen sind hilfreich zum besseren Codelesen.
- Shortcode nur bei Skripten verwenden, die nicht für alle gedacht sind.
- Feste Werte außerhalb von Funktionen / Schleifen vorberechnen.

Edit: Nochmals ein bisschen besser im Benchmark als alles bisherige ist:
Code:
var prec = 9; // position after decimal point
prec = Math.pow(10, (prec * -1));
function contract_Kepler_eq(t) {
  ...
  if (Math.abs(psi - psi_check) < prec) {
  ...


Edit: Zum Rechen-"Fehler" (bei JavaScript)
Dieser tritt immer mit den gleichen 2 Differenz-Werten auf:
Code:
4.440892098500626e-16
0.0000000000000004440892098500626

8.881784197001252e-16
0.0000000000000008881784197001252

Also ist eine Toleranz bis zu 15 Nachkommastellen möglich, um diesen Rechenfehler auszuschließen. Das sollte präzise genug sein.

Die meisten Werte liegen bereits unter 10 Iterationen in der Toleranz. Also kann zusätzlich die Iteration auf 10 gesetzt werden.
sembel



Anmeldungsdatum: 14.07.2019
Beiträge: 46

Beitrag sembel Verfasst am: 29. Nov 2023 17:26    Titel: Antworten mit Zitat

@TomS , die Ergebnisse in JavaScript stimmen mit denen von dir zuletzt geposteten Testdaten und Testergebnissen 1:1 überein. JavaScript hat nur ein paar Nachkommastellen mehr.

Frage: Am Anfang dieses Themas wurde dies schon einmal erwähnt und jetzt wird explizit danach gefragt: Ist eine Funktion möglich, die die Anzahl der vergangenen Sekunden seit dem letzten Perihel (in der Funktion die Starttime) als Ergebnis liefert, wenn der Input eine Gradzahl zwischen 0-360 (eventuell auch Bogenmaß 0-2*Pi) ist? Also im Prinzip in die entgegengesetzte Richtung wie bisher. Kann das hier jemand programmieren? Ist es eine sehr komplexe oder zu komplexe Formel?
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18115

Beitrag TomS Verfasst am: 29. Nov 2023 19:41    Titel: Antworten mit Zitat

sembel hat Folgendes geschrieben:
@TomS , die Ergebnisse in JavaScript stimmen mit denen von dir zuletzt geposteten Testdaten und Testergebnissen 1:1 überein. JavaScript hat nur ein paar Nachkommastellen mehr.

Ich denke, die Genauigkeit hängt nicht von der Programmiersprache ab, höchstens die Ausgabe.

sembel hat Folgendes geschrieben:
Ist eine Funktion möglich, die die Anzahl der vergangenen Sekunden seit dem letzten Perihel (in der Funktion die Starttime) als Ergebnis liefert, wenn der Input eine Gradzahl zwischen 0-360 (eventuell auch Bogenmaß 0-2*Pi) ist? Also im Prinzip in die entgegengesetzte Richtung wie bisher. Kann das hier jemand programmieren? Ist es eine sehr komplexe oder zu komplexe Formel?

Das kannst du selbst Prost

Die notwendigen Formeln stehen im Beitrag vom 21. Nov 2023 13:08, einiges ist schon programmiert.

_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.


Zuletzt bearbeitet von TomS am 29. Nov 2023 21:44, insgesamt einmal bearbeitet
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5044

Beitrag DrStupid Verfasst am: 29. Nov 2023 20:31    Titel: Antworten mit Zitat

TomS hat Folgendes geschrieben:
Ich denke, die Genauigkeit hängt nicht von der Programmiersprache ab, höchstens die Ausgabe.


Doch, das hängt u.a. auch von der Sprache ab. Beispielsweise verwendet JavaScript grundsätzlich immer 64bit Fließkommazahlen gemäß IEEE 754 Standard (auch bekannt als double precision). Da stehen für die signifikanten Ziffern 52 Bit zur Verfügung, was ca. 16 Dezimalziffern entspricht. Andere Fließkommazahlen gibt es in JavaScript nicht.

Es kann aber auch vom Interpreter bzw. Compiler abhängen. Beispielsweise haben ältere Delphi-Versionen den Datentyp Extended noch korrekt als 80bit Fließkommazahl übersetzt. Aktuelle Versionen machen mit demselben Quelltext nur noch ein schnödes Double daraus.
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18115

Beitrag TomS Verfasst am: 29. Nov 2023 21:40    Titel: Antworten mit Zitat

IEEE 754 wird doch heute von fast jeder Hardware unterstützt. Und Programmiersprachen verwenden üblicherweise die Float-Darstellung der Plattform. Das betrifft insbs. die Präzision (im Gegensatz zu Stringdarstellung, inf, nan etc.)

Aber du hast recht, viele Sprachen bieten wohl Konformität zu IEEE 754, garantieren sie jedoch nicht.

_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5044

Beitrag DrStupid Verfasst am: 29. Nov 2023 22:18    Titel: Antworten mit Zitat

TomS hat Folgendes geschrieben:
IEEE 754 wird doch heute von fast jeder Hardware unterstützt. Und Programmiersprachen verwenden üblicherweise die Float-Darstellung der Plattform.


IEEE 754 allein sagt noch nicht viel. Das kann von 16 bis 128 Bit gehen. Ob und wenn ja wie das genutzt wird, hängt vom Compiler bzw. Interpreter ab. Mit dem Typ Extended bei Delphi habe ich ja schon ein Beispiel genannt. Alle x86 FPUs unterstützen das, aber aktuelle Compiler nutzen es nicht und machen stattdessen Double daraus. Bei Programmiersprachen mit Typendeklaration sollte es eigentlich allein vom Programmierer abhängen, welcher Fließkommatyp verwendet wird. Aber leider kann man sich selbst darauf nicht verlassen.
sembel



Anmeldungsdatum: 14.07.2019
Beiträge: 46

Beitrag sembel Verfasst am: 29. Nov 2023 23:50    Titel: Antworten mit Zitat

TomS hat Folgendes geschrieben:
Ich denke, die Genauigkeit hängt nicht von der Programmiersprache ab, höchstens die Ausgabe.

Wie "genau" JavaScript ist kann jeder selbst in der Browser Konsole testen:
Code:
1 - 0.9 // 0.09999999999999998

Das hatte ich weiter vorne schon erklärt (binär versus sichtbar).
Code:
(1 - 0.9) + 0.9 // 1


TomS hat Folgendes geschrieben:
Das kannst du selbst Prost

Die notwendigen Formeln stehen im Beitrag vom 21. Nov 2023 13:08, einiges ist schon programmiert.

Danke, dass du mir so viel zutraust, aber eher nein. Ich blicke da nicht durch. Es ist jedoch nicht so, dass ich mir keine Mühe geben würde. Meine Fähigkeiten dahingehend sind stark begrenzt.

Das einzige was ich gefunden habe, bei dem ein Bogenmaß eingegeben wird ist das hier aus #1.
JavaScript
Code:
var ecc = 0.0167086;
var per_rev = 31558432.539;
var om = ((2 * Math.PI) / per_rev);
var the_orb = {"ecc" : ecc, "om" : om};

// returns the derivative of theta w.r.t. time
function dot_theta(theta, Om, ecc) {
   return (Om / (1 - ecc**2)**(3/2)) * (1 + ecc * Math.cos(theta))**2;
}

var theta = (Math.PI / 2);
console.log(dot_theta(theta, the_orb.om, the_orb.ecc));
// 1.9918027937905798e-7

var theta = (Math.PI);
console.log(dot_theta(theta, the_orb.om, the_orb.ecc));
// 1.9257983876238298e-7

var theta = (Math.PI * 2);
console.log(dot_theta(theta, the_orb.om, the_orb.ecc));
// 2.0589193322651474e-7

Das Ergebnis passt nicht.
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18115

Beitrag TomS Verfasst am: 30. Nov 2023 06:31    Titel: Antworten mit Zitat

Das ist auch nicht der genannte Beitrag.

Bisher ging es um ; jetzt fragst du aber nach .

Wenn ich mich nicht täusche, steht die Lösung in dem genannten Beitrag schon da:



Eine Formel zur Berechnung von psi aus theta u.u. ist ebenfalls genannt.


Weitere Alternativen wären:



Für das Integral findet Wolfram Alpha eine geschlossene Form, der ich aber noch nicht ganz traue.

Alternativ betrachtet man eine Taylorentwicklung des Integranden in e= 0.0167; der nullte Term liefert einfach Eins, alle weiteren Terme sind mit 0.0167, 0.0167^2= 0.00027889 … unterdrückt.

Die dritte Variante ist eine numerische Berechnung des Integrals; da weiß ich nicht, was JavaScript bietet. Das gleiche gilt, wenn man dies als Differentialgleichung auffasst und diese numerisch löst.

_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18115

Beitrag TomS Verfasst am: 30. Nov 2023 10:42    Titel: Antworten mit Zitat

Meine direkte Lösung anbei.

Getestet mittels Berechnung "1000 Zeitpunkte für einen vollständigen Orbit (T1) => daraus Winkel theta => daraus psi => daraus wieder die Zeiten (T2)"
das liefert einen relativen Fehler von T2 bezogen auf T1 < 2e-7, meist eher 1e-8

Code:
# geometry --------------------

# Verschieben des Winkels in eigener Funktion
def shift_angle(alpha):
    ''' set angle to correct interval '''   
    if np.isscalar(alpha):
        if alpha < 0.0:
            alpha += 2*np.pi
        return alpha
    else:
        alpha = np.where(alpha < 0.0, alpha+2*np.pi, alpha)
        alpha[0] = 0.0
        return alpha
   
def calc_theta(psi, ecc):
    ''' returns the angle as a function of te eccentric anomaly psi; currently restricted to [0, 2*pi] '''
    theta = 2 * np.arctan( np.sqrt((1+ecc)/(1-ecc)) * np.tan(psi/2))
    return shift_angle(theta)

# jetzt psi aus theta
def calc_psi(theta, ecc):
    ''' returns the eccentric anomaly psi as a function of the angle theta; currently restricted to [0, 2*pi] '''
    psi = 2 * np.arctan( np.sqrt((1-ecc)/(1+ecc)) * np.tan(theta/2))
    return shift_angle(psi)

# Zeit aus psi
def calc_time(psi, Om, ecc):
    return (psi - ecc * np.sin(psi)) / Om

def calc_radius(theta, a, ecc):
    return a / (1 + ecc * np.cos(theta))

# Test
theta_arr = np.linspace(0, 2*np.pi, 2000)

# so sieht der Aufruf aus
t_arr = calc_time(calc_psi(theta_arr, the_orb.ecc), the_orb.om_rev, the_orb.ecc)

plt.plot(theta_arr, (t_arr - theta_arr/the_orb.om_rev)/(24*3600))
plt.show()

_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
sembel



Anmeldungsdatum: 14.07.2019
Beiträge: 46

Beitrag sembel Verfasst am: 30. Nov 2023 12:31    Titel: Antworten mit Zitat

@TomS, du bist absolut genial, um nicht zu sagen ein Genie, zumindest für mich.

Mittels dem theta(t) Skript (in JavaScript) hatte ich bereits die t-Werte für volle Gradzahlen zwischen 0 und 360 ermittelt. Mit diesen Werten habe ich die Ergebnisse deines t(theta) Skripts gegengeprüft und sie stimmen überein. (also sind entweder beide falsch oder richtig Augenzwinkern )

Ich würde es gerne verstehen, und bis zu einem gewissen Grad gelingt mir das auch, aber dann kommen nur noch Fragezeichen und es verläuft sich in der Ahnungslosigkeit. Es wäre wohl auch sehr aufwendig da einzusteigen, zumindest für mich. Von daher lasse ich es gut sein damit. Du bist der Erfinder, der Werkzeuge erfindet, und ich der Handwerker der sie benutzt, bzw. derjenige, der Ideen hat und Werkzeuge braucht um sie zu verwirklichen.

Vielen Dank auch für dieses Skript!
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18115

Beitrag TomS Verfasst am: 30. Nov 2023 14:58    Titel: Antworten mit Zitat

sembel hat Folgendes geschrieben:
@TomS, du bist absolut genial, um nicht zu sagen ein Genie, zumindest für mich.

Danke.

Aber das ist so ein bisschen das kleine Einmaleins für Physiker.

sembel hat Folgendes geschrieben:
Mittels dem theta(t) Skript (in JavaScript) hatte ich bereits die t-Werte für volle Gradzahlen zwischen 0 und 360 ermittelt. Mit diesen Werten habe ich die Ergebnisse deines t(theta) Skripts gegengeprüft und sie stimmen überein. (also sind entweder beide falsch oder richtig ;) )

Ich habe ja drei unterschiedliche, voneinander unabhängige Methoden am Start, d.h. es sollte schon stimmen.

sembel hat Folgendes geschrieben:
Ich würde es gerne verstehen, und bis zu einem gewissen Grad gelingt mir das auch, aber dann kommen nur noch Fragezeichen und es verläuft sich in der Ahnungslosigkeit.

Du denkst m.E. zu sehr von der Lösung her.

Der Startpunkt der Überlegung ist eben nicht "Ellipse, dazu noch eine Gleichung", das ganze fängt viel früher an. Und wenn man es verstehen will, muss man da auch durch, sonst findet man sich in einem Wald voller Formeln wieder.

sembel hat Folgendes geschrieben:
Du bist der Erfinder, der Werkzeuge erfindet …

Nee, ich habe nur ein paar Formeln zusammengesucht.

sembel hat Folgendes geschrieben:
Vielen Dank auch für dieses Skript!

Gerne.

_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
Neue Frage »
Antworten »
    Foren-Übersicht -> Astronomie