Intergralrechnung (Zeit)



  • Hallo zusammen,

    ich hoffe ich mach mich jetzt nicht lächerlich aber mir fehlt bei meinem Problem der "zündende" Gedanke. Da ich kein Abitur habe (Realschulabschluss) fehlt mir auch ein wenig das Wissen über Integralrechnung.

    Wie auch immer, ich habe folgende Formel:

    Xn = X(0) + ∫(v/R)t

    "X(0)" ist dabei der Initialwert von "X". Die Werte für "v" und "R" (R ist eine Konstante) habe ich auch. Ebenso die Zeit die seit dem letzten Aufruf der Funktion vergangen ist:

    static double X = 0;
    const double R = 1.12345;
    double new_val(double velocity, double time_since_last_call) {
    
        X += (velocity / R); // so einfach ist es aber nicht wegen der Zeit...
        return X;
    }
    

    Bin für jeden Tip dankbar.

    Viele Grüsse
    Sven



  • also wenn man bei deiner formel das integral löst, muss man ja nach t (der zeit) intigrieren. da v = a * t ist, ist das ganze integriert (s = ) 1/2 * a * t² also lautet deine gleichung Xn = X(0) 1/R * 1/2 * v * t² wenn da jetzt ein denkfehler drin sein sollte korrigiert mich bitte 😃

    du scheinst da mit globalen-variablen rum zu hantieren. wenn das so in etwa in deinem programm steht. das ist fast nie gut so als tip 😉

    vario-500


  • Mod

    vario-500 schrieb:

    also wenn man bei deiner formel das integral löst, muss man ja nach t (der zeit) intigrieren. da v = a * t ist, ist das ganze integriert (s = ) 1/2 * a * t² also lautet deine gleichung Xn = X(0) 1/R * 1/2 * v * t² wenn da jetzt ein denkfehler drin sein sollte korrigiert mich bitte 😃

    Korrigiere. Wobei ich überhaupt nicht nachvollziehen kann, wie du überhaupt da drauf kommst. Aber du kannst ja schon daran dass v*t² die Dimension Länge*Zeit hat sehen, dass das nicht passt.

    Wenn velocity die aktuelle Geschwindigkeit ist und time_since_last_call eine möglichst kleine Zeit, dann ist in 1. Ordnung:
    X(n) = X(n-1) + velocity/R * time_since_last_call
    Und das macht man dann iterativ von X(n=1) bis zum gesuchten X(n).



  • wenn man v(t) = a * t integriert, komme ich auf s(t) = 1/2 * a * t²
    wobei ich im ersten posting nicht genau verstanden hab, was der initialwert sein soll bzw. was das insgesamt machen soll

    sorry, ich dachte das soll im ersten posting (v/R) dt heißen, was aber nicht tut


  • Mod

    Es geht um numerische Integration. v ist keine Konstante.



  • @SeppJ

    "Xn" bedeutet quasi das "neue X", wobei ich dennoch meine das ich Dich richtig verstehe denn bei

    X(n) = X(n-1).."

    entspricht X(n) beim aktuellen Aufruf der Funktion dem "neuen" X und "X(n-1" quasi dem vorhergehenden Wert von X.

    @vario-500

    Nein für gewöhnlich benutze ich sehr selten globale Variablen, wollte mir nur den ganzen "class ..." Code sparen. Aber gut:

    class C {
    public:
        C();
        void CalculateNewVal(double velocity, double time_since_last_call);
        double GetNewVal() const;
    private:
        double m_X;
        const double m_R;
    };
    
    C::C() : m_X(0), m_R(1.12345) {}
    
    void C::CalculateNewVal(double velocity, double time_since_last_call) {
        m_X += (velocity/m_R) * time_since_last_call;
    }
    
    double C::GetNewVal() const {
        return m_X;
    };
    

    Nochmal @SeppJ;
    so würde ich das nach meinem Verständnis jetzt machen und Du hast recht, bei kleinen Abständen ist das Ok, bei grossen Abständen wird es aber immer ungenauer da "velocity" ja nie konstant ist. Allerdings ist das auch beim "realen" Vorbild (es geht um Inertiale Navigation) auch so...


  • Mod

    schwudde schrieb:

    @SeppJ

    "Xn" bedeutet quasi das "neue X", wobei ich dennoch meine das ich Dich richtig verstehe denn bei

    X(n) = X(n-1).."

    entspricht X(n) beim aktuellen Aufruf der Funktion dem "neuen" X und "X(n-1" quasi dem vorhergehenden Wert von X.

    Da haben wir uns korrekt verstanden. In deinem Programm müsste die Zeile dann

    X += velocity / R * time_since_last_call;
    

    lauten.

    Wobei ich dir wirklich dringend empfehlen würde, das sauberer zu programmieren. Du ärgerst dich hinterher garantiert, wenn du nicht gleich ordentlich arbeitest.

    Nochmal @SeppJ;
    so würde ich das nach meinem Verständnis jetzt machen und Du hast recht, bei kleinen Abständen ist das Ok, bei grossen Abständen wird es aber immer ungenauer da "velocity" ja nie konstant ist. Allerdings ist das auch beim "realen" Vorbild (es geht um Inertiale Navigation) auch so...

    Ich wollte dich bloß warnen, dass du Bescheid weißt. Du könntest, je nach eigenem Anspruch, auch numerisch genauere Verfahren nehmen. In einfachster Ausführung indem du das Verhalten von v glättest (Trapezregel und Co.). Mit mehr Kontext über das Zustandekommen von v kannst du auch gleich bessere Verfahren nutzen. Falls du zum Beispiel physikalische Simulationen machst, entspräche obiger Integrationsschritt der Eulerregel, die ein paar physikalisch unangenehme Eigenschaften hat. Für andere Anwendungen mag dies wiederum egal sein. Aber ich kann dir jetzt keine Vorlesung darüber halten, ich wollte nur sicher gehen, dass du weißt, dass die Welt größer ist.



  • Hab ja gerade erst angefangen mich mit dem Thema zu beschäftigen. Ist ein Hobbyprojekt und rein theoretisch könnte ich mir das auch sparen da ich ein Plugin für einen Simulator schreibe und der mir die Kopordinaten schon fertig "liefern" kann. Aber wäre ja langweilig wenn man nicht selbst auch ein wenig rechnen lässt, auch um den eigenen Horizont zu erweitern.

    Es gibt mehrere Algorithmen um an das Ergebnis von "X" zu kommen, auch welche ohne Integralrechnung (aber mit Matrizen). Dort spielen dann ausser der Geschwindigkeit auch die Beschleunigungen eine Rolle und sind wahrscheinlich auch genauer. Aber möchte mich langsam einarbeiten eben weil mir ein paar mathematische Grundlagen fehlen die ich mir erstmal aneignen muss...

    Auf jeden Fall Danke für die Hilfe, das wird nachher gleich erstmal getestet 🙂



  • X-Plane nutzt intern die Kepler-Faßregel, kann aber öfter integrieren als man als Plugin callbacks bekommt.
    Durch Probieren und "geschicktes Raten" habe ich festgestellt, dass man mit Adams-Bashfort 2.Ordnung am nächsten drankommt. Das bleibt über Stunden stabil.

    Schau dir mal meinen Blogpost und die verlinkten Wikipedia-Artikel an: http://philippmuenzel.de/wordpress/analyzing-how-x-plane-propagates-your-position/

    Philipp



  • Wenn es darum geht, rauszufinden, auf was für einer Kurve sich ein Objekt bewegt, wenn man die Geschwindigkeit in Abhängigkeit der Position und/oder der Zeit gegeben hat, dann ist das ein Anfangswertproblem erster Ordnung. Code zum Lösen solcher Probleme findet man auch, wenn man unter "odinary differential equations" googelt. Wenn ich Google danach frage, finde ich gleich auf der ersten Seite einen Link zu odeint. Vielleicht kannst du das ja einfach nutzen.


Anmelden zum Antworten