Vektorrechnung < Python < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:45 Do 17.07.2014 | Autor: | needmath |
Aufgabe | ich will die Kette aus Vektoren im Bild mit Python erstellen. Die Länge der Vektoren ist gleich und der Winkel zwischen den Vektoren ist immer derselbe.
[Dateianhang nicht öffentlich] |
ich lade meinen Code als Bild hoch, weil es sonst nicht schön zu lesen ist, wenn ich es hier den code einfach einfüge. das will ich euch nicht zumuten.
das problem bei meinem code ist, dass sich die länge der vektoren ändern. ich weiß nicht woran das liegt. findet ihr den fehler?
[Dateianhang nicht öffentlich]
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich] Anhang Nr. 2 (Typ: png) [nicht öffentlich]
|
|
|
|
Hallo!
Prinzipiell schreibst du den Code sehr sehr kompliziert. Ich hätte es anders gemacht, etwa so:
startpunkt=...
endpunkt=...
#Hier die Vektoren bilden, die nach oben oder nach unten zeigen
ersteStrecke=endpunkt-startpunkt
zweiteStrecke=Drehmatrix*ersteStrecke
letzterPunkt=startpunkt
tmp.append(letzterPunkt)
for i in range(Anzahl):
if(i%2): #für ungrade i
letzterPunkt = letzterPunkt + ersteStrecke
else:
letzterPunkt = letzterPunkt + zweiteStrecke
tmp.append(letzterPunkt)
Bei dir sehe ich zunächst noch zwei sehr komplizierte Dinge. Du füllst die tmp-Liste mit Python-listen. Warum füllst du sie nicht gleich mit den numpy-Arrays? Und: Das letzte Item einer Liste bekommst du ganz einfach mit tmp[-1]
Nun gut, bleiben wir bei deinem Code. Setze doch mal konkrete und vor allem schöne Zahlenwerte ein:
startpunkt=numpy.array(0, 10, 10)
endpunkt=numpy.array(0, 11, 9)
Dann ist offensichtlich startvektor=(0, +1, -1) Dann soll auch noch [mm] \alpha=90^\circ [/mm] sein, was grade dafür sorgt, daß bei der Drehung genau eine Komponente ihr Vorzeichen ändert (das macht die Sache einfach) Theoretisch sollten die nächsten Punkte bei (0, 12, 10), (0, 13, 9) u.s.w. liegen.
Nun hängst du (0, +1, -1) an der Liste an
Und dann beginnt die Schleife.
Wenn du wirklich ganz genau hin schreibst, in welcher Zeile welche Variable welchen Wert annimmt, wirst du recht schnell entdecken, daß du dich irgendwo verzettelt hast, und nicht das raus kommt, was raus kommen sollte.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:32 Do 17.07.2014 | Autor: | needmath |
Hallo,
ich folge mal deinem vorschlag mit dem einfachen beispiel:
[mm] Startpunkt=\vektor{0 \\ 10\\ 10}
[/mm]
[mm] Endpunkt=\vektor{0 \\ 11\\ 9}
[/mm]
[mm] Startvektor=\vektor{0 \\ 1\\ -1}
[/mm]
Den Startvektor verschiebe ich zum Ursprung mit:
ursprung = letzter_vektor - startpunkt
Mir wird dann folgender Vektor ausgegeben [mm] ursprung=\vektor{0 \\ -9\\ -11} [/mm]
Das passt ja auch. soweit so gut
nun drehe ich den Vektor um den Ursprung im uhrzeiger sinn, da die z-komponnente negativ ist und bekomme folgenden Vektor:
[mm] gedrehter-vektor=\vektor{0 \\ -11\\ 9}
[/mm]
so bis hierhin ist alles richtig oder?
wenn ich den Vektor nun wieder zurück verschiebe, indem ich den Startvektor wieder addiere, bekomme ich folgenden Vektor:
[mm] vektor-verschieben=\vektor{0 \\ -1\\ 19}
[/mm]
hier hat sich die länge des Vektors verändert. also muss das falsch sein, aber ich weiß nicht wieso? ich verschiebe den vektor doch wieder zurück, indem ich den startpunkt wieder addiere oder etwa nicht? was mache ich falsch?
|
|
|
|
|
Hallo!
Naja, du wirfst hier ein paar Dinge durcheinander.
Ein Vektor ist ganz profan ein Pfeil, der so viel sagt wie "Gehe 5 Schitte nach rechst und 8 Schritte nach oben". Den kannst du irgendwo im Raum platzieren, das "Gehe 5 Schitte nach rechst und 8 Schritte nach oben" behält seine Gültigkeit.
ABER: Wo du dann landest, hängt von deinem Startpunkt ab.
Das heißt, wenn du den Vektor an den Ursprung anheftest, ist das Resultat der Punkt (5|8). Wenn du den Vektor an den Punkt (5|2) anheftest, landest du bei (10|10)
Koordinaten kannst auch als Vektoren ansehen, aber welche, die per Definition am Ursprung angeheftet sind.
Schaun wir mal:
> Hallo,
>
> ich folge mal deinem vorschlag mit dem einfachen beispiel:
>
> [mm]Startpunkt=\vektor{0 \\ 10\\ 10}[/mm]
> [mm]Endpunkt=\vektor{0 \\ 11\\ 9}[/mm]
>
> [mm]Startvektor=\vektor{0 \\ 1\\ -1}[/mm]
Ja, das ist der erste Pfeil in deiner Zeichnung, und der verläuft von der ersten zur zweiten Koordinate
>
> Den Startvektor verschiebe ich zum Ursprung mit:
>
> ursprung = letzter_vektor - startpunkt
>
> Mir wird dann folgender Vektor ausgegeben
> [mm]ursprung=\vektor{0 \\ -9\\ -11}[/mm]
>
> Das passt ja auch. soweit so gut
Nee, tut es nicht. Zeichne das doch mal in ein Koordinatensystem ein! Das soll doch eigentlich der nächste Pfeil in der Zeichnung werden, und der hat jetzt schon eine Länge von über 10. Im Prinzip hast du den Pfeil/Vektor [mm] \vektor{0 \\ 1\\ -1} [/mm] , willst DIESEN drehen zu [mm] \vektor{0 \\ 1\\ +1}, [/mm] und das an die letzte Koordinate [mm] \vektor{0 \\ 11\\ 9} [/mm] anhängen, und kommst so auf die nächste Koordinate [mm] \vektor{0 \\ 12\\ 10}
[/mm]
Ach, nochwas: Was genau möchtest du eigentlich in der Liste tmp sammeln? Nicht doch eher die Koordinaten, so daß du sowohl den Startpunkt als auch den Endpunkt am Anfang eintragen willst.
Und ich sehe noch was: Der Winkel, um den du drehst, ist ein anderer, als der, der in der Zeichnung steht. Z.B. bedeutet 0° in der Rechnung, daß der Vektor nicht verändert wird, in der Zeichnung wird der Vektor um 180° gedreht...
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:39 Fr 18.07.2014 | Autor: | needmath |
hallo,
ich bin noch bei dem einfachen beispiel
ich habe nun folgenden code:
[Dateianhang nicht öffentlich]
> kommst so auf die nächste Koordinate [mm]\vektor{0 \\ 12\\ 10}[/mm]
diese Koordinaten bekomme ich jetzt auch, aber im zweiten Lauf der schleife bekomme ich wieder falsche koordinaten. Wo liegt der fehler?
aktualisiere ich am ende den start und endpunkt falsch?
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:59 Fr 18.07.2014 | Autor: | leduart |
Hallo nachdem du den einen Vektor gedreht hast, musst du doch nie mehr drehen, sondern nur abwechselnd die 2 Vektoren aneinander hängen.
Gruss leduart.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:17 Fr 18.07.2014 | Autor: | needmath |
hallo,
ja das könnte man auch machen, aber ich würde gerne bei meinem code bleiben. event_horizon hat auch gesagt, das ich es zu kompliziert mache. ich möchte trotzdem bei meinem code bleiben.
die frage, wo sich der fehler bei meinen neuen code ist, ist noch offen
|
|
|
|
|
Hallo!
Naja, wie gesagt, geh jede einzelne Zeile durch, und schreib hin, was die machen sollte. Also konkret, was du dir vorgestellt hast, was da raus kommen sollte. Und dann rechne mal stumpf aus, was die Zeile wirklich macht. Gibt es nen Unterschied, hast du das Problem gefunden.
Ich geb dir nen Hinweis: Was passiert denn in Zeile 47/48 ?
Ansonsten bleiben zwei ernsthafte Probleme:
1. das mit der Drehung. Da müßte (180-Wunschwinkel) stehen, fällt bei 90° nur nicht auf.
2. Ich weiß nicht, was genau du in tmp sammelst, es sieht aber doch nach den Koordinaten der Eckpunkte aus. Die allererseie Koordinate wird aber nicht in die Liste geschrieben.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:15 So 20.07.2014 | Autor: | needmath |
> Ich geb dir nen Hinweis: Was passiert denn in Zeile 47/48 ?
richtig wäre
startpunkt = letzter_vektor
endpunkt = new_vektor
das verwirrt mich jetzt irgendwie. kann es sein das mein code total falsch ist?
richige koordinaaten bekomme ich noch nicht. mir ist schon gesagt werden wo genau der fehler ist und was ich tun muss
> Ansonsten bleiben zwei ernsthafte Probleme:
> 1. das mit der Drehung. Da müßte (180-Wunschwinkel)
> stehen, fällt bei 90° nur nicht auf.
> 2. Ich weiß nicht, was genau du in tmp sammelst, es sieht
> aber doch nach den Koordinaten der Eckpunkte aus. Die
> allererseie Koordinate wird aber nicht in die Liste
> geschrieben.
das ist ja erstma unwichtig. ich bin ja dabei das einfache beispiel zu lösen. die liste tmp brauche ich für eine spätere aufgabe
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:13 So 20.07.2014 | Autor: | needmath |
ich glaube, ich weiß wieso das so nicht klappt.
ich werde das so so versuchen wie leudart es mir empfohlen hat
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:48 So 20.07.2014 | Autor: | needmath |
leute ich glaube ich habe es endlich gelöst :D
hier mein code
[Dateianhang nicht öffentlich]
ich bekomme die richtigen koordinaten, aber um sicher zu sein, möchte ich mein ergebnis gerne visualisieren. wie mache ich das am besten?
ich habe mir matplotlib installiert, aber ich nicht wie ich es damit visualiesieren soll. kann jemand helfen?
Anmerkung: dieser beitrag sollte eig. eine frage sein und keine mitteilung. und die frage oben kann als beantwortet editiert werden
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
|
Hallo!
Die matplotlib kenn ich nun nicht, aber eine sehr einfache Möglichkeit ist doch immer, das in eine textdatei zu schreiben. Das ginge so:
1: | f=open("datei.csv", "w")
| 2: | for i in tmp:
| 3: | f.write("%f\t%f\t%f\n"%(i[0], i[1], i[2]) )
| 4: | f.close() |
Das erzeugt eine einfache Textdatei mit drei Spalten für x, y, z. Die kann zur Not auch Excel fressen, und dort kannst du einen xy.Plot aus zwei der drei Spalten erstellen lassen.
Die FOR-Schleife durchläuft deine Liste, und i steht dann jedes mal für ein Element, und weil das auch wieder Listen sind, kannst du eben i[0]...i[2] benutzen. Und "%e\t%e\t%e\n"%(1, 2, 3) bedeutet, daß die Zahlen 1, 2, 3 als Fließkommazahlen in einen String formatiert werden. Zwischen ihnen befindet sich ein Tabulator, und am Ende muß ein Zeilenumbruch sein, damit man mehrere Zeilen bekommt.
Ach ja, ich denke, einen Bug hat dein Programm noch:
Du hast deinen Startpunkt [mm] \vektor{0\\10\\10} [/mm] und rechnest dann
[mm] A=\vektor{0\\10\\10}+\vektor{0\\1\\-1}=\vektor{0\\11\\9}
[/mm]
[mm] B=\vektor{0\\10\\10}+\vektor{0\\1\\+1}=\vektor{0\\11\\11}
[/mm]
Sollte es nicht eher
[mm] B=A+\vektor{0\\1\\+1}=\vektor{0\\12\\10}
[/mm]
sein?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:17 So 20.07.2014 | Autor: | needmath |
hallo,
> Ach ja, ich denke, einen Bug hat dein Programm noch:
>
> Du hast deinen Startpunkt [mm]\vektor{0\\10\\10}[/mm] und rechnest
> dann
>
> [mm]A=\vektor{0\\10\\10}+\vektor{0\\1\\-1}=\vektor{0\\11\\9}[/mm]
> [mm]B=\vektor{0\\10\\10}+\vektor{0\\1\\+1}=\vektor{0\\11\\11}[/mm]
>
> Sollte es nicht eher
>
> [mm]B=A+\vektor{0\\1\\+1}=\vektor{0\\12\\10}[/mm]
>
> sein?
ja genau so habe ich es gemacht. du hast dich wahrscheinlich verlesen
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:14 So 20.07.2014 | Autor: | leduart |
Hallo
um uns besser zu verstehen, hänge ich ein Bild an
[Dateianhang nicht öffentlich]
1. Du solltest zwischen Punkten und Vektoren unterscheiden, dann wir alles leichter. Du drehst einen Vektor, du addierst ihn zu einem Punkt, du erreichst wieder einen Punkt.
mein Bild zeigt, ausgehend von Punkt A zeichnest du den Vektor [mm] P_1 [/mm] der bei Punkt B endet
der wird gedreht, gegen den Uhrzeigersinn um den Fußpunkt vom [mm] P_1, [/mm] und den Winkel [mm] \beta=180°-\alpha [/mm] das ergibt den roten Vektor [mm] P_2, [/mm] der wird an B angehängt, ergib Punkt C
jetzt drehst du P2 wieder im Uhrzeigersinn , ergibt den falschen blauen Vektor "dein [mm] P_3"
[/mm]
du willst ja unbedingz statt [mm] P_1 [/mm] an C anzuhängen wieder drehen, dann musst du jetzt im Uhrzeigersinn drehen , d.h in der Matrix [mm] -\beta. [/mm] du willst ja den alten Vektor zurück!
welchen Sinn es macht denselben Vektor immer wieder durch hin und her drehen zu erzeugen musst du selbst wissen.
Aber sicher wird dein Programm klarer, wenn du zwischen Punkten und Vektoren unterscheidest. und nicht denselben Vektor, den du gerade an einen Punkt angehängt hast wieder mit Endpunkt- Anfangspunkt erzeugst.
Gruss leduart
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|