Mathematica ndnum Fehler

Neue Frage »

saimen Auf diesen Beitrag antworten »
Mathematica ndnum Fehler
Hallo liebe Leute,

ich habe ein kleines Problem mit Mathematica. Ich möchte ein DGL System numerisch lösen, um eine Flugbahn zu erhalten.

Meine Befehl schaut so aus:

NDSolve[{vx[0] == 173.2, vy[0] == 100,
vx'[t] == -c/m*Sqrt[vx[t]^2 + vy[t]^2]*vx[t],
vy'[t] == -9.81 - c/m*Sqrt[vx[t]^2 + vy[t]^2]*vy[t]}, {vx[t], vy[t]}, {t, 1, 200}][[1]]

Wenn ich diesen ausführe, kommt immer dieser Fehler:
NDSolve::ndnum: Encountered non-numerical value for a derivative at t == 0.`.

Die Hilfe von Mathematica hat mir leider nicht geholfen. Es wäre echt super, wenn jemand weiß woran es liegt.

Vielen Dank im Voraus
Huggy Auf diesen Beitrag antworten »
RE: Mathematica ndnum Fehler
Hast du den Konstanten c und m vorher Werte zugewiesen?
Ohne das kann Mathematica natürlich keine numerischen Werte für die Ableitungen berechnen.
saimen Auf diesen Beitrag antworten »

oh man^^

bin ich dumm Hammer

hab sie oben zwar definiert, allerdings den Kernel danach wieder neugestartet...

Danke! Allerdings folgt nun das nächste Problem. Zwar bekomme ich nun jeweils "interpolating function" allerdings weiß ich jetzt nicht, wie ich die Flugbahn plotten kann?
Huggy Auf diesen Beitrag antworten »

Mathematica gibt die Lösung in Form einer Regel an. Zur Vereinfachung solltest du dieser Regel einen Namen geben, z. B indem die Anweisung zur Lösung in der Form

code:
1:
name = NDSolve[...

schreibst. Dann kannst du später einfach mit dem Namen auf die Regel zugreifen. Die Flugbahn plotten kannst du jetzt im Zeitintervall [a, b] mit

code:
1:
ParametricPlot[Evaluate[{vx[t], vy[t]} /. name], {t, a, b}]

Dabei müssen a und b Zahlen sein, die in dem Intervall liegen, für das die numerische Lösung bestimmt wurde. Bei dir wäre das das Intervall [1, 200]. Dabei ist mir nicht klar, weshalb du die Anfangsbedingungen für t = 0 angibst, die Lösung aber nur ab t = 1 berechnen lässt.

Edit:
Das Plotten sollte zwar so funktionieren. Das ist aber nicht die Flugbahn. Denn du hast ja nur die DGL für die Geschwindigkeiten gelöst. Wenn du die Flugbahn möchtest, musst du eine DGL 2. Ordnung für den Ort aufstellen.
saimen Auf diesen Beitrag antworten »

ja das mit t habe ich auch gemerkt, danke.

OK, das leuchtet mir ein, wenn ich nämlich meins plotte, kommt eine komische kurve heraus.

Wie komme ich jetzt auf meine Flugbahn?
Huggy Auf diesen Beitrag antworten »

Statt vieler Worte:

[attach]31521[/attach]

Ich hoffe, das ist ohne Erläuterungen verständlich. Sonst frag einfach. Die Werte für c und m sind völlig willkürlich so gewählt, dass die Kurven mit und ohne Luftwiderstand sich nicht stark unterscheiden.
 
 
saimen Auf diesen Beitrag antworten »

Super! Vielen Dank, so hat es funktioniert. Freude
Allerdings habe ich noch ein Problem. Zwar passen mein Flugbahnen mit denen aus der Literatur überein, allerdings passen die Weiten, also die x-Werte nicht.

Das selbe Problem habe ich, wenn ich die Flugbahn ohne Luftwiderstand plotte.

Mit einem Applet aus dem Internet erhalte ich 188m, Mathematica gibt mir nur etwa 6m. Die Höhe passt allerdings.

Ich habe mal Screenshots angehängt. Wo liegt mein Fehler?

Vielen Dank

PS: Anfangsgeschwindigkeit sind 43m/s und Abflugwinkel 45°
Huggy Auf diesen Beitrag antworten »

So kann das ja nicht richtig funktionieren. Ich weiß gar nicht, wo ich bei den Fehlern anfangen soll.

Du definierst die Funktion f zweimal. Damit überschreibt die zweite Definition einfach die erste. Auf der rechten Seite der Funktionsdefinition taucht die Variable x bzw. y gar nicht auf. Es sollen ja auch Funktionen der Zeit t sein. Dann sollte auf der linken Seite f[t_] stehen. Und die beiden Funktionen müssen unterschiedliche Namen bekommen.

Der Plotbefehl funktioniert nur zufällig, weil er t variiert, obwohl in der Funktionsdefinition t nur als Parameter steht und nicht als Variable. Geplottet wird als Funktion von t. Die x-Achse ist also die Zeit und nicht die x-Koordinate der Flugbahn. Um die Flugbahn zu bekommen, musst du ParametricPlot verwenden.

Ich habe das mal umgesetzt. Im ersten Bild werden die x- und die y-Koordinate als Funktion der Zeit geplottet. Im zweiten Bild wird die Flugbahn geplottet. Mit der Option AspectRatio könnte man noch die Größenverhältnisse der Achsen anpassen.

[attach]31532[/attach]

Dir fehlen einfach die notwendigen Grundkenntnisse von Mathematica.
saimen Auf diesen Beitrag antworten »

ah ok, super jetzt klappts. DANKE!

ich benutze es leider erst seit ein paar Tagen. Manche Befehle kenn ich schon, aber oftmals weiß ich halt nicht wann ich was genau einsetzen muss.
Danke für deine Hilfe.

Wie kann ich jetzt zB. eine zweite Flugbahn in dieses Diagramm einfügen? Also mit nem anderen Abflugwinkel?

Und kann ich irgendwie festlegen, dass der Graph nur bis zur x-Achse geht? also das er nicht negativ wird. Danke smile
saimen Auf diesen Beitrag antworten »

ok die erste Frage habe ich mir selbst beantwortet.

ich geb den Parametricplots Namen, also zb drl1=parametricplot....

So führe ich dann alle aus die ich brauche.

Und zum Schluss kommen die alle in ein Diagramm mit Show[drl1,drl2,...]

Mein zweites Problem habe ich jetzt so gelöst, dass der Maximalwert von t bis zur NUllstelle geht. Allerdings klappt des ja nur hier so, weil ich dafür die Formel habe.

Kann man das sonst noch irgendwie hinbekommen?

Außerdem verstehe ich noch nicht, wie ich hier ne Legende hinbekomme.

Sorry, für die vielen Fragen
Huggy Auf diesen Beitrag antworten »

In Mathematica lässt sich fast jedes Problem auf unterschiedliche weise lösen. Um mehrere Funktionen/Kurven in ein Diagramm zu zeichnen, kann man, wie du es gemacht hast, erst die einzelnen Diagramme erzeugen und die dann mit Show zusammenfügen. Bequemer ist es oft, Funktionen wie Plot oder ParametricPlot gleich mit einer Liste von Funktionen/Kurven aufzurufen.

Die Funktionen kann man vorher einzeln definieren. In deinem Beispiel ist es aber bequemer, den Winkel als zweite Variable w in die Funktionsdefinition aufzunehmen. Möchte man auch die Abfluggeschwindigkeit variieren, kann man eine dritte Variable v aufnehmen.

Den Bereich, den man zeichnen möchte, kann man über die Option PlotRange spezifizieren. In dem folgenden Beispiel habe ich die Untergrenze auf 0 gesetzt, während die Obergrenze aus den Funktionswerten bestimmt wird. In die Funktionsdefinition habe ich in dem Beispiel nur den Winkel als zweite Variable aufgenommen. Er ist jetzt im Gradmaß anzugeben. Die Umrechnung ins Bogenmaß habe ich mittels der Konstanten Degree in die Funktionsdefinition eingebracht. Gezeichnet werden die Wurfparabeln für 45° und 30°.

[attach]31539[/attach]

Achsenbeschriftungen können mit AxesLabel erzeugt werden.
Huggy Auf diesen Beitrag antworten »

Zu deiner PN_Frage: Legenden für die einzelnen Kurven

Dazu gibt es diverse Möglichkeiten, die ich aber selbst bisher kaum genutzt habe.

(1) Man kann in jedes Diagramm nachträglich Texte und Graphikelemente mittels des Menüs Graphics/Drawingtools einfügen und frei positionieren.

(2) Man kann mit der Option Epilog völlig frei Legenden erzeugen. Das ist aber nicht ganz einfach.

(3) Nach Laden des Pakets PlotLegends vereinfacht sich (2).

Zu (2) und (3) schau dir mal

http://wwwa1.kph.uni-mainz.de/Vorlesunge...thematica_2.pdf

Seite 18/19 an.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »