Hi, mein Problem ist folgendes:
Ich habe eine Geradengleichung in Parameterform, also
x = a + lambda * b, wobei a, b und x vektoren sind. Gibt es eine Funktion (bzw eine numpy.linalg Funktion würde ich annehmen), die so etwas nach lambda auflöst? Numpy.linalg.solve löst doch nur Gleichungen der Form a*x=b oder?
Danke für jeden Tipp!
Parametergleichung einer Geraden lösen
- __blackjack__
- User
- Beiträge: 14056
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Ich weiss nicht was Du mit auflösen meinst? Das kann man doch recht einfach manuell machen und dann als Funktion umsetzen. Programmatisch ginge so etwas mit `sympy`:
Code: Alles auswählen
In [200]: from sympy.abc import a, b, x, lamda
In [201]: sympy.solve(sympy.Eq(x, a + lamda * b), [lamda])
Out[201]: [(-a + x)/b]
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Vielen Dank schonmal!
Ich brauche das als Funktion, weil ich vorher im code arrays a, b, und x definiert habe, die aber von anderen Faktoren in einer for- Schleife abhängig sind (also die arrays haben nicht immer die selben werte). Für die jeweiligen Einträge in a,b und x, die vorher in der for Schleife rauskommen, müsste ich dann die Geradengleichung lösen.
Mit sympy kenne ich mich leider gar nicht aus und so wie du es vorgeschlagen hast, hat es bis jetzt leider nicht funktioniert bei mir. Müsste das in meinem Fall dann doch irgendwie anders sein, so wie ich das Problem jetzt nochmal genauer erklärt habe?
Ich brauche das als Funktion, weil ich vorher im code arrays a, b, und x definiert habe, die aber von anderen Faktoren in einer for- Schleife abhängig sind (also die arrays haben nicht immer die selben werte). Für die jeweiligen Einträge in a,b und x, die vorher in der for Schleife rauskommen, müsste ich dann die Geradengleichung lösen.
Mit sympy kenne ich mich leider gar nicht aus und so wie du es vorgeschlagen hast, hat es bis jetzt leider nicht funktioniert bei mir. Müsste das in meinem Fall dann doch irgendwie anders sein, so wie ich das Problem jetzt nochmal genauer erklärt habe?
Wenn dich interessiert, wie gross lambda ist, dann musst du doch nur
|(x - a)| / |b|
rechnen, also den Ortsvektor vom gegebenen Punkt abziehen, und dessen Laenge durch die Laenge des Richtungsvektors teilen. Aber Achtung, das ist natuerlich nur gueltig, so lange x-a eine skalierter b ist! Das kann man auf verschieden Arten pruefen, aber im Zweifel ist die einfachste Art, das gleich in einem Schritt zu machen, und
v = x - a
l_x = v[0] / b[0]
l_y = v[1] / b[1]
zu rechnen. Und wenn l_x == l_y (modulo ein bisschen numerischer Ungenauigkeit), dann ist das sowohl eine Loesung, als auch die Antwort.
Wobei das natuerlich nicht klappt fuer b[0] ober b[1] == 0 ... hmm.
Dann eben doch zu Fuss: zuerst fuer ein b den Normalenvektor n bilden, n * v rechnen, und wenn das 0 ist, dann mit der ersten Formel lambda bestimmen.
Das ist alles ein bisschen sehr zu Fuss, aber mit den abstakteren Gleichungsloesungen habe ich einfach keine Erfahrung.
|(x - a)| / |b|
rechnen, also den Ortsvektor vom gegebenen Punkt abziehen, und dessen Laenge durch die Laenge des Richtungsvektors teilen. Aber Achtung, das ist natuerlich nur gueltig, so lange x-a eine skalierter b ist! Das kann man auf verschieden Arten pruefen, aber im Zweifel ist die einfachste Art, das gleich in einem Schritt zu machen, und
v = x - a
l_x = v[0] / b[0]
l_y = v[1] / b[1]
zu rechnen. Und wenn l_x == l_y (modulo ein bisschen numerischer Ungenauigkeit), dann ist das sowohl eine Loesung, als auch die Antwort.
Wobei das natuerlich nicht klappt fuer b[0] ober b[1] == 0 ... hmm.
Dann eben doch zu Fuss: zuerst fuer ein b den Normalenvektor n bilden, n * v rechnen, und wenn das 0 ist, dann mit der ersten Formel lambda bestimmen.
Das ist alles ein bisschen sehr zu Fuss, aber mit den abstakteren Gleichungsloesungen habe ich einfach keine Erfahrung.