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

Code: Alles auswählen

vecL=vecAg + vecvg*t
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

Code: Alles auswählen

vecL=vecAg + vecvg*t
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. :roll:

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.