VF_Kepler | VD_Kepler | VE_Kepler |
VFx_Kepler | VDx_Kepler | VEx_Kepler |
|
Funktion | Winkelposition eines Himmelskörpers nach dem Zweiten Keplerschen Gesetz |
|
Syntax C/C++ | #include <VFmath.h>
int VF_Kepler( fVector Y, fVector X, ui size, float T, float e );
int VFx_Kepler( fVector Y, fVector X, ui size, float T, float e, float A, float B ); |
C++ VecObj | #include <OptiVec.h>
int vector<T>::Kepler( const vector<T>& X, T t, T e );
int vector<T>::x_Kepler( const vector<T>& X, T t, T e, const T& A, const T& B ); |
Pascal/Delphi | #include <VFmath.h>
function VF_Kepler( Y, X:fVector; size:UIntSize; T, e:Single ): IntBool;
function VFx_Kepler( Y, X:fVector; size:UIntSize; T, e, A, B:Single ): IntBool; |
|
CUDA-Funktion C/C++ | #include <cudaVFmath.h>
int cudaVF_Kepler( fVector d_Y, fVector d_X, ui size, float T, float e );
int cusdVF_Kepler( fVector d_Y, fVector d_X, ui size, float *d_T, float *d_e );
int cudaVFx_Kepler( fVector d_Y, fVector d_X, ui size, float T, float e, float A, float B );
int cusdVFx_Kepler( fVector d_Y, fVector d_X, ui size, float *d_T, float *d_e, float *d_A, float *d_B );
int VFcu_Kepler( fVector h_Y, fVector h_X, ui size, float T, float e );
int VFxcu_Kepler( fVector h_Y, fVector h_X, ui size, float T, float e, float A, float B );
|
CUDA-Funktion Pascal/Delphi | uses VFmath;
function cudaVF_Kepler( d_Y, d_X:fVector; size:UIntSize; T, e:Single ): IntBool;
function cusdVF_Kepler( d_Y, d_X:fVector; size:UIntSize; d_T, d_e:PSingle ): IntBool;
function cudaVFx_Kepler( d_Y, d_X:fVector; size:UIntSize; T, e, A, B:Single ): IntBool;
function cusdVFx_Kepler( d_Y, d_X:fVector; size:UIntSize; d_T, d_e, d_A, d_B:PSingle ): IntBool;
function VFcu_Kepler( h_Y, h_X:fVector; size:UIntSize; T, e:Single ): IntBool;
function VFxcu_Kepler( h_Y, h_X:fVector; size:UIntSize; T, e, A, B:Single ): IntBool;
|
|
Beschreibung | einfache Versionen: Yi = Kepler( Xi/T, e );
erweiterte Versionen: Yi = Kepler( (A*Xi+B)/T, e );
Die zeitabhängige Winkelposition eines Planeten oder Kometen auf einer elliptischen Bahn wird aus seiner Umlaufzeit T und der Bahn-Exzentrizität e berechnet.
T muss ungleich Null sein; e kann Werte im Bereich 0 ≤ e ≤ 1 annehmen.
Zwar existiert keine analytische Lösung dieses Problems, wohl aber ein sehr effizienter iterativer Algorithmus, der hier eingesetzt wird. Er bleibt bis hinauf zum hyperbolischen Grenzwert e = 1.0 schnell und stabil.
Während die "Lehrbuch-Behandlung" des Problems üblicherweise die reduzierte Zeit m = t/T verwendet, erwartet VF_Kepler die tatsächliche Zeit in X und führt die Division durch die Umlaufzeit intern durch.
Da man wohl nur sehr selten die erhaltene Winkelposition mit einer Konstante skalieren wird, ist - anders als bei den meisten "erweiterten Versionen" mathematischer Funktionen in VectorLib - in der VFx_-Version keine Multiplikation mit C vorgesehen. Diese übernimmt als zusätzliche Parameter daher lediglich A und B.
Diese Funktion darf nicht aufgerufen werden, wenn die FPU auf reduzierte Genauigkeit geschaltet wurde. Andernfalls kann sie in einer unendlichen Schleife hängenbleiben, siehe V_setFPAccuracy. Da manche Versionen von Windows (ab XP x64) die FPU automatisch auf double-Genauigkeit reduzieren, sollte vor dem Aufruf der VE_ -Version sicherheitshalber V_setFPAccuracy( 3 ); gerufen werden. |
|
Fehlerbehandlung | Für negatives e oder e > 1.0 resultiert ein "Invalid parameter(s)"-Fehler und Programm-Abbruch. Für T = 0 werden alle Yi gleich 0 gesetzt. |
|
Rückgabewert | FALSE (0), wenn fehlerfrei, andernfalls TRUE (≠ 0) |
|