∈ ∈
∈ ∈
≥ ≥
≤ ≤ ≤ ≤ ≤ ≤
≤ ≤
# pip install pulp si besoin
import pulp as pl
# ==============================
# Paramètres du problème
# ==============================
T = 24 # nombre d'heures
time_range = range(T)
P_ch_max = 50.0 # kW, puissance max de charge
P_dis_max = 50.0 # kW, puissance max de décharge
E_max = 200.0 # kWh, capacité max de la batterie
eta_ch = 0.95 # rendement de charge
eta_dis = 0.95 # rendement de décharge
E_init = 100.0 # kWh, énergie initiale dans la batterie
# Exemple de profil PV disponible pour la charge batterie (à adapter)
P_PV_ch = {t: 0.0 for t in time_range} # ici mis à 0 pour l'exemple
# ==============================
# Modèle MILP
# ==============================
model = pl.LpProblem("Gestion_Batterie_PV_Reseau", pl.LpMinimize)
# ==============================
# Variables de décision
# ==============================
# Puissance de charge et décharge (continues, >= 0)
P_ch = pl.LpVariable.dicts("P_ch", time_range, lowBound=0, upBound=P_ch_max)
P_dis = pl.LpVariable.dicts("P_dis", time_range, lowBound=0, upBound=P_dis_max)
# Énergie stockée dans la batterie (SoC)
E = pl.LpVariable.dicts("E", time_range, lowBound=0, upBound=E_max)
# Variables binaires pour modes charge / décharge
u_ch = pl.LpVariable.dicts("u_ch", time_range, lowBound=0, upBound=1, cat=pl.LpBinary)
u_dis = pl.LpVariable.dicts("u_dis", time_range, lowBound=0, upBound=1, cat=pl.LpBinary)
# ==============================
# Contraintes
# ==============================
for t in time_range:
# 1) Lien puissances binaires (activation par les binaires)
≤ ≤ ≤ ≤
model += P_ch[t] <= P_ch_max * u_ch[t], f"Ch_binaire_lien_{t}"
model += P_dis[t] <= P_dis_max * u_dis[t], f"Dis_binaire_lien_{t}"
# 2) Interdiction charge ET décharge simultanées
model += u_ch[t] + u_dis[t] <= 1, f"No_ch_and_dis_{t}"
# 3) Bilan d'énergie de la batterie
if t == 0:
# Pour t = 0, on part de E_init
model += (
E[t]
== E_init
+ eta_ch * (P_PV_ch[t] + P_ch[t])
- (1.0 / eta_dis) * P_dis[t]
), f"Bilan_E_0"
else:
model += (
E[t]
== E[t - 1]
+ eta_ch * (P_PV_ch[t] + P_ch[t])
- (1.0 / eta_dis) * P_dis[t]
), f"Bilan_E_{t}"
# 4) Les bornes 0 <= E[t] <= E_max sont déjà assurées par la définition de E
# ==============================
# Objectif (exemple simple)
# ==============================
# Ici, à titre d'exemple, on minimise la somme des puissances de charge
# et décharge (pour avoir un problème bien défini).
# Tu pourras remplacer par ton vrai coût (réseau, pénalités, etc.).
model += pl.lpSum(P_ch[t] + P_dis[t] for t in time_range), "Minimise_flux_batterie"
# ==============================
# Résolution
# ==============================
model.solve(pl.PULP_CBC_CMD(msg=False))
print("Status :", pl.LpStatus[model.status])
for t in time_range:
print(
f"t={t:02d}h : "
f"u_ch={u_ch[t].varValue}, "
f"u_dis={u_dis[t].varValue}, "
f"P_ch={P_ch[t].varValue:.2f} kW, "
f"P_dis={P_dis[t].varValue:.2f} kW, "
f"E={E[t].varValue:.2f} kWh"
)
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!