Python :: Aufgabe #275
1 Lösung
Mathematische Vektoroperationen
Anfänger - Python
von thunderbird
- 28.04.2020 um 21:51 Uhr
Erstellen Sie ein Programm/ eine Funktion, mit der Vektorberechnungen durchgeführt werden können.
"Vektor" soll eine eigens erstellte Klasse sein, die aus 3 Fließkommazahlen bestehen.
Zudem beinhaltet die Klasse "Vektor" eine Methode zur Skalarmultiplikation, Addition, Subtraktion, Division und um das Kreuzprodukt zu berrechnen.
Erstellen Sie zur Darstellung eine Ausgabemethode.
Hinweis:
- Anstatt neue Methoden zu erstellen, können (sofern möglich) bereits vorhandene überladen werden.
- Mathematische Rechenregeln unter: https://de.wikipedia.org/wiki/Vektor
"Vektor" soll eine eigens erstellte Klasse sein, die aus 3 Fließkommazahlen bestehen.
Zudem beinhaltet die Klasse "Vektor" eine Methode zur Skalarmultiplikation, Addition, Subtraktion, Division und um das Kreuzprodukt zu berrechnen.
Erstellen Sie zur Darstellung eine Ausgabemethode.
Hinweis:
- Anstatt neue Methoden zu erstellen, können (sofern möglich) bereits vorhandene überladen werden.
- Mathematische Rechenregeln unter: https://de.wikipedia.org/wiki/Vektor
Lösungen:
Die Klasse Vektor kann mit n-dimensionalen Vektoren umgehen (siehe Beispiele).
Python-Code
import sys
# Dezimalstellen, auf die Floatwerte im Vektor gerundet werden
FLOAT_DIMENSION = 2
class Vektor:
def __init__(self, *args):
try:
self.vector = [float(item) for item in args]
except ValueError:
sys.exit('Vektorelement muss numerisch sein. PROGRAMMABBRUCH.')
self.dimension = len(self.vector)
def __add__(self, other):
if self.dimension != other.dimension:
sys.exit('Vektoren unterschiedlicher Dimensionen können nicht addiert werden. PROGRAMMABBRUCH.')
return round(Vektor(*[self.vector[index] + other.vector[index] for index in range(self.dimension)]))
def __sub__(self, other):
if self.dimension != other.dimension:
sys.exit('Vektoren unterschiedlicher Dimensionen können nicht addiert werden. PROGRAMMABBRUCH.')
return round(Vektor(*[self.vector[index] - other.vector[index] for index in range(self.dimension)]))
def __mul__(self, other):
if isinstance(other, Vektor):
return round(sum(self.vector[index] * other.vector[index] for index in range(len(self.vector))),
FLOAT_DIMENSION)
elif isinstance(other, (int, float)) and not isinstance(other, bool):
return round(Vektor(*[self.vector[index] * other for index in range(self.dimension)]))
else:
sys.exit('Ungültiger Faktor für die Multiplikation. Es muss eine reelle Zahl oder ein Vektor '
'angegeben werden. PROGRAMMABRUCH.')
def kreuz(self, other):
if not (isinstance(other, Vektor) and other.dimension == 3 and self.dimension == 3):
return 'Das Kreuzprodukt wird nur für dreidimensionale Vektoren berechnet.'
else:
return round(Vektor(
self.vector[1] * other.vector[2] - self.vector[2] * other.vector[1],
self.vector[2] * other.vector[0] - self.vector[0] * other.vector[2],
self.vector[0] * other.vector[1] - self.vector[1] * other.vector[0]))
def __str__(self):
return f'Vektor({"/".join(map(str, self.vector))})'
def __round__(self, n=FLOAT_DIMENSION):
for index in range(self.dimension):
self.vector[index] = round(self.vector[index], n)
return self
examples = [
(Vektor(2, -5), Vektor(-3, 4), 4), # Beispiel zweidimensionale Vektoren
(Vektor(1.3, 2.5, 3.2), Vektor(0.6, -0.5, 1.8), 2), # Beispiel dreidimensionale Vektoren
(Vektor(3, -5, 2, -9), Vektor(2, -3, -2, 6), -4) # Beispiel vierdimensionale Vektoren
]
for example in examples:
v1, v2, skalar = example
print(f'Beispiel für {v1.dimension}-dimensionale Vektoren\n{"-"*36}')
print(f'Die Addition von {v1} und {v2} ergibt {v1+v2}.')
print(f'Die Subtraktion von {v1} und {v2} ergibt {v1-v2}.')
print(f'Das Skalarprodukt von {v1} und {v2} beträgt {v1*v2}.')
print(f'Die Multiplikation von {v1} mit dem Skalar {skalar} ergibt {v1*skalar}.')
print(f'Das Kreuzprodukt von {v1} und {v2} beträgt {v1.kreuz(v2)}.\n') if v1.dimension == 3 and v2.dimension == 3 \
else print(f'{v1.kreuz(v2)}\n')