Python :: Aufgabe #275

1 Lösung Lösung öffentlich

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

Lösungen:

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

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.