This project implements the dynamic programming tool proposed in this paper (published here)and available in the R Software in the ConConPiWiFun package
If you want to install the package from source, you can do
pip install git+https://github.com/robingirard/dynprogstorage#egg=dynprogstorage
This tool allows you to solve problems with the form
## min_x sum_i phi_i(x_i) phi_i : convex piecewise linear function
## P_i^-<= x_i <=P_i^+
## C_i^-<= x_0 + sum_j=0^i x_j <= C_i^+
Let us give a few examples of use
While participating in the market with a 100% efficiency storage you want to maximize the profit
## min_x sum_i Pi_i x_i ( phi_i linear function)
## -p_max <= x_i <=p_max
## 0<= x_0 + sum_j=0^i x_j <= c_max
## x_i>0 : consumption from the network
## x_i<0 : producing (injection to network)
### --> phi_i(x_i) is a buying cost we want to minimize
The code you need to use is :
## Definition of values
x_0=0
nbTime=250
Prices=random.uniform(1, 1000, nbTime)
p_max=1.
c_max=10.*p_max
## Generation of a vector of cost functions
cpl_func = GenCostFunctionFromMarketPrices(Prices.tolist())
cpl_func.vec_get(0).getBreakPoints() ## what does the first cost function look like
## now solve the optimisation problem
res = cpl_func.OptimMargInt([-p_max]*nbTime,[p_max]*nbTime,[-x_0]*nbTime,[c_max-x_0]*nbTime)
print(res)
## Visualisation of results (power) with prices
period=100
plt.plot(res[:100])
plt.plot(-(Prices[:100]-Prices.mean())/Prices.max())
plt.ylabel("Puissance (MW)")
plt.xlabel("Index")
plt.show()
## Visualisation of Energy evolution
energie=np.cumsum(res)
plt.plot(energie[:100], color='g')
plt.plot([0]*100, color='b')
plt.plot([c_max]*100, color='b')
plt.ylabel("Energie (MWh)")
plt.xlabel("Index")
plt.show()