12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import numpy as np
- import cvxpy as cp
- class PowerSupply:
- def __init__(self):
- pass
- def power(self):
- pass
- class IntermittentArray(PowerSupply):
- def __init__(self,
- potential: np.ndarray,
- units_per_region: np.ndarray
- ):
- self.potential = potential
- self.units_per_region = units_per_region
- def power(self):
- return np.einsum('ijk,ik', self.potential, self.units_per_region)
- class DispatchableArray(PowerSupply):
- def __init__(self,
- dispatchable: np.ndarray
- ):
- self.dispatchable = np.array(dispatchable)
- self.n_dispatchable_sources = self.dispatchable.shape[0]
- def power(self, gap: np.ndarray) -> np.ndarray:
- # optimize dispatch
- T = len(gap)
- dispatch_power = cp.Variable((self.n_dispatchable_sources, T))
- constraints = [
- dispatch_power >= 0,
- cp.sum(dispatch_power, axis=0) <= np.maximum(gap, 0)
- ] + [
- dispatch_power[i,:] <= self.dispatchable[i,0]
- for i in range(self.n_dispatchable_sources)
- ] + [
- cp.sum(dispatch_power[i]) <= self.dispatchable[i,1]*T/(365.25*24)
- for i in range(self.n_dispatchable_sources)
- ]
- prob = cp.Problem(
- cp.Minimize(
- cp.sum(cp.pos(gap-cp.sum(dispatch_power, axis=0)))
- ),
- constraints
- )
- prob.solve(solver=cp.ECOS, max_iters=300)
- dp = dispatch_power.value
- return dp
|