Vektoren mit NumPy: "Laufender" Punkt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
theCed7
User
Beiträge: 6
Registriert: Samstag 19. Juli 2014, 15:42

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. :)
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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.
a fool with a tool is still a fool, www.magben.de, YouTube
theCed7
User
Beiträge: 6
Registriert: Samstag 19. Juli 2014, 15:42

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
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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.
a fool with a tool is still a fool, www.magben.de, YouTube
theCed7
User
Beiträge: 6
Registriert: Samstag 19. Juli 2014, 15:42

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'
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten