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')