Differentialgleichung (schiefer Wurf)

Schnelle objektorientierte, kompilierende Programmiersprache.
Lämpi
Beiträge: 57
Registriert: So Mär 23, 2014 4:46 pm

Differentialgleichung (schiefer Wurf)

Beitrag von Lämpi » So Apr 06, 2014 9:56 am

HAllo Leute,

Ich habe folgende Aufgabe bekommen die ich selber irgendwie programmieren sollte,ohne es jedoch richtig durchgenommen zu haben, ich stell jetz mal den Orginaltext rein ist aber ziemlich lange ,sorry.
Aufgabe 4 (Dierentialgleichung Schiefer Wurf):

Mithilfe von Schleifen könnnen auch Dierentialgleichungen
gelost werden. Wir wollen uns nun ein sehr einfaches Beispiel anschauen. Nehmen Sie an, dass ein Ball aus
der Hohe von 1.8 m mit einer Geschwindigkeit von vx = 10 m/s, vy = 10 m/s geworfen wird.. Der Werfer
bende sich bei x=0. Berechnen Sie, wie lange es (ungefähr) dauert, bis der Ball auf den Boden fallt. Gehen
Sie dabei wie folgt vor: Denieren Sie sich einen Vektor für die x-Position, y-Position, x-Geschwindigkeit,
y-Geschwindigkeit und die verstrichene Zeit t. Die Denition der Vektoren funktioniert (hier wurde als Lange
1000 gewählt) wie folgt:

Code: Alles auswählen

 double vx[1000];
 double vy[1000];
 double posX[1000];
 double posY[1000];
 double t[1000];
Sie können auf ein Element eines Vektors zugreifen, indem sie in den eckigen Klammern den entsprechenden
Index schreiben. Z.B. können sie die Anfangswerte wie folgt setzten:

Code: Alles auswählen

 vx[0] = 10;
 vy[0] = 10;
 posX[0] = 0; 
 posY[0] = 1.8;
 t[0] = 0
In der Schleife sollen dann in jedem Schritt die neuen Positionen und Geschwindigkeiten in Abhangigkeit der
alten berechnet werden (verwenden Sie einen Zeitschritt dt = 0.005 s). Fur die x-Position wurde der relevante
Teil in der Schleife so lauten:
1 posX = posX[i-1]+vx*dt;
Wie Sie sehen, haben wir das Problem diskretisiert, also die Berechnung mit einem endlich groen Zeitschritt
durchgeführt, unter der Annahme, dass sich die Geschwindigkeit während dieses Zeitschritts nicht verändert
(diese Annahme ist natürlich im Allgemeinen falsch und daher werden solche Rechnungen fehlerbehaftet sein).
Geben Sie in der Schleife die Positionen und Geschwindigkeiten aus, und ermitteln sie nach der Berechnung
über eine weitere Schleife die verstrichene Zeit, bis der Ball den Boden erreicht.


Im Allgemeinen ist der schiefe Wurf eigentlich kein Problem für mich zu berechnen (heißt auf dem Blatt halt),könntet ihr mir ein wenig starthilfe geben bei der Aufgabe?? was beuten z.B [1000] im ersten code, im Text steht es sei die Länge,aber für was brauch ich das?? Ich weiß überhaupt nicht wie ich das machen soll.

wär sehr cool wenn Ihr mir helfen könntet

lg

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Differentialgleichung (schiefer Wurf)

Beitrag von cloidnerux » So Apr 06, 2014 10:36 am

Im Allgemeinen ist der schiefe Wurf eigentlich kein Problem für mich zu berechnen (heißt auf dem Blatt halt),könntet ihr mir ein wenig starthilfe geben bei der Aufgabe?? was beuten z.B [1000] im ersten code, im Text steht es sei die Länge,aber für was brauch ich das?? Ich weiß überhaupt nicht wie ich das machen soll.
Du hast einen physikalischen Vorgang, der von diversen Größen abhängt, die sich mitunter auch gegenseitig beeinflussen(Differentialgleichungen).
Wenn du die Möglichkeit hast, alle Differentialgleichungen zu ermitteln, zu lösen und zu vereinfachen, dann bekommt man ein paar Formeln heraus, mit denen man auf dem Papier rechnen kann.
Das ist mitunter kompliziert und funktioniert nicht mehr, wenn sich die Beeinflussung ändert(Beschleunigungen usw).
Die andere Möglichkeit ist das System zu "Simulieren", wie es die Aufgabe fordert.
Wenn du kleinschrittig genug den Vorgang simulierst, hier also die Distanzen die der Ball in einem Zeitschritt(dt) zurücklegt, integrierst du quasi die Änderung über die Zeit und bekommst so die Strecke heraus:
Der generelle Zusammenhang:
s(t) ist die Strecke
ds(t)/dt = v(t) Geschwindigkeit
dv(t)/dt = a(t) Beschleunigung
Redundanz macht wiederholen unnötig.
quod erat expectandum

Lämpi
Beiträge: 57
Registriert: So Mär 23, 2014 4:46 pm

Re: Differentialgleichung (schiefer Wurf)

Beitrag von Lämpi » So Apr 06, 2014 10:47 am

Hallo,

ich weiß schon was Differentialgleichungen sind, und wie alles zusammenhängt ,das ist nicht das Problem.
Ich weiß nur nicht wie man so ein Programm dazu schreibt

lg

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Differentialgleichung (schiefer Wurf)

Beitrag von cloidnerux » So Apr 06, 2014 11:02 am

Ich weiß nur nicht wie man so ein Programm dazu schreibt
Deine Aufgabenstellung ist in dem Punkt sehr explizit:
In der Schleife sollen dann in jedem Schritt die neuen Positionen und Geschwindigkeiten in Abhangigkeit der
alten berechnet werden (verwenden Sie einen Zeitschritt dt = 0.005 s). Fur die x-Position wurde der relevante
Teil in der Schleife so lauten:
Für mich wird daraus sofort sowas:

Code: Alles auswählen

for(int i = 1; i < 1000; i++)
{
    vx[i] = DEGRADING_FACOTR * vx[i-1];   //DEGARIDNG_FACTOR = 1
    xpos[i] = xpos[i-1] + vx[i] * dt;     //dt=0.0005
    [...]
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

Lämpi
Beiträge: 57
Registriert: So Mär 23, 2014 4:46 pm

Re: Differentialgleichung (schiefer Wurf)

Beitrag von Lämpi » So Apr 06, 2014 11:14 am

das Problem ist , ich weiß gar nicht wie ich erst Anfangen soll mit dem Programm , z.b wo setzte ich die Anfangswerte ein,bzw was mach ich mit denen??,was bedeuten für mich die [1000], was genau ist da i eigentlich??

ich versteh einfach nicht wie ich das alles zusammenfügen soll.

Lämpi
Beiträge: 57
Registriert: So Mär 23, 2014 4:46 pm

Re: Differentialgleichung (schiefer Wurf)

Beitrag von Lämpi » So Apr 06, 2014 1:38 pm

kann mir jemand helfen bei diesem Programm,evtl.Schritt für Schritt von Anfang an,wer Zeit und lust dazu hat?? Ehrlich gesagt hab ich überhaupt keinen Ansatz

FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Re: Differentialgleichung (schiefer Wurf)

Beitrag von FritziFoppel » So Apr 06, 2014 3:07 pm

Tach,
Zeit und Lust ja, allerdings hab ich das Thema physik gleich nach der letzten Klausur hinter mir gelassen. Ich musste mich auch mit Differentialgleichungen und horizontaler Wurf rumschlagen, leider ist nicht viel hängen geblieben. Vllt löst du die Aufgabe erst mal von Hand und schreibst das ganze hier rein. Vllt hab ich dann ne Ahnung :mrgreen:

Lämpi
Beiträge: 57
Registriert: So Mär 23, 2014 4:46 pm

Re: Differentialgleichung (schiefer Wurf)

Beitrag von Lämpi » So Apr 06, 2014 3:26 pm

Hey Fritzi,

ich glaub das wird nichts bringen,die Formel kennst du ja sicher

x=x0+vx*t
y=y0+vy*t-g*t²/2
vy=vy-g*t
vx=vx

das [] bedeutet ja ,das es sich um ein Array handelt,oder?? ich hab mir das Tutorial durchgelesen drüber ich weiß was ein Array jetzt so halbwegs ist, aber wie ich mit dem arbeiten bzw. programmieren soll hab ich keine Ahnung.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Differentialgleichung (schiefer Wurf)

Beitrag von cloidnerux » So Apr 06, 2014 4:53 pm

das [] bedeutet ja ,das es sich um ein Array handelt,oder?? ich hab mir das Tutorial durchgelesen drüber ich weiß was ein Array jetzt so halbwegs ist, aber wie ich mit dem arbeiten bzw. programmieren soll hab ich keine Ahnung.
Jop, es handelt sich um ein Array.

Es ist schwierig konkrete Probleme zu erklären, wenn die Basics nicht verstanden sind. Ich möchte hier nicht darauf eingehen was ein Array ist, wie man einen Anlegt oder wie man auf ein Element zugreift.

Was das Programm macht, ist die Strecke und Geschwindigkeit als Funktion der Zeit darzustellen. Da aber keine direkte Funktion bekannt ist, wird hier auf eine Zeitdiskrete(es gibt eine minimale Zeiteinheit dt) Näherung zurückgegriffen. Für diese Näherung werden die Funktionswerte s(t) und v(t) für ein t(n) = n * dt in einem Array hinterlegt, man generiert also eine Liste an Funktionswerten zu bekannten Zeitpunkten, aus denen man dann z.B einen Graph erzeugen könnte, so wie man das auch auf Papier machen würde.
Diese Werte werden in den Arrays vx, vx, posX, posY gespeichert, wobei x und y die X- und Y-Komponenten der zugehörigen Größe darstellen.
Die größe des Arrays ist eine "Magic-Number", eine Zahl ohne funktionellen Zusammenhang, die für die Array größe einfach groß genug gewählt wurde, sodass das Aufschlagen des Balls auf dem Boden noch mit dem Array erfasst wird. Denn durch die Zeitdiskretion kann in einem Array mit 1000 Elementen bei dt = 0.005s nur ein 5s Zeitabschnitt gespeichert werden.

Nachdem also die Arrays angelegt wurden, wird in das Erste Element jedes Arrays die Startwerte eingetragen, da der Index 0 auch den Zeitpunkt 0 repräsentiert, so wie es auch die Aufgabenstellung macht.
In der folgenden Schleife werden dann die Werte für alle Zeitpunkte >0 generiert:

Code: Alles auswählen

[...]
double vx[1000];
double vy[1000];
double posX[1000];
double posY[1000];

vx[0] = 10;
vy[0] = 10;
posX[0] = 0; 
posY[0] = 1.8;
for(int i = 1; i < 1000; i++)
{
    vx[i] = vx[i-1] * 1;    //Wenn die Geschwindigkeit abnimmt, durch Reibung oder Gegenkräfte, muss das hier geschehen
    vy[i] = vy[i-1] * 1;     //momentan noch keine Änderung der Geschwindigkeit

    posX[i] = posX[i-1] + 0.005 * vx[i];   //Neue Position errechnen
    posY[i] = posY[i-1] + 0.005 * vy[i];
}
int zeit = 0;
for(; posX[zeit] > 0; zeit++);   //Solange der Ball noch über dem Boden ist, die Zeit erhöhen
printf("Der Ball landet auf dem Boden nach %f Sekunden", 0.005 * zeit);
Redundanz macht wiederholen unnötig.
quod erat expectandum

Lämpi
Beiträge: 57
Registriert: So Mär 23, 2014 4:46 pm

Re: Differentialgleichung (schiefer Wurf)

Beitrag von Lämpi » So Apr 06, 2014 5:14 pm

ich verstehs so halbwegs,aber jetz mal eine blöde Frage warum spielt die Erdbeschleunigung eigentlich nirgendwo eine Rolle??
und von wo weiß das Programm dass der Ball noch nicht am Boden ist??

Antworten