Graphische beschreibung von Matrix Multiplikation
This commit is contained in:
parent
abbafab0b3
commit
e3fccb6a03
37
matrix/projektion.py
Normal file
37
matrix/projektion.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#%%
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import numpy as np
|
||||||
|
from mpl_toolkits.mplot3d import Axes3D
|
||||||
|
|
||||||
|
fig = plt.figure(figsize=(9, 7))
|
||||||
|
ax = fig.add_subplot(111, projection='3d')
|
||||||
|
|
||||||
|
# Vektoren definieren
|
||||||
|
vektoren = {
|
||||||
|
r'$\vec{a}$': (2, -1, 2),
|
||||||
|
r'$P \cdot \vec{a}$': (2, -1, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
farben = ['#2196F3', '#FF5722']
|
||||||
|
|
||||||
|
for (name, wert), farbe in zip(vektoren.items(), farben):
|
||||||
|
ax.quiver(0, 0, 0, *wert, color=farbe, lw=2.5, arrow_length_ratio=0.1)
|
||||||
|
# Beschriftung am Pfeilende
|
||||||
|
ax.text(wert[0] * 1.05, wert[1] * 1., wert[2] + 0.1,
|
||||||
|
name, fontsize=13, color=farbe, fontweight='bold')
|
||||||
|
|
||||||
|
# Projektion von a auf die xy-Ebene gestrichelt
|
||||||
|
ax.plot([2, 2], [-1, -1], [0, 2], 'k--', lw=1, alpha=0.5)
|
||||||
|
|
||||||
|
# Achsen
|
||||||
|
ax.set_xlabel('x')
|
||||||
|
ax.set_ylabel('y')
|
||||||
|
ax.set_zlabel('z')
|
||||||
|
ax.set_title('Projektion', fontsize=14)
|
||||||
|
|
||||||
|
# Ansichtswinkel
|
||||||
|
ax.view_init(elev=20, azim=45)
|
||||||
|
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig('vektoren_3d.png', dpi=150)
|
||||||
|
plt.show()
|
||||||
69
matrix/rotation.py
Normal file
69
matrix/rotation.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#%%
|
||||||
|
import numpy as np
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from matplotlib.patches import Arc
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(figsize=(7, 7))
|
||||||
|
|
||||||
|
# Define vectors
|
||||||
|
a = np.array([2, 2])
|
||||||
|
R90_a = np.array([-2, 2])
|
||||||
|
R135_a = np.array([-2 * np.sqrt(2), 0])
|
||||||
|
|
||||||
|
# Draw vectors
|
||||||
|
vectors = [
|
||||||
|
(a, "steelblue", "$\\vec{a}$"),
|
||||||
|
(R90_a, "coral", "$R(90°)\\vec{a}$"),
|
||||||
|
(R135_a, "seagreen", "$R(135°)\\vec{a}$"),
|
||||||
|
]
|
||||||
|
|
||||||
|
for vec, color, label in vectors:
|
||||||
|
ax.annotate("", xy=vec, xytext=(0, 0),
|
||||||
|
arrowprops=dict(arrowstyle="->", color=color, lw=2))
|
||||||
|
|
||||||
|
# Labels (individual placement for fine control)
|
||||||
|
ax.text(a[0] * 1.1, a[1] * 1.1, "$\\vec{a}$", fontsize=12, color="steelblue",
|
||||||
|
ha="center", va="center")
|
||||||
|
ax.text(R90_a[0] * 1.1, R90_a[1] * 1.1, "$R(90°)\\vec{a}$", fontsize=12, color="coral",
|
||||||
|
ha="center", va="center")
|
||||||
|
ax.text(R135_a[0] - 0.4, R135_a[1], "$R(135°)\\vec{a}$", fontsize=12, color="seagreen",
|
||||||
|
ha="center", va="center")
|
||||||
|
|
||||||
|
# Compute angles from x-axis
|
||||||
|
angle_a = np.degrees(np.arctan2(a[1], a[0]))
|
||||||
|
angle_R90 = np.degrees(np.arctan2(R90_a[1], R90_a[0]))
|
||||||
|
angle_R135 = np.degrees(np.arctan2(R135_a[1], R135_a[0]))
|
||||||
|
|
||||||
|
# Arc 1: angle between a and R(90°)×a
|
||||||
|
arc1 = Arc((0, 0), 2.0, 2.0, angle=0,
|
||||||
|
theta1=angle_a, theta2=angle_R90,
|
||||||
|
color="coral", linestyle="--", lw=1.5)
|
||||||
|
ax.add_patch(arc1)
|
||||||
|
|
||||||
|
mid1 = np.radians((angle_a + angle_R90) / 2)
|
||||||
|
ax.text(1.2 * np.cos(mid1), 1.2 * np.sin(mid1),
|
||||||
|
f"{angle_R90 - angle_a:.0f}°", fontsize=11, color="coral",
|
||||||
|
ha="center", va="center")
|
||||||
|
|
||||||
|
# Arc 2: angle between a and R(135°)×a
|
||||||
|
arc2 = Arc((0, 0), 3.2, 3.2, angle=0,
|
||||||
|
theta1=angle_a, theta2=angle_R135,
|
||||||
|
color="seagreen", linestyle="--", lw=1.5)
|
||||||
|
ax.add_patch(arc2)
|
||||||
|
|
||||||
|
mid2 = np.radians((angle_a + angle_R135) / 2)
|
||||||
|
ax.text(1.9 * np.cos(mid2), 1.9 * np.sin(mid2),
|
||||||
|
f"{angle_R135 - angle_a:.0f}°", fontsize=11, color="seagreen",
|
||||||
|
ha="center", va="center")
|
||||||
|
|
||||||
|
# Axes
|
||||||
|
ax.axhline(0, color="lightgray", lw=0.5)
|
||||||
|
ax.axvline(0, color="lightgray", lw=0.5)
|
||||||
|
ax.set_xlim(-4, 3)
|
||||||
|
ax.set_ylim(-0.5, 3)
|
||||||
|
ax.set_aspect("equal")
|
||||||
|
ax.grid(True, alpha=0.3)
|
||||||
|
ax.set_title("Rotation zu $\\vec{a}$")
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.show()
|
||||||
|
# %%
|
||||||
34
matrix/streckung_stauchung.py
Normal file
34
matrix/streckung_stauchung.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#%%
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(figsize=(8, 8))
|
||||||
|
|
||||||
|
# Vektoren definieren
|
||||||
|
vektoren = {
|
||||||
|
r'$\vec{a}$': (2, 1),
|
||||||
|
r'$S \cdot \vec{a}$': (1, 2),
|
||||||
|
r'$S \cdot (S \cdot \vec{a})$': (0.5, 4)
|
||||||
|
}
|
||||||
|
|
||||||
|
farben = ['#2196F3', '#FF5722', '#4CAF50']
|
||||||
|
|
||||||
|
for (name, wert), farbe in zip(vektoren.items(), farben):
|
||||||
|
ax.annotate('', xy=wert, xytext=(0, 0),
|
||||||
|
arrowprops=dict(arrowstyle='->', lw=2.5, color=farbe))
|
||||||
|
ax.text(wert[0] * 0.5 + 0.2, wert[1] * 0.5 + 0.2, name,
|
||||||
|
fontsize=13, color=farbe, fontweight='bold')
|
||||||
|
|
||||||
|
# Achsen und Gitter
|
||||||
|
ax.axhline(0, color='grey', lw=0.5)
|
||||||
|
ax.axvline(0, color='grey', lw=0.5)
|
||||||
|
ax.set_xlim(-0.5, 3)
|
||||||
|
ax.set_ylim(-0.5, 4.5)
|
||||||
|
ax.set_aspect('equal')
|
||||||
|
ax.grid(True, alpha=0.3)
|
||||||
|
ax.set_title('Strecken / Stauchung', fontsize=14)
|
||||||
|
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig('vektoren.png', dpi=150)
|
||||||
|
plt.show()
|
||||||
|
# %%
|
||||||
Loading…
x
Reference in New Issue
Block a user