# -*- coding: utf-8 -*- """ Created on Thu Mar 26 12:01:11 2026 @author: J. Grabow (Feinmechaniker) """ import numpy as np import matplotlib.pyplot as plt # --- 1. Konfiguration --- STUNDEN_PRO_WOCHE = 168 ZEITPUNKTE = 8000 t = np.linspace(0, STUNDEN_PRO_WOCHE, ZEITPUNKTE) basis_preis = 1.70 def simuliere_marktszenarien_final(): p1, p2 = [], [] current_p2 = basis_preis for h in t: uhrzeit = h % 24 ist_geschlossen = (uhrzeit < 6) or (uhrzeit > 22) if ist_geschlossen: p1.append(np.nan); p2.append(np.nan) continue # --- Szenario 1: Dynamisch (Pendler-Peaks treiben Preis HOCH) --- # Peaks um 08:00 und 17:00 pendler_hoch = 0.11 * np.exp(-((uhrzeit - 8)**2)/1.2) + 0.10 * np.exp(-((uhrzeit - 17)**2)/1.8) wettbewerb_s1 = -0.06 * (uhrzeit - 6) / 16 p1.append(basis_preis + pendler_hoch + wettbewerb_s1) # --- Szenario 2: Reguliert (Plateaus zu Stoßzeiten) --- if 11.95 < uhrzeit < 12.05: current_p2 = basis_preis + 0.18 # Der tägliche Mittagssprung elif (7.0 <= uhrzeit <= 9.0) or (16.0 <= uhrzeit <= 19.0): # PLATEAU: Keine Preisänderung während der Stoßzeiten pass else: # Senkung nur in den "Nebenzeiten" current_p2 -= 0.015 / 24 p2.append(current_p2) return np.array(p1), np.array(p2) preise_s1, preise_s2 = simuliere_marktszenarien_final() # --- 2. Daten für Tagesanalyse (24h) --- tag_mask = (t >= 0) & (t <= 24) t_tag = t[tag_mask]; p1_tag = preise_s1[tag_mask]; p2_tag = preise_s2[tag_mask] # Minima für die grünen Punkte idx_min1 = np.nanargmin(p1_tag); idx_min2 = np.nanargmin(p2_tag) # --- 3. Visualisierung --- fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 12)) # Grafik 1: Wochenübersicht ax1.plot(t, preise_s1, label='Szenario 1: Dynamisch (Peaks)', color='#1f77b4', alpha=0.5) ax1.plot(t, preise_s2, label='Szenario 2: Reguliert (Doppel-Plateau)', color='#ff7f0e', linewidth=2) ax1.set_title('Wochenübersicht: Marktdynamik vs. Reguliertes Doppel-Plateau', fontsize=14) ax1.grid(True, linestyle=':', alpha=0.6); ax1.legend() # Grafik 2: Tagesvergleich mit Stoßzeit-Markierung ax2.plot(t_tag, p1_tag, color='#1f77b4', linewidth=2, label='Szenario 1 (Preis-Spitzen)') ax2.plot(t_tag, p2_tag, color='#ff7f0e', linewidth=2.5, label='Szenario 2 (Preis-Stagnation)') # Stoßzeiten schattieren ax2.axvspan(7, 9, color='red', alpha=0.07, label='Stoßzeit (Morgen/Abend)') ax2.axvspan(16, 19, color='red', alpha=0.07) # Grüne Punkte für die Bestpreise ax2.scatter(t_tag[idx_min1], np.nanmin(p1_tag), color='limegreen', s=130, edgecolors='black', zorder=5, label=f'Bestpreis S1 ({t_tag[idx_min1]:.1f}h)') ax2.scatter(t_tag[idx_min2], np.nanmin(p2_tag), color='forestgreen', s=130, edgecolors='black', zorder=5, label=f'Bestpreis S2 ({t_tag[idx_min2]:.1f}h)') ax2.set_title('Tagesvergleich: Preis-Plateaus vs. Nachfrage-Peaks', fontsize=14) ax2.set_xlabel('Uhrzeit (0-24h)'); ax2.set_ylabel('Preis (€)'); ax2.set_xticks(range(0, 25)) ax2.grid(True, linestyle='--', alpha=0.4); ax2.legend(loc='upper right') plt.tight_layout(); plt.show() # --- 4. Statistische Auswertung --- s1_v = preise_s1[~np.isnan(preise_s1)]; s2_v = preise_s2[~np.isnan(preise_s2)] print(f"{'Szenario':<18} | {'Max':<8} | {'Min':<8} | {'Schnitt':<8}") print("-" * 55) print(f"{'S1 (Dynamisch)':<18} | {np.nanmax(s1_v):.3f}€ | {np.nanmin(s1_v):.3f}€ | {np.nanmean(s1_v):.3f}€") print(f"{'S2 (Reguliert)':<18} | {np.nanmax(s2_v):.3f}€ | {np.nanmin(s2_v):.3f}€ | {np.nanmean(s2_v):.3f}€")