Seite 1 von 1
Vektoren mit NumPy: "Laufender" Punkt
Verfasst: Samstag 19. Juli 2014, 16:00
von theCed7
Hi,
hier mal ein Auszug meines Codes:
Code: Alles auswählen
def inputnumber(Message): #Input in NumPy-Array
num = input(Message).split(',')
return [int(n) for n in num]
print("[1] Abstand Punkt <-> Gerade")
print("[2] Abstand windschiefer Geraden")
method=input()
if method == "1":
#Abstand über Orthogonalitätsbedingung
vecAg=numpy.array(inputnumber("Aufpunkt von g: "))
vecvg=numpy.dot(numpy.array(inputnumber("Richtungsvektor von g: ")),"x")
vp=numpy.array(inputnumber("Ortsvektor zu P: "))
#Lotfußpunkt als "laufender" Punkt, t Parameter der Geradengleichung:
print(vecvg)
L=numpy.array(vecAg[1]+vecvg[1]*t,vecAg[2]+vecvg[2]*t,vecAg[3]+vecvg[3]*t)
print(L)
Als Beispiel: Wenn g: vecx=[2,1,4]+t*[3,0,-2] soll L(2+3t,1,4-2t) sein. Ich denke im Code oben ist es klarer, funktioniert allerdings nicht, weil t nicht gegeben ist. t will ich aber nicht geben, ist ja eine Unbekannte. Ihr habt sicher einen Lösungsansatz, ich bin noch Python-Neuling.

Re: Vektoren mit NumPy: "Laufender" Punkt
Verfasst: Samstag 19. Juli 2014, 18:16
von MagBen
Versuch mal die Mathematik, die Du implementieren willst auf ein Blatt Papier zu schreiben. Danach schreibst Du den Numpy-Code exakt so, wie Die Mathematik auf dem Papier steht (das geht tatsächlich). Lass das ganze Input-Zeug erstmal weg bis der Algorithmus funktioniert.
Re: Vektoren mit NumPy: "Laufender" Punkt
Verfasst: Samstag 19. Juli 2014, 23:57
von theCed7
Also ich bin jetzt ein gutes Stück weiter, ich denke jetzt sind es nur noch Kleinigkeiten. Geholfen hat SymPy, mit dessen Hilfe ich t einfach als Symbol deklariert habe:
Code: Alles auswählen
if method == "1":
#Abstand über Orthogonalitätsbedingung
vecAg=numpy.array([-1,1,-7]) #Aufpuntk von g
vecvg=numpy.array([2,-1,2]) #Richtungsvektor von g
vecP=numpy.array([9,11,6]) #Ortsvektor zu P
#Lotfußpunkt als "laufender" Punkt, t Parameter der Geradengleichung:
t = Symbol("t") #Aus SymPy, deklariert t als Variable
vecL=numpy.array([vecAg[0]+numpy.dot(vecvg[0],t),vecAg[1]+numpy.dot(vecvg[1],t),vecAg[2]+numpy.dot(vecvg[2],t)]) #"Laufender" Punkt, unschön
t = solve(numpy.dot(vecL-vecP,vecvg),t) #vecPL*vecvg=0, da Orthogonalitätsbedingung; Solve von SymPy
print(t)
for t[0] in t:
test=numpy.array([vecAg[0]+numpy.dot(vecvg[0],t),vecAg[1]+numpy.dot(vecvg[1],t),vecAg[2]+numpy.dot(vecvg[2],t)]) #Unschön
print(test)
print(numpy.linalg.norm(test)) #AttributeError: 'Integer' object has no attribute 'sqrt'
Also zum einen würde ich vecL gerne noch etwas schöner deklarieren, evtl. mit range() und einer for-Schleife, falls das möglich ist.
Des Weiteren kann ich vecL am Ende nicht noch einmal mit t[0], also einem Integer, aufrufen, und t mit der Zahl ersetzten. Mit C&P klappt's komischerweise.
Zuletzt frage ich mich, warum norm() in der letzten Zeile nicht funktioniert.
mfg
Re: Vektoren mit NumPy: "Laufender" Punkt
Verfasst: Sonntag 20. Juli 2014, 06:04
von MagBen
theCed7 hat geschrieben:vecL=numpy.array([vecAg[0]+numpy.dot(vecvg[0],t),vecAg[1]+numpy.dot(vecvg[1],t),vecAg[2]+numpy.dot(vecvg[2],t)])
In Numpy macht man das so
Wobei t dann kann SymPy Symbol sein darf.
Re: Vektoren mit NumPy: "Laufender" Punkt
Verfasst: Sonntag 20. Juli 2014, 11:45
von theCed7
MagBen hat geschrieben:theCed7 hat geschrieben:vecL=numpy.array([vecAg[0]+numpy.dot(vecvg[0],t),vecAg[1]+numpy.dot(vecvg[1],t),vecAg[2]+numpy.dot(vecvg[2],t)])
In Numpy macht man das so
Wobei t dann kann SymPy Symbol sein darf.
Das war meine Lösung zu beginn. Dann habe ich darn rumgebastelt, weil ich ohne das SymPy-Symbol den "NameError: name 't' is not defined"-Error bekommen habe. Und nach SymPy hab' ich's vergessen wieder zurückzubasteln.
Egal. So sieht's jetzt aus, der Lotfußpunkt funktioniert sowohl parametrisiert, als auch eindeutig.
Code: Alles auswählen
if method == "1":
#Abstand über Orthogonalitätsbedingung
#vecAg=numpy.array(inputnumber("Aufpunkt von g: "))
vecAg=numpy.array([-1,1,-7])
vecvg=numpy.array([2,-1,2])
vecP=numpy.array([9,11,6])
#vecvg=numpy.array(inputnumber("Richtungsvektor von g: "))
#vecp=numpy.array(inputnumber("Ortsvektor zu P: "))
#Lotfußpunkt als "laufender" Punkt, t Parameter der Geradengleichung:
t = Symbol("t") #Aus SymPy, deklariert t als Variable
vecL=vecAg + vecvg*t #"Laufender" Punkt
t = solve(numpy.dot(vecL-vecP,vecvg),t) #vecPL*vecvg=0, da Orthogonalitätsbedingung; Solve von SymPy
print(t)
print(vecL)
print(vecAg+vecvg*t)
print(numpy.linalg.norm(vecAg+vecvg*t)) #AttributeError: 'Integer' object has no attribute 'sqrt'
Einzig die letzte Zeile funktioniert nicht:
Code: Alles auswählen
Traceback (most recent call last):
File "./vektor.py", line 32, in <module>
print(numpy.linalg.norm(vecAg+vecvg*t)) #AttributeError: 'Integer' object has no attribute 'sqrt'
File "/usr/lib/python3.4/site-packages/numpy/linalg/linalg.py", line 2056, in norm
return sqrt(add.reduce((x.conj() * x).real, axis=None))
AttributeError: 'Integer' object has no attribute 'sqrt'
Re: Vektoren mit NumPy: "Laufender" Punkt
Verfasst: Sonntag 20. Juli 2014, 17:25
von MagBen
Du lässt Dir von Sympy die Formel für den Abstand eines Punktes zu einer Linie ausrechnen. Damit machst Du alles nur unnötig kompliziert.
Der ganze Code würde viel einfacher werden, wenn Du die Formel in wenigen Zeilen selbst zu Papier bringen würdest und dann die wenigen Zeilen eins-zu-eins auf Numpy-Code überträgst.