auf meiner Suche nach einer guten Erklärung zum plotten einer Flugbahn bin ich auf dieses Forum hier gestoßen =)
Ich höre zur Zeit ein Modul namens Sensordatenfusion. Eine unserer Übungen besteht jetzt daraus in Python eine Flugbahn mit vorgegebenen Geschwindigkeits und Beschleunigungsdaten zu plotten. Hier was gegeben ist :
Ich mache grade meine ersten Schritte in Python und bin etwas überfordert. Vielleicht kann mir ja jemand etwas helfen.
In den Matplotlib Tutorials online finde ich nur simple datenausgabe.
@polar641: Aus Sicht von Matplotlib ist das ja auch eine simple Datenausgabe. Du hast eine Rechenvorschrift um `x` und `y` für gegebene Zeitwerte `t` zu berechnen und kannst daraus also zwei Zahlenfolgen für `x` und `y` berechnen. Und die dann plotten.
Für das ausrechnen müsstest Du Dir dann eher Numpy anschauen. Wobei Du das natürlich auch von Hand mit Schleifen und Listen in ”reinem” Python machen kannst. Du musst geeignete Werte für `t` finden. Da spielen dann die beiden Fragen eine Rolle, denn wenn sich die Daten immer wiederholen, macht es ja Sinn den Start- und Endwert von `t` so zu wählen, das dazwischen genau eine Periode liegt. Wenn Du diese beiden Werte hast, gehst Du in `n`-Schritten vom Start- zum Endwert und rechnest die `x` und `y` Werte für jeden Schritt aus. Und die kannst Du dann plotten. Die Anzahl der Schritte kannst Du zum Beispiel an der Optik fest machen. Du siehst dann ja bei wie vielen Schritten der Plot anfängt nicht mehr ”eckig” auszusehen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
import matplotlib.pyplot as plt
import numpy as np
import time
v = 300
q = 9
a = np.power(v, 2) / q
w = q / (2 * v)
t = {0., 1., 5.}
w1 = np.sin(w * time)
w2 = np.sin((2 * w * time))
data = np.array([w1],[w2])
r = a * data
plt.plot(data)
plt.show()
Hm also meine numpy Aufrufe geben mir Fehlermeldungen.
Kann es sein das irgendetwas falsch importiert habe?
(Schreibe zum ersten mal code, nicht lachen bitte ^^)
@polar641: wenn es eine Fehlermeldung gibt, wäre es gut diese hier inklusive komplettem Traceback zu posten. Dann weiß auch jeder gleich, wo und was falsch ist.
Bei Dir fehlt noch das Verständnis für Datentypen, bzw. dem sorgfältigen Umgang mit Variablennamen. `time` ist ein Modul, das Du importierst, aber nicht wirklich verwendest. Das mit einer Kommazahl zu multilizieren macht keinen Sinn, daher der Fehler. Wenn man also statt time t benutzt, dann kommt der nächste Fehler. t ist ein Set und eine Set mit einer Kommazahl zu multiplizieren macht auch keinen Sinn. Was Du also statt eines Sets willst, ist ein numpy-Array (np.array).
Dann geht es weiter mit dem Fehler, dass np.array nichts mit zwei Listen anfangen kann, die jeweils ein Element eines weiteren Arrays haben.
Und schließlich, dass plt.plot gerne zwei Vektoren hätte, einen für x-Werte und einen für y-Werte.
EDIT: Inzwischen hast Du ja gepostet, dass der Code den Du zeigst, gar nicht der ist, den Du ausführst, oder zu dem die Fehlermeldung gehört. Bitte passenden Code und Fehlermeldung!
@polar641: Die Fehlermeldung sagt Dir auch was da falsch ist: ``TypeError: unsupported operand type(s) for *: 'float' and 'module'`` und wo der Fehler auftritt: ``w1 = np.sin(w * time)``. Was denkst Du wenn was das Ergebnis davon sein sollte? Welchen Wert hat `w`? Welchen Wert hat `time`? Und was hast Du bei einer Multiplikation der beiden als Ergebnis erwartet?
Das sieht so ein bisschen nach programmieren durch Raten aus. Das ist in gewissen Grenzen okay, wenn man eine sinnvolle Erwartung an das Ergebnis hat. Aber das sieht hier danach aus als wenn Du vorher nicht wirklich darüber nachgedacht hast.
Du hast da auch schon zu viel Code. Entwickle das in Schritten. Solange Du nicht ein funktionierendes Programm hast das die Werte für das Plotten berechnet hat, brauchst Du auch noch keinen Aufruf der `plot()`-Funktion. Taste Dich da Schritt für Schritt, Zwischenergebnis für Zwischenergebnis an das Ziel heran. Und nutze die/eine interaktive Python-Shell. Die normale ist okay. IPython oder ein Jupyter-Notebook sind besser.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
import matplotlib.pyplot as plt
import numpy as np
import time
import math
v = 300
q = 9
a = math.pow(v, 2) / q
w = q / (2 * v)
t = np.array([1,2,3])
w1 = math.sin(w * t)
w2 = math.sin((2 * w * t))
data = np.array([w1],[w2])
r = a * data
bis jetzt habe ich einfach versucht mir das gewollte r(t) zu bauen
File "C:/Users/Adrian/PycharmProjects/SDF/Folie1.py", line 11, in <module>
w1 = math.sin(w * t)
TypeError: only length-1 arrays can be converted to Python scalars
Process finished with exit code 1
@polar641: Die Funktionen aus dem `math`-Modul kennen keine Arrays, die versuchen das Argument in eine einfache Zahl zu wandeln. Du musst die `sin()`-Funktion von Numpy nehmen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari