PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tipps für Simulation.


Ganon
2004-08-14, 17:24:10
Hi Leutz. :)

Ich hoffe ihr könnt/dürft mir weiterhelfen. :)

Ich habe die Aufgabe eine Simulation zur programmieren. Dabei gilt folgendes:

1. Freie Wahl des Themas und der Art des Aufbaus
2. Freie Wahl der Programmiersprache
3. Muss (auch) unter Windows laufen

Es soll einfach etwas simuliert werden, mit dynamischen Faktoren, die vom Benutzer eingegeben werden können. Hauptaugenmerk soll dann die Berechnung sein. Grafische Ausgabe ist nebensächlich, aber (glaube ich) erforderlich. Aber ich glaube ein bisschen Eye-Candy schadet nie. ;)

Nun wollte ich euch mal fragen, ob ihr vielleicht ein paar Tipps habt, was man so simulieren könnte? Als Beispiel wurde der "Freie Fall" genannt, also das schonmal nicht. Wäre etwas, naja... zu einfach gemacht. ;) Es sollte aber nicht zu sehr in extrem wissenschaftliche Bereiche gehen, also Sachen von denen ein "normaler" Mensch eigentlich keine Ahnung hat, bzw. sich nur schwer darüber Informieren kann.

Dann wäre noch das Thema "Programmiersprache". Ich habe folgendes zur Verfügung, welche Windows-kompatibel sind und mit denen ich nicht von vorne Anfangen muss.

1. Java2 mit Eclipse 3 unter OS X
2. Borland Delphi 7 Enterprise unter Windows2k-Emulation (VirtualPC)
3. Borland C++ Builder 6 Standard ebenfalls unter Windows2k-Emulation

Eigentlich würde ich das Ganze ja gerne mit Java machen, da Eclipse einfach eine super IDE ist. Nur weiß ich nicht ob es (je nach Komplexität des Themas) bei der grafischen Ausgabe zu Performance-Problemen kommen kann. Also wohl je nachdem wie komplex. Der Rechner auf dem es laufen soll ist ein Athlon XP 1600+ unter Windows2k.

Das liegt dann, denke ich mal am Thema und wie man es grafisch ausschmücken kann. Wie weit kann man auf so einem Rechner gehen mit Java entsprechend der Oberfläche? (kann man die Frage überhaupt beantworten? ;)) Oder sollte ich es doch lieber mit einer der anderen Sprachen machen?

Ich bin für alle Tipps dankbar. :)

P.S.: Ich werde für diese Sache benotet. Deswegen frage ich nur nach dem "Was". Nicht "Wie". Ich bitte deshalb (falls der Thread so weit geht) keine Code-Beispiele und der gleichen zu posten. Allerhöchstens Links zum Thema. :)

Danke. :)

RMC
2004-08-14, 17:32:28
du könntest folgendes machen:

- Anhalteweg (Rekationsweg + Bremsweg) eines Autos mit der Geschwindigkeit x simulieren, bei einem gewissen Hindernis muss gebremst werden. (Natürlich ohne die Faktoren Reibung etc...)

- Linse...mit variabler Brennweite, Linsensystemen (Konvex, Konkav) etc...hab mal sowas gesehn, war ganz oke. Kenn leider die weiteren Begriffe in diesem Zusammenspiel nicht

- Billiard-Simulation (in Java mit Multithreading)

etc.

EDIT: achso ja, das braucht natürlich alles mehr oder weniger eine graphische Ausgabe..du kannst auch einfachere Berechnungssimulationen erstellen, bei denen einfach bestimmte Werte zur Laufzeit mathematisch berechnet werden (in Abhängigkeit von den eingegebenen Parametern vom User).

zb:
- irgendwas pyhsikalisches berechnen (Problemstellungen mit Temperatur, Dichte, etc...such mal in deinem Physikbuch *g*)
- Graphen berechnen (so schwer ist die graphische Ausgabe da auch nicht)

Ganon
2004-08-14, 18:00:58
Hi.

Danke schon mal. :)

Das mit dem Anhalteweg klingt nicht schlecht. Aber ich denke nur die alleinige Berechnung ist dem Lehrer wohl zu einfach. Weil das wäre dann ja diese normale Berechnung wie im Fahrschul-Lehrbuch. Da müssten dann schon Sachen wie Gewicht des Autos und Reibung (Straße, Eis, Wasser) mit rein. Ansonsten wird es wohl zu simpel, oder? Oder lässt sich so etwas nicht berechnen? Muss ja nicht Haargenau sein.

RMC
2004-08-15, 00:27:37
ich weiß ja nicht WIE komplex es werden soll, aber Anhalteweg berechnen ist wirklich nicht schwer. In Kombination mit einer graphischen Zeichnung (Auto etc.) wird das ganze nur etwas schöner verpackt ;) Wenn du es schaffst das Gewicht des Autos und die Reibung (Straßenbelag etc.) einzubauen dann wär das schon ganz gut.

Ansonsten würd ich auf etwas anderes physikalisches ausweichen. zB: Mechanik! Simulation der Kräfeaufteilung durch einen Flaschenzug oder Ähnliches...Oder Darstellung eines Schaltkreises mit verschiedenen Eingangsvariablen (Widerstände, Ampere etc.).

Man kann jedes beliebige physikalische Gesetz hernehmen und durch eine Anwendung simulieren :)

ethrandil
2004-08-15, 00:33:48
Das mit dem Anhalteweg klingt nicht schlecht.
Wie wärs mit Boids, also der Simulation von (zB) Fischschschwärmen anhand von Gruppenregeln? Das ist wenigstens bei der Ausgabe nicht ganz so einfach. (in 3D schwerer als in 3D)

Google einfach mal nach boids ;)

- Eth

Ganon
2004-08-15, 08:29:18
@RMC

OK. Danke. :)

@ethrandil

Ähm, wie jetzt? In 3D schwerer als 2D, oder in 2D schwerer als in 3D? *gg*

Aber ich guck nachher mal. :)

Ganon@work
2004-08-16, 07:46:53
Hi.

Guckt mal was ich gefunden habe:

http://www.cornelsen.de/physikextra/htdocs/Bremsweg.html

He He. ;)

Aber ich bräuchte dann ja den Quellcode. Also müsste ich es schon selber schreiben. Will ich ja eigentlich auch. Aber das ist ein guter "Abgucker" in einigen Punkten. ;)

Muss mal sehen ob ich wirklich das Thema nehme...

Jetzt mal nach diesen Boids gucken. *ggg*

micki
2004-08-16, 08:33:19
Boids sind wirklich nett, da kann man dann mehrere schwärme einbauen und z.b. Haie die durch die schwärme hindurch schwimmen (wobei der schwarm sich zur not aufteilt und später wieder zusammenfindet)...

wenn du das beispiel mit dem wagen erweitern möchtest, wäre sowas ala GTA2 nett. Da konnte man dazu noch lenken :)

was auch nett wäre, wäre eine 2d crash simulation. man könnte also zwei wagen von der seite sehen (drahtgitter?) und dann ein paar elemente im wagen. Mal angeschnallt und mal nicht, und dann beobachten wie alles in zeitlupe durch die frontscheibe fliegt ;)


was noch spassig sein kann, das wäre sowas wie bei "brige builder", man müßte also die statik einer brücke berechnen während ein zug drüber fährt.



und ganz advanced wäre vielleicht ne kleine A-Bomb simulation *hehe*

MfG
micki

Ganon@work
2004-08-16, 08:36:50
und ganz advanced wäre vielleicht ne kleine A-Bomb simulation *hehe*

Klar. Mit Berechnug auf das kleinste Elektron. ;)

Bringst du denn das Rechnenzentrum vorbei? ;)

Trap
2004-08-16, 13:46:51
Schwerkraft mit mehreren Körpern von denen man Anfangspunkte und Geschwindigkeiten festlegen kann.

Da ist die Berechnung interessant und das Ergebniss sollten die meisten schon gut genug kennen um bewerten zu können ob es richtig oder falsch ist.

micki
2004-08-16, 13:51:26
Klar. Mit Berechnug auf das kleinste Elektron. ;)

Bringst du denn das Rechnenzentrum vorbei? ;)
klar, es heißt "Internet"

man muss es ja nicht derart genau machen, es würde sicherlich reichen wenn es ne approximation wäre.

naja, einfacher wäre vielleicht ne radiosity solution auszurechnen oder ein raytracer (die simulieren lichtverhältnisse und sowas ist sehr eyecandy)

MfG
micki

Ganon
2004-08-17, 18:58:27
Hi.

Ich habe mir das mit den Boids mal angeguckt. Also das Ganze ist ja echt hochinteressant.
Aber leider sieht das Ganze auch hochkompliziert aus...

Hmm, ich weiß nicht ob ich das schaffe (bis Februar). Besonders da ich auch nicht gerade viel darüber weiß und auch so nicht viel finde aus dem ich ein Programm machen könnte.

Klar, SourceCode findet man überall, aber da reinlesen ist ein Horror...

Hmm. Muss aber noch mal weitergucken, vielleicht mache ich das ja doch, vielleicht aber nicht *ggg*...

micki
2004-08-17, 23:21:48
boids sind wirklich simpel.

ein einfacher boid besteht aus positionsvector und richtungsvector.

du hast ein array von boids und gehst jedes boid einmal durch pro simulationstick.


dabei arbeitest du 'regeln' ab. eine paar oft angewandte regeln sind z.b:

1. von allen boids wird der durchschnitsrichtungsvector ausgerechnet und dann zu jedem richtungsvector jedes boids draufgerechnet (natürlich gewichtet)

2. es wird von allen boids das centrum ausgerechnet und dann für jeden boid von dessen position zum centrum der richtungsvector errechnet und dann mit einer gewichtung auf den richtungsvector auf den aktuellen richtungsvector eines boids draufaddiert.

3. etwas erweitert ist, wenn du für jeden boid prüfst ob ein anderer boid 'zu nah' dran ist, und falls ja, wird der 'fluchtvector' auf den aktuellen richtungsvector (Gewichtet) draufaddiert.


bsp:

class CBoid:
{
public:
float pos[3];
float dir[3];
};

const unsigned int BoidCount=20;
const float weight1=0.01f;
const float weight2=0.01f;
const float weight3=0.01f;

CBoid Boids[BoidCount];

void regel1(CBoid& rBoid)
{
float Dir[]={0,0,0};
for(unsigned int a=0;a<boidCount;a++)
{
Dir[0]+=Boids[a].dir[0];
Dir[1]+=Boids[a].dir[1];
Dir[2]+=Boids[a].dir[2];
}
Dir[0]/=BoidCount;
Dir[1]/=BoidCount;
Dir[2]/=BoidCount;
rBoid.dir[0]+=Dir[0]*weight1;
rBoid.dir[1]+=Dir[1]*weight1;
rBoid.dir[2]+=Dir[2]*weight1;
}

void regel2(CBoid& rBoid)
{
float Pos[]={0,0,0};
for(unsigned int a=0;a<boidCount;a++)
{
Pos[0]+=Boids[a].pos[0];
Pos[1]+=Boids[a].pos[1];
Pos[2]+=Boids[a].pos[2];
}
Pos[0]/=BoidCount;
Pos[1]/=BoidCount;
Pos[2]/=BoidCount;
rBoid.dir[0]+=(rBoid.pos[0]-Pos[0])*weight2;
rBoid.dir[1]+=(rBoid.pos[1]-Pos[1])*weight2;
rBoid.dir[2]+=(rBoid.pos[2]-Pos[2])*weight2;
}
void regel3(CBoid& rBoid)
{
float Dir[]={0,0,0,0};
for(unsigned int a=0;a<boidCount;a++)
{
if((Boids[a].pos[0]-rBoid.pos[0])*(Boids[a].pos[0]-rBoid.pos[0])+
(Boids[a].pos[0]-rBoid.pos[0])*(Boids[a].pos[0]-rBoid.pos[0])+
(Boids[a].pos[0]-rBoid.pos[0])*(Boids[a].pos[0]-rBoid.pos[0])<1.f)
{
Dir[0]+=Boids[a].pos[0]-rBoid.pos[0];
Dir[1]+=Boids[a].pos[1]-rBoid.pos[1];
Dir[2]+=Boids[a].pos[2]-rBoid.pos[2];
Dir[3]++;
}
}
Dir[0]/=Dir[3];
Dir[1]/=Dir[3];
Dir[2]/=Dir[3];
rBoid.dir[0]+=Dir[0]*weight3;
rBoid.dir[1]+=Dir[1]*weight3;
rBoid.dir[2]+=Dir[2]*weight3;
}

main...

for(unsigned int a=0;a<BoidCount;a++)
{
regel1(Boids[a]);
regel2(Boids[a]);
regel3(Boids[a]);
}



naja, ist mal eben so zusammengehackt, ich wollte nur mal zeigen das boids im anfangsstadium ziemlich einfach sind. (ist bestimmt nichtmal compilierbar ;) )

MfG
micki

mrdigital
2004-08-18, 11:26:52
wie wärs mit einer "Mondflugsimulation"? Du könntest die Flugbahn einer Rakete von der Erde bis zum Mond berechnen (da kann man ja an viele Stellen vereinfachte Annahmen treffen um den Aufwand in Grenzen zu halten). So könnte man zu verschiedenen Daten die Rakete starten und ansehen, ob die noch ankommt oder nicht ;)

Ganon
2004-10-30, 23:13:41
Hi.

Ich probiere mich gerade ein bisschen in der Boid-Simulation.

Ich will das Ganze in 2D machen. Nun wollte ich fragen inwiefern ich da die "Regeln" ändern muss.

Bei allen Beschreibungen wird ja immer von 3 Koordinaten gesprochen. Also denke ich mal das es für räumliche Darstellung ist.

Kann ich einfach eine Koordinate weglassen, oder muss das denn anders ablaufen? Ich denke mal die Abfrage für die Abstands-Abfrage, muss um eine Position "gekürzt" werden, oder?

Danke. :)

ethrandil
2004-10-31, 01:11:25
Hi, du musst im Prinzip nur alle 3D-Vektor-Berechnungen in 2D konvertieren...

Das bedeutet für den Abstand, dass statt Wurzel((x1-x2)²+(y1-y2)²+(z1-z2)²) einfach Wurzel((x1-x2)²+(y1-y2)²) verwendet wird, ja.

- Eth

micki
2004-10-31, 11:11:11
der einfachste weg zum testen wäre vielleicht, wenn du bei der initialisierung der boid eine coordinate auf 0 lassen würdest, dann solltest du scho sehen wie das verhalten in 2d sein könnte.

MfG
micki

Ganon
2004-10-31, 13:10:10
Naja. Ich brauche überhaupt erst mal ne anständige Bewegung. ;) Bisher kommt nur Käse bei raus. *gg*

Na mal sehen...

Noch mal die Sache in Ruhe angehen. Wie sieht denn das am Start aus? Können alle Boids eine zufällige Position kriegen, oder brauchen die etwas bestimmtes? Ich lese immer etwas von einem Sammelpunkt.... hmmm.

Matrix316
2004-10-31, 13:36:45
Wie wäre es mit Matlab? Da kann man relativ einfach und schnell Grafische Oberfläche mit sich bewegenden Dingen machen und auch die Berechnung geht relativ flott. Programmierung ist ähnlich wie C nur etwas einfacher in der Syntax.

(Es gibt auch eine Studentenversion von Matlab. Die ist quasi umsonst. )

Das nur so. ;)

Ganon
2004-10-31, 13:57:39
Nö. ;) Ich nehme C++ mit GLUI (GLUT mit Erweiterungen um Schalter, Felder, etc.). Zum Zeichnen OpenGL.

Dee
2004-10-31, 19:45:40
Hm, das mit den Boids klingt echt spaßig... Mal schauen, wann ich etwas Zeit habe. *g*

@Ganon: Bitte veröffentliche Dein Ergebnis aber. Ich würd gern die Fischi schwimmen sehen. ;)

Eine schöne Simulation ähnlicher Art ist auch das Verhalten der Orks bei Massenschlachten. Siehe Special DVD Herr der Ringe Teil 2. :)

Gruß, Dee

Ganon
2004-10-31, 20:08:20
Hi.

Also je nachdem. Ich probiere momentan nur die Boids aus. Wenn ich bis Anfang Dezember immer noch keine brauchbaren Ergebnisse habe, dann muss ich mir was anderes aussuchen.

Vor der Abgabe des Projekts kann ich es jedenfalls nicht veröffentlichen. Sonst wird mein Lehrer noch misstrauisch.

Februar ist die Abgabe. Also es dauert noch ein bisschen.

ggf. überlege ich auch 2 Versionen des Programms zu machen. Einmal eine 2D-Ansicht und einmal eine 3D-Ansicht. Aber erst mal brauche ich EINE Ansicht die Funktioniert. ;)

micki
2004-11-01, 01:16:14
Hi.

Also je nachdem. Ich probiere momentan nur die Boids aus. Wenn ich bis Anfang Dezember immer noch keine brauchbaren Ergebnisse habe, dann muss ich mir was anderes aussuchen.

Vor der Abgabe des Projekts kann ich es jedenfalls nicht veröffentlichen. Sonst wird mein Lehrer noch misstrauisch.

Februar ist die Abgabe. Also es dauert noch ein bisschen.

ggf. überlege ich auch 2 Versionen des Programms zu machen. Einmal eine 2D-Ansicht und einmal eine 3D-Ansicht. Aber erst mal brauche ich EINE Ansicht die Funktioniert. ;)

beim initialisieren der boidpositionen würde ich an deiner stelle irgendwelche randomwerte jedem boid zuweisen, auf keinen fall alle auf einen fleck :)

der einfachste boid würde bei mir einen positions und einen richtungsvector haben. am einfachsten sind boids zu kontrollieren, wenn sie alle die selbe, konstante geschwindigkeit haben.
das kannst du bewerkstelligen indem du den richtungsvector immer normalisierst bevor du die neue position ausrechnest.


das finden der richtigen parameter dauert ein wenig, um es dir einfacher zu machen, kannst du die einzelnen regeln auch mal einzeln testen.

anfangen könntest mit der regel, dass alle versuchen das gemeinsamme zentrum zu erreichen.
also:
zemtrum ausrechnen (für den anfang kannst du auch pauschal 0 0 0 als centrum nehmen)
für jeden boid aktuellen richtungsvector=richtungsvector+(centrum-position)*gewichtung
(am ende normalisieren nicht vergessen)

wenn du das richtig gemacht hast, hängt von der 'gewichtung' ab, wie gross der kreis ist innerhalb dessen die boids sind, je kleiner der wert, desto größer der kreis <-> wenn alle auf einem punkt kleben ist der wert viel zu gross ;)

das ist doch einfach zu realisieren


MfG
micki

btw: hab nach spielen gestöbert und zufällig gesehen, dass dort (http://www.jucaushii.ro/image_aW1nL1BvcnRSb3lhbGUyLzA1LmpwZw==_UG9ydCBSb3lhbGUgMiBzY3JlZW5zaG90IC0gSnVjY XVzaGlpLnJv) wohl auch boids sind :)

Ganon@work
2004-11-11, 09:18:02
Hi.

Also irgendwie funktioniert es jetzt teilweise. ;)

Naja. Am Start fliegen erst mal alle zur Mitte (die rand()-Funktion ist Müll, bei jedem Start des Programms das selbe).
Dann bewegen sie sich alle leichts nach rechts unten und fliegen geradeaus in die Richtung. OK. Einige halten den Abstand ein, aber andere hängen zu dicht bei einander, bzw. ineinander. Muss mal gucken woran das liegen kann...

Mal ne andere Frage:

Was muss ich logisch tun, wenn die Boids den Rand erreichen? Wie veranlasst man am besten die Gruppe dazu mal ne Wende zu machen?

ethrandil
2004-11-15, 19:15:49
Also da gibt es mehrere Möglichkeiten.
Entweder du tust so als sei dein Teich unendlich, dann lässt du sie einfach an der anderen Seite ankommen wenn sie durch die Wand schwimmen...

Oder du berechnest eine 'Kraft' die abstoßend vom Rand wirkt... zB so:

Nehme den Vektor vom Boid zur nächsten Wand
Verkürze den Vektor je weiter der Boid von der Wand entfernt ist
Drehe den Vektor um 180°
Addiere ihn wie alle anderen zur Bewegung

- Eth

Ganon
2004-11-29, 17:25:41
Hi.

Wir haben letzte Woche die Aufgabe bekommen. Wie ich es schon befürchtet habe, reicht ihm diese Art der Simulation nicht aus...

Der Lehrer möchte min. 5 Eingabewerte aber auch min. 3 Ausgabewerte in Zahlen-Form.

D.h. er will ein "Ergebnis" haben und nicht nur eine dynamische Animation (seine Worte).

Ich wüsste nun nicht wie ich das bei einer Schwarmsimulation gestalten soll, da er "errechnete" Werte haben will und nicht offen sichtliche Werte die von Anfang an klar sind... :(

Nunja.

Jetzt habe ich mir gedacht, ich könnte ja eine Art Skisprung-Simulation machen. Da kriegt man viele Werte bei raus.

Also irgendwas die Schanze runter fahren lassen und gucken wie weit es fliegt...

Soweit ich das überschauen konnte brauche ich:
- Wurfparabel
- Luftwiderstand (CW-Wert)

Ich frage mich nur noch was ich brauche, um zu berechnen wie die Geschwindigkeitszunahme während der Schanzen-Fahrt ist... Also wenn ich das Objekt oben starte, wie schnell es dann ist, wenn es am Schanzen-Ende angekommen ist und dann in die Flug-Phase geht.

Könnt ihr mir da vielleicht einen Tipp geben?

Trap
2004-11-29, 20:47:50
Natürlich bekommt man bei einer Schwarmsimulation Werte raus, durchschnittlicher Abstand der Boids, Abweichung der Bewegungswinkel, Position...

Geschwindigkeit beim Runterfahren würd ich einfach mitsimulieren. dv=(sin(winkel)*g*m-luftreibung(v)-cos(winkel)*bodenreibung(v))/m

pajofego
2004-11-29, 21:10:08
Hi Ganon,

interessante Aufgabe die Sache mit der Schanze insbesondere wenn man versucht die Reibung am Boden und die Luftreibung mitzubeachten! Könnte dir die Gleichung herleiten muss mich aber heute auf eine Prüfung vorbereiten, daher heute keine Zeit für solche wissenschaftliche Experimente. :( Erst morgen, wenns dir nicht zu spät ist.

@Trap:

Gleichung kann so nicht ganz stimmen! Achte auf die Einheiten!!! Bei dir steht nicht die Änderung der Geschwindigkeit sondern nach den Einheiten die Beschleunigung!!! Spricht dv/dt = ... Kann ja sein, dass du das gemeint hast ;)

Trap
2004-11-29, 21:32:38
Stimmt, es fehlt ein *dt auf der rechten Seite...

Achso: Wenn du Differentialgleichungen lösen willst (Simulation Skisprung) dann bitte nicht mit Euler, das divergiert zu leicht. Such nach Runge-Kutta, das ist besser.

Ganon
2004-11-29, 21:42:20
Natürlich bekommt man bei einer Schwarmsimulation Werte raus, durchschnittlicher Abstand der Boids, Abweichung der Bewegungswinkel, Position...

Hi.

Abstand bestimme ich ja praktisch durch die Variablen. Position der Boids ist eher nichtssagend, ...

Der Lehrer meint mit seinen Ausgabe-Werten die er haben will, so "errechnete" Werte auf komplexe Weise... Und die Werte sollten eine verwertbare Aussagekraft haben.

Auf gut deutsch:

Er will einfach ein Haufen Formeln sehen die korrekt angewendet werden und dabei die richtigen Ergebnisse herauskommen. Boids sind ja praktisch nur eine Darstellung von Schwarmbildung und Flugverhalten. Das wäre für ihn eher eine dynamische Animation...

Er hat uns da 2 Stunden vollgelabert was er nicht sehen will...

Aber schon mal danke für die Hilfe. :)

pajofego
2004-11-29, 21:47:53
Stimmt, es fehlt ein *dt auf der rechten Seite...

Achso: Wenn du Differentialgleichungen lösen willst (Simulation Skisprung) dann bitte nicht mit Euler, das divergiert zu leicht. Such nach Runge-Kutta, das ist besser.

Muss nicht unbedingt sein! Kannst eine CFL Bedingung einbauen! Zwar benötigst du mehr Schritte aber die Diskretisierung ist einfacher:

dt = CFL / (max(v/dx)), mit CFL = [0..1]


@Trap

mit deiner Gleichung alleine kann man aber noch nicht viel anfangen, oder? Wie willst du die Zeit berechnen oder die Geschwindigkeit?

Gruss pajofego

Ganon
2004-11-29, 22:03:42
Hi.

Also das Ganze muss nicht 100%ig korrekt sein bis ins kleinste Detail. Ein paar feste Annahmen sind OK (z.B. Reibung=-1%Geschwindigkeit), laut Lehrer. Es ist ja keine Diplomarbeit. ;)

Ganon
2004-11-29, 22:15:19
Also noch mal als Zusammenfassung für mich, rein vom Ablauf:

1. Figur steht oben
2. Figur rutscht Schanze hinunter
3. Berechnung der Geschwindigkeit (nimmt jede Zeiteinheit zu)
4. Beachtung von Luftwiderstand und Reibung
4. Ganz unten an der Schanze angekommen nimmt Geschwindigkeit nicht mehr zu
5. Beginn der Wurfparabel, wenn Schanze verlassen
6. Benutzung der Errechneten Geschwindigkeit für die Wurfparabel
7. Figur fliegen lassen und Luftwiderstand in die Wurfparabel berücksichtigen
8. Stoppen wenn Firgur den Boden berührt. Wenn Höhe = 0?
9. Ausgabe der erreichten Geschwindigkeit, der Zeit bis zur Landung, der zurückgelegte Weg, etc.?

Ist das so korrekt?

pajofego
2004-11-29, 22:18:21
@Trap,

sorry hab gerade net aufgepasst...hab vergessen die Gleichungen zu diskretiseren!!! :redface:

dv/dt = (v^(n+1)-v^n)/dt

Alles klar, wird langsam spät!

Trap
2004-11-29, 22:19:45
Stimmt, man kann auch variable Schrittweite nehmen. Das hilft aber im Allgemeinen nicht, z.B. Umlaufbahn im Schwerefeld, da divergiert Euler bei jeder Schrittweite.

Ich würd einfach mit fester Schrittweite rechnen, ist bei bekannten zu lösenden Formeln ist es kein Problem durch Probieren eine sinnvolle Schrittweite zu suchen. Anfangswerte sind x=0, dx=0 und t=0, dann solange Runge-Kutta benutzen bis das Ende der Schanze erreicht ist.
Als Phasenraum für das Problem müsste x,y,dx,dy reichen. Bei x>Schanzenlänge dann einfach die zu lösende Gleichung wechseln. y und dy braucht man für den ersten Teil nicht und kann sie als 0 lassen bzw. dy auf die Absprunggeschwindigkeit setzen.

Trap
2004-11-29, 22:27:48
Ich würd mir eine Funktion suchen die ungefähr so aussieht wie der Hügel vor einer Sprungschanze und dann wenn die aktuelle Position des Skispringers unterhalb dieser Funktion liegt ihn als gelandet zählen.

Was willst du genau machen, die Differentialgleichung selbst lösen (Flugparabel suche) und den Computer nurnoch die Lösung ausrechnen lassen oder willst du den Computer die Differentialgleichung numerisch lösen lassen? Den Computer lösen lassen ist nicht so kompliziert wie es sich anhört und man kann das implementierte Lösungsverfahren für Anlauf und Sprung benutzen.

Ganon@work
2004-11-30, 12:36:00
Hi.

Wie meinst du das jetzt mit "den Computer lösen lassen"?

Ich dachte jetzt daran entsprechend die Formeln für diese ganze Sache so oft aufzurufen, bis die Figur am Boden angekommen ist und dabei entsprechend eine Figur an der Position auf den Bildschirm zu malen

Der X-Wert ist beim Start ja 0 (Null). Y müsste doch eigentlich ein hoher Wert sein (je nach Höhe der Schanze und des Hügels)

Ist Y = 0 dann->klatsch. ;)

Oder etwa nicht?

Trap
2004-11-30, 20:26:33
Die Formeln so oft aufrufen => Differentialgleichung numerisch mit Eulerverfahren lösen

Es gibt grunsätzlich 2 Arten Differentialgleichungen mit Anfangsbedingungen (genau das ist dein Skisprung) zu lösen: Du löst die Gleichung mathematisch und bekommst eine Formel mit der du x(t) und y(t) direkt ausrechnen kannst oder du löst die Gleichung numerisch, d.h. du nimmst die Anfangswerte und errechnest daraus neue Werte die hoffentlich dem Zustand nach einem Schritt von n Sekunden entsprechen und das machst du so oft bis du bei deinem gewünschten Zustand angekommen bist.

Bei der numerischen Lösung hast du bei jeden Schritt einen Fehler. Der hängt davon ab welche Funktion man löst und mit welchem Verfahren, außerdem noch von der Schrittlänge. Je einfacher die Funktion, je kürzer die Schrittlänge und je besser das Lösungsverfahren desto kleiner der Fehler.

Ganon
2004-12-05, 16:17:48
Hi.

Ich habe mir jetzt mal folgende Formeln zusammengesucht:

Wurf:
x = v0 * t * *cos(alpha)
y = -(g/s) * t^2 * + v0 * t * sin(alpha)
v = Wurzel(v0^2 + g^2 + t^2 - (2*v0) * g * t * sin(alpha))

Bodenreibung:
F(Reibung) = Reibungszahl * F(Normal)

Luftwiderstand des Körpers (p=Luftdichte;A=Fläche zur Störmung):
F = 1/2 * p * cw * A * v^2

Geschwindigkeitszunahme beim "Runterfahren" (ich habe euch noch nicht so ganz verstanden, was ist nun richtig von euren ganzen Formeln?):

v=((sin(winkel) * g * m - Luftwiderstand - cos(winkel) * Bodenreibung) / m) * t


Bei Bodenreibung und Luftwiderstand kommt ja die Kraft F bei raus, oder? Wie rechne ich die denn gegen die anderen Formeln?
Ich muss ja sicherlich die Kraft irgendwie umrechnen...

Trap
2004-12-05, 18:43:25
Du kannst in deine Formeln die Luftreibung nicht einrechnen. Deine Formeln beschreiben nämlich die Lösungen (siehe http://de.wikipedia.org/wiki/Differentialgleichung) der Differentialgleichung zum Wurf im luftleeren Raum.

Du könntest ohne Reibung rechnen, dann ist es einfach. Dann ist nämlich die Anfangsgeschwindigkeit direkt aus der potentiellen Energie des Springers errechenbar. Ekin=Epot => 1/2*m*v*v=m*g*h
Dann gelten auch deine gesammelten Formeln, wovon du aber nur x(t) und y(t) brauchst.

Wenn du mit Reibung rechnen willst, musst du die Differentialgleichungen richtig aufstellen bevor du weitermachen kannst. Oder im Web suchen ob du die fertigen Lösungen für deinen Spezialfall finden kannst.

pajofego
2004-12-05, 22:51:52
@Ganon

Ich habe einmal dir die Herleitung gemacht. Müsste das jetzt einmal einscannen und dir per mail schicken. Wie soll ich das am besten machen?

Gruss pajofego

Ganon@work
2004-12-06, 07:07:30
Hi.

Hey. Danke dafür. :)

Joah, per Mail schicken wäre nicht schlecht. Am besten auf mein großes Domain-Postfach:

matti at mhami.de

Mal hoffentlich Spam-Sicher geschrieben. ;)