kleine Änderungen
This commit is contained in:
parent
0f9c815b86
commit
dc088fa214
47 changed files with 183868 additions and 573 deletions
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in a new issue