Iterative Berechnung von Bewegungsgleichgungen mit Hilfe eines JAVA-Programms

Hansi3899

Aktives Mitglied
Hallo, ich versuche ein Programm zu schreiben mit dessen Hilfe ich mir Werte für den Weg, die Geschwindigkeit und die Beschleunigung berrechne.

Die Ausgabe zeigt aber das ich etwas falsch mache. Ich weiß nicht wieso die Ausgabe bei 25 beginnt und nicht bei 1.

Kann mir jemand einen Tipp geben?


Java:
public class Fallprogramm
{

public static void main (String[] args)
    {
  
    double h=20.00; //[m]
    double k = 0.00281;
  
    double s[]=new double [224];
    //s[0]=0;
  
    double v_neu []=new double [224];
    v_neu[1]=0 ;
  
    double a_neu[]=new double [224];
    //a_neu[0]=0;
  
    double delta_t[]=new double [224];
    delta_t[0]=0;
      
    for (int i=2; i<224.00; i++) {
      
        delta_t[i]=(i+1)/100.00;
        v_neu[i]   =   v_neu[i-1] + (a_neu[i-1]*(delta_t[i]));
        s[i]        =   20.00+v_neu[i-1] + (a_neu[i-1]*(delta_t[i]));
        a_neu[i]        =   -9.81*(1.00-k*(v_neu[i]) * (v_neu[i]));
      
        System.out.printf(i + ". " + "v="+ (v_neu[i])    +"    ");
        System.out.printf(      "a="+ (a_neu[i])    +"    ");
        System.out.printf(      "s="+ (s[i])        +"    ");
        System.out.printf(      "delta_t="+ (delta_t[i])        +"    ");
        System.out.println();
  
    }
}
}
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Code bitte immer in Code-Tags posten - also den Knopf </> oberhalb des Eingabebereiches nutzen! Das vereinfacht das Lesen des Codes deutlich!
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe mal versucht, den Code bei mir zu rekonstruieren (da viele [i] fehlten), aber ein Problem bleibt: In der Zeile:
a_neu[i] = -9.81*(1.00-k*(v_neu) * (v_neu));
Was bitte ist das k? Die Variable k sehe ich nirgends.
 

KonradN

Super-Moderator
Mitarbeiter
Ok, in der geänderten Version sehe ich das k nun. Aber jetzt verstehe ich das Problem gerade nicht - was genau ist an der Ausgabe falsch? Was fängt an einem falschen Wert an?
 

Hansi3899

Aktives Mitglied
Das ist das Problem. Die ersten Werte sind richtig, aber danach ist die Berechnung bei mir jedenfalls falsch. Jetzt werden die Werte für die ersten Schritte wieder angezeigt. Ich löse die Aufagabe mit BlueJ. Der Wert für S muss bei Schritt 224 0 sein. Das Ergebnis wird mir aber nicht geliefert. Leider. Schade.
 

KonradN

Super-Moderator
Mitarbeiter
Aber betrachten wir auch einmal die Formeln:
Was genau willst Du denn abbilden? Wenn Du den Fall eines Objektes abbilden willst, dann ist die Beschleunigung doch immer 9,81. Die Beschleunigung ändert sich ja nicht (bzw. nur in sehr kleinen Bereichen).

Die Geschwindigkeit ist ja Beschleunigung mal Zeit. Und wenn v0 nicht 0 ist, dann hast Du v = v0 + t*a.
Und die Strecke, die zurück gelegt wurde, ist dann t*v oder eben über die Beschleunigung (andere Formel eingesetzt) hast Du dann t*v0+t^2*a.

Oder sollte ich da jetzt irgendwas falsch gesehen haben?

das "k" gab es auch schon in der ersten Version. :)
Die Version die ich in die Zwischenversion kopiert und dann eingefügt hatte, hatte diese Variable nicht, daher habe ich das erwähnt. Und ich sehe da irgendwie keinen Sinn, das weiter zu diskutieren.
 

Hansi3899

Aktives Mitglied
Das ist tatsächlich eine Aufagbe zur Berechnug einer fallenden Objektes - aber mit Luftwiederstand. Daher ist diese Aufgabe mit einer veränderlichen Beschleunigung. a=g(1-kv^2)
 

Jw456

Top Contributor
Die Version die ich in die Zwischenversion kopiert und dann eingefügt hatte, hatte diese Variable nicht, daher habe ich das erwähnt. Und ich sehe da irgendwie keinen Sinn, das weiter zu diskutieren.
Ist nun auch egal, ich habe es gleich am Anfang gleich nach Notepad++ kopiert und da war es da. Ob du es nun glaubst oder nicht ist mir egal.
Auch nicht wichtig. Ich weiss es das reicht. ;)
 

KonradN

Super-Moderator
Mitarbeiter
Ist nun auch egal, ich habe es gleich am Anfang gleich nach Notepad++ kopiert und da war es da. Ob du es nun glaubst oder nicht ist mir egal.
Auch nicht wichtig. Ich weiss es das reicht. ;)
Er hat den Beitrag ggf. mehrfach geändert? Sorry, aber wie für wie blöd hältst Du mich? Ich habe auch die ganze klasse kopiert und es war eben bei mir nicht da. Und daher mein Kommentar. Das müsstest doch selbst Du verstehen, oder? Sorry, aber wenn Du absolut nichts sachliches beitragen kannst, dann lass es doch bitte einfach ganz! Das ist doch hier einfach nur dümmstes Trollen!

Das ist tatsächlich eine Aufagbe zur Berechnug einer fallenden Objektes - aber mit Luftwiederstand. Daher ist diese Aufgabe mit einer veränderlichen Beschleunigung. a=g(1-kv^2)
Ok, das hätte man sehen können ... Aber dann fangen wir einfach einmal an, das alles einmal zu betrachten.

Das Erste, das auffällt: Deine Ausgaben fangen mit falschen Zeitstempeln an - der erste Datensatz, den Du zeigen willst, ist ja t=0 und da ist v=0 und s=20 und a = 9,81.

Das kann man etwas anpassen - Schleife ab 1 und dann delta ist i-1 und nicht i+1.

Dann bekommt man schon einmal die erste Zeile richtig hin:
1. v=0.0 a=-9.81 s=20.0 delta_t=0.0

Dann sind aber die Berechnungen falsch.

Und da kann ich dann abbrechen zu schreiben - du hast es offensichtlich selbst erkannt :)
 

MarvinsDepression

Bekanntes Mitglied
Ich glaube, mit "iterativ" meinst Du, dass nach jedem Zeitinterval dt die Zustände Beschleunigung a, Geschwindigkeit v und Höhe h aus den vorherigen Werten berechnet werden sollen. Wenn dem so ist, benötigst du gar keine Arrays, sondern berechnest in einer Schleife immer a, v und h wie folgt. a = g * (1 - k * v *v), v = v + a * dt; h = h + v * dt und t = t + dt.
Die Schleife wird ausgeführt, solange h > 0 ist.
Vorausgesetzt, dass die Formeln stimmen, sollte dann bei t = 2.24 Schluss sein. Probiers mal.

edit: h und v müssen natürlich vor der schleife richtig initialisiert werden.
 

KonradN

Super-Moderator
Mitarbeiter
Dann poste ich einmal, was ich so als "Lösung" gebaut habe:


Java:
public class Fallprogramm
{
    public static void main (String[] args)
    {

        double h=20.00; //[m]
        double k = 0.00281;
        double anzahlSchrittProS = 10000.0;

        int n = (int) anzahlSchrittProS * 3;

        double s[]=new double [n];
        s[0]=20;

        double v_neu []=new double [n];
        v_neu[0]=0;

        double a_neu[]=new double [n];
        a_neu[0]=-9.81;

        double delta_t[]=new double [n];
        delta_t[0]=0;

        for (int i=1; i<n; i++) {

            delta_t[i]=i/anzahlSchrittProS;
            v_neu[i]   =   v_neu[i-1] + (a_neu[i-1]/anzahlSchrittProS);
            s[i]       =   s[i-1]+v_neu[i]/anzahlSchrittProS;
            a_neu[i]   =   -9.81*(1.00-(k*v_neu[i-1] * v_neu[i-1]));

            System.out.printf(i + ". " + "v="+ (v_neu[i])    +"    ");
            System.out.printf(      "a="+ (a_neu[i])    +"    ");
            System.out.printf(      "s="+ (s[i])        +"    ");
            System.out.printf(      "delta_t="+ (delta_t[i])        +"    ");
            System.out.println();

            if ( s[i] < 0) break;
        }
    }
}

Die anzahlSchritteProS habe ich eingefügt, da die Zeitdauer zwischen zwei Berechnungen wichtig ist bezüglich Genauigkeit. Man kann dies ja einfach mal mit 100, 1000 und 10.000 ausprobieren.


Delta zwischen zwei Schritten ist 1/anzahlSchritteProS Sekunden - daher wird das einfach ein geteilt durch anzahlSchritteProS.

Das Array habe ich beibehalten - Ich habe einen Abbruch bei Strecke negativ - wenn man den Kontrollwert später hat, dann kann man das noch modifizieren.

Und editiert, denn er hat eben meine Enter Taste einfach als Absenden des Posts gewertet.
 

Neue Themen


Oben