SejeteralO — Modèle tarifaire Bézier

Tarification participative de l'eau : les citoyens façonnent une courbe prix/volume via des points de contrôle Bézier ; le prix d'inflexion $p_0$ est calculé automatiquement pour équilibrer les recettes de la commune.

1. Paramètres

Paramètres structurels (fixés par la commune)

ParamètreSignification
$v_\text{inf}$Volume d'inflexion — frontière entre les deux paliers (m³/an)
$v_\text{max}$Volume maximum de la courbe (m³/an)
$p_\text{max}$Prix au m³ en $v_\text{max}$ (€)
$R$Recettes cibles totales (€/an)
$\text{abo}_P, \text{abo}_S$Abonnements résidence principale / secondaire (€/an)

Paramètres de forme (votés par les citoyens, 6 valeurs dans $[0,1]$)

Param.Rôle géométrique
$a$Hauteur du 2ᵉ point de contrôle du palier 1 (courbure initiale)
$b$Position horizontale du 3ᵉ point de contrôle du palier 1
$c$Position horizontale du 1ᵉʳ point de contrôle du palier 2
$d$Position horizontale du 2ᵉ point de contrôle du palier 2
$e$Hauteur du 2ᵉ point de contrôle du palier 2

Variable calculée

$p_0$ — prix au m³ à l'inflexion — est toujours déduit de l'équilibre de recettes (§4).


2. Courbe Bézier cubique par paliers

La courbe prix/volume est définie de façon paramétrique : pour $t \in [0,1]$, on obtient un point $(v(t),\, p(t))$.

Palier 1 — $v \in [0,\, v_\text{inf}]$

$$v_1(t) = v_\text{inf}\,\bigl[(1-3b)\,t^3 + 3b\,t^2\bigr]$$ $$p_1(t) = p_0\,\bigl[(3a-2)\,t^3 + (3-6a)\,t^2 + 3a\,t\bigr]$$

Points de contrôle :

$P_1 = (0,\; 0)$ $P_2 = (0,\; a\,p_0)$ $P_3 = (b\,v_\text{inf},\; p_0)$ $P_4 = (v_\text{inf},\; p_0)$

Palier 2 — $v \in [v_\text{inf},\, v_\text{max}]$

Posons $w_\text{max} = v_\text{max} - v_\text{inf}$.

$$v_2(t) = v_\text{inf} + w_\text{max}\,\Bigl[\bigl(3(c+d-cd)-2\bigr)\,t^3 + 3(1-2c-d+cd)\,t^2 + 3c\,t\Bigr]$$ $$p_2(t) = p_0 + (p_\text{max}-p_0)\,\bigl[(1-3e)\,t^3 + 3e\,t^2\bigr]$$

Points de contrôle (partagent $P_4$ avec le palier 1) :

$P_4 = (v_\text{inf},\; p_0)$ $P_5 = (v_\text{inf}+c\,w_\text{max},\; p_0)$ $P_6 = \bigl(v_\text{inf}+w_\text{max}(1-d+cd),\; p_0+e(p_\text{max}-p_0)\bigr)$ $P_7 = (v_\text{max},\; p_\text{max})$

3. Facture d'un foyer

La facture annuelle d'un foyer de consommation $v$ est :

$$\text{Bill}(v) = \text{abo} + \int_0^v p(u)\,\mathrm{d}u$$

L'intégrale est calculée analytiquement par décomposition :

$$\int_0^v p(u)\,\mathrm{d}u = (\alpha_1 + \alpha_2)\,p_0 + \beta_2$$

où les trois coefficients dépendent uniquement de la forme de la courbe (paramètres $a$–$e$, $v_\text{inf}$, $v_\text{max}$, $p_\text{max}$) et de la consommation $v$, mais pas de $p_0$. Cela rend le calcul de $p_0$ linéaire.

Résolution cubique — inversion de la courbe

Pour évaluer les coefficients en un volume $v$ donné, on cherche $T$ tel que $v_i(T) = v$.

Palier 1 ($v \leq v_\text{inf}$) — résoudre en $T_1 \in [0,1]$ :

$$(1-3b)\,T_1^3 + 3b\,T_1^2 - \frac{v}{v_\text{inf}} = 0$$

Palier 2 ($v > v_\text{inf}$) — posons $w = v - v_\text{inf}$, résoudre en $T_2 \in [0,1]$ :

$$\bigl(3(c+d-cd)-2\bigr)\,T_2^3 + 3(1-2c-d+cd)\,T_2^2 + 3c\,T_2 - \frac{w}{w_\text{max}} = 0$$

Ces cubiques sont résolues par la formule de Cardano avec affinement Newton-Raphson.

Coefficient $\alpha_1$ — intégrale du palier 1

$$\alpha_1(T_1) = 3\,v_\text{inf}\left[ \frac{-9ab+3a+6b-2}{6}\,T_1^6 +\frac{24ab-6a-13b+3}{5}\,T_1^5 +\frac{3(-7ab+a+2b)}{4}\,T_1^4 +2ab\,T_1^3 \right]$$

Si $v \leq v_\text{inf}$ : on utilise le $T_1$ résolu ci-dessus. Si $v > v_\text{inf}$ : $\alpha_1 = \alpha_1(1)$ (palier 1 entier).

Coefficients $\alpha_2$ et $\beta_2$ — intégrale du palier 2

Posons l'auxiliaire :

$$u(T_2) = \frac{-3cd+9ecd+3c-9ec+3d-9ed+6e-2}{6}\,T_2^6 \\[4pt] +\frac{2cd-15ecd-4c+21ec-2d+15ed-12e+2}{5}\,T_2^5 \\[4pt] +\frac{6ecd+c-15ec-6ed+6e}{4}\,T_2^4 +ec\,T_2^3$$

Alors :

$$\alpha_2 = (v - v_\text{inf}) - 3\,u(T_2)\,w_\text{max}$$ $$\beta_2 = 3\,p_\text{max}\,w_\text{max}\,u(T_2)$$

Si $v \leq v_\text{inf}$ : $\alpha_2 = \beta_2 = 0$.


4. Équilibre de recettes — calcul de $p_0$

En substituant la décomposition $(\alpha_1+\alpha_2)\,p_0+\beta_2$ dans la somme des factures :

$$R = \sum_{i} \text{abo}_i + \sum_{i}\bigl[(\alpha_{1,i}+\alpha_{2,i})\,p_0 + \beta_{2,i}\bigr]$$

Comme les $\alpha$ et $\beta$ ne dépendent pas de $p_0$, on obtient directement :

$$\boxed{p_0 = \frac{R - \displaystyle\sum_i \text{abo}_i - \displaystyle\sum_i \beta_{2,i}}{\displaystyle\sum_i (\alpha_{1,i} + \alpha_{2,i})}}$$

$p_0$ est calculé une fois par évaluation de la courbe. Si $\sum\alpha = 0$ (tous les foyers consomment 0), on pose $p_0 = 0$.


5. Résumé du pipeline de calcul

  1. Les citoyens placent des points de contrôle → paramètres $(a,b,c,d,e,v_\text{inf})$.
  2. Pour chaque foyer $i$, calculer $\alpha_{1,i}$, $\alpha_{2,i}$, $\beta_{2,i}$ par inversion cubique.
  3. Calculer $p_0$ par la formule d'équilibre.
  4. Facture de chaque foyer : $\text{Bill}_i = \text{abo}_i + (\alpha_{1,i}+\alpha_{2,i})\,p_0 + \beta_{2,i}$.
  5. Vérification : $\sum_i \text{Bill}_i = R$ (à précision numérique).

Sources : backend/app/engine/pricing.py · backend/app/engine/integrals.py · frontend/app/utils/bezier-math.ts