# Iterative Berechnung von Bewegungsgleichgungen mit Hilfe eines JAVA-Programms



## Hansi2245 (17. Okt 2022)

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?



```
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();
  
    }
}
}
```


----------



## KonradN (17. Okt 2022)

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


----------



## KonradN (17. Okt 2022)

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.


----------



## Hansi2245 (17. Okt 2022)

Hallo @KonradN,

ich habe es geändert. Vielen Dank für den Hinweis.


----------



## KonradN (17. Okt 2022)

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?


----------



## Jw456 (17. Okt 2022)

KonradN hat gesagt.:


> 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.


das "k" gab es auch schon in der ersten Version.


----------



## Hansi2245 (17. Okt 2022)

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 (17. Okt 2022)

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?



Jw456 hat gesagt.:


> 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.


----------



## Hansi2245 (17. Okt 2022)

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)


----------



## Hansi2245 (17. Okt 2022)

Laut Lösung muss für t=2.22 ein S=-1.076 rauskommen und ein a=-3.2019


----------



## Jw456 (17. Okt 2022)

KonradN hat gesagt.:


> 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.


----------



## Hansi2245 (17. Okt 2022)

Ach Leute, hab das Problem erkannt. Meine Formeln waren falsch. Leider. Trotzdem danke für die Aufmerksamkeit.


----------



## KonradN (17. Okt 2022)

Jw456 hat gesagt.:


> 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!



Hansi2245 hat gesagt.:


> 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 (17. Okt 2022)

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 (17. Okt 2022)

Dann poste ich einmal, was ich so als "Lösung" gebaut habe:



```
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.


----------



## Hansi2245 (17. Okt 2022)

Vielen Dank Euch allen.


----------

