kleine Änderungen

This commit is contained in:
dschlueter 2026-09-09 07:37:07 +02:00
commit dc088fa214
47 changed files with 183868 additions and 573 deletions

View file

@ -50,6 +50,7 @@ BASIS = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
BILDER = os.path.join(BASIS, "bilder_04")
INDIGO, CYAN, AMBER, GRUEN = "#4338ca", "#0891b2", "#b45309", "#059669"
VIOLETT = "#7c3aed" # Niveaulinien und Zielfunktionsgradient
# Modell wortgleich zu Visualisierung_Loesungsraum.py
C = np.array([150.0, 250.0])
@ -200,12 +201,46 @@ def zeichne_polyeder(ecken: np.ndarray, bestes: np.ndarray) -> None:
schreibe(figur, "kap_fundament_polyeder")
def zeichne_niveaulinien(achse, besucht: list[np.ndarray]) -> None:
"""Eine Niveaulinie der Zielfunktion durch JEDE besuchte Ecke.
Die Niveaus werden aus dem Weg gerechnet, nicht gewaehlt: Jede Ecke des
Simplexwegs liegt damit auf genau einer Linie, und der Abstand der Linien
ist der Fortschritt eines Schritts. Damit zeigt das Bild nicht nur, WELCHEN
Weg der Simplex nimmt, sondern warum - er schiebt die Linie so weit nach
aussen, wie das Polyeder es zulaesst."""
x = np.linspace(-0.9, 11.4, 100)
for punkt in besucht:
niveau = float(C @ punkt)
achse.plot(x, (niveau - C[0] * x) / C[1], linestyle=":",
color=VIOLETT, linewidth=1.3, alpha=0.9, zorder=2)
# Beschriftung dort, wo die Linie im Bild noch Platz hat. Die
# Nulllinie laeuft nahe am unteren Rand - ihre Beschriftung gehoert
# darueber, sonst wird sie abgeschnitten.
unten = niveau < 500
x_text = 1.7 if unten else 10.1
y_linie = (niveau - C[0] * x_text) / C[1]
achse.text(x_text, y_linie + (0.16 if unten else -0.28),
f"Z = {euro(niveau)}", fontsize=7.5, color=VIOLETT,
ha="center", va="bottom" if unten else "top", zorder=6)
# Der Gradient: die Richtung, in die sich die Linien verschieben lassen.
start = np.array([2.6, 2.2])
ende = start + C / np.linalg.norm(C) * 2.6
achse.annotate("", xy=tuple(ende), xytext=tuple(start),
arrowprops=dict(arrowstyle="-|>", color=VIOLETT,
linewidth=2.2), zorder=6)
achse.text(ende[0] + 0.15, ende[1], "$\\mathbf{c} = (150; 250)$",
fontsize=8.5, color=VIOLETT, va="center", zorder=6)
def zeichne_simplexweg(ecken: np.ndarray, bestes: np.ndarray) -> None:
"""LP-Kapitel: derselbe Bereich, aber der Weg der Handrechnung."""
figur, achse = plt.subplots(figsize=(7.2, 5.2))
zeichne_rahmen(achse, ecken)
besucht = [np.array(p) for p in SIMPLEXWEG]
zeichne_niveaulinien(achse, besucht)
unbesucht = [e for e in ecken
if not any(np.allclose(e, p) for p in besucht)]
for ecke in unbesucht: