Python :: Aufgabe #275 :: Lösung #1

1 Lösung Lösung öffentlich
#275

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
#1
vote_ok
von Klaus (1960 Punkte) - 12.06.2020 um 16:14 Uhr
Die Klasse Vektor kann mit n-dimensionalen Vektoren umgehen (siehe Beispiele).
Quellcode ausblenden 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')

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
1996457

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.