import matplotlib.pyplot as plt

# résistances des lignes
R1 = 0.05
R2 = 0.25
R3 = 0.25
R4 = 0.25
print( " R1 = " , R1 , " Ohms" )
print( " R2 = " , R2 , " Ohms" )
print( " R3 = " , R3 , " Ohms" )
print( " R4 = " , R4 , " Ohms" )
print("--------")

# courants maximum des générateurs
i1_max = 4.5
i2_max = 5
print( " i1 max = " , i1_max , " A" )
print( " i2 max = " , i2_max , " A" )
print("--------")

# courants consommés par les clients
i_3 = 4
i_4 = 2
print( " i3     = " , i_3 , " A" )
print( " i4     = " , i_4 , " A" )
print("--------")

# bornes des courants sur le graphique
i_min = 0
i_max = 14

# nombre de points sur la courbe
N = 100

# calcul des constantes
K = i_3 + i_4
c = R3 * i_3 * i_3 + R4 * i_4 * i_4
print( " K = " , K )
print( " c = " , c )
print("--------")

# calcul de la courbe des puissances joule
courant = []
puissance = []
for n in range( 0 , N ):
	i = i_min + (i_max - i_min ) * n / N
	courant.append( i )
	p = R1 * i**2 + R2 * ( K - i )**2 + c
	puissance.append( p )
		
# calcul de la courbe des puissances possibles
courant_pos = []
puissance_pos = []
for n in range( 0 , N ):
	i = courant[n]
	p = puissance[n]
	if (i >= K-i2_max ) and ( i <= i1_max) :
		courant_pos.append( i )
		puissance_pos.append( p )	
		
# recherche de la puissance minimale
p_min = min( puissance_pos )
print(" puissance minimum : " , p_min ," W")
n = puissance_pos.index( p_min )
i_opt = courant_pos[n]
print(" courant optimum : " , i_opt ," A" )
print("--------")

# tracé du graphique
fig, ax = plt.subplots( figsize = (4,4) )

# courbe théorique
ax.plot( courant , puissance , linewidth=1 , ls="--" )

# courbe possible
ax.plot( courant_pos , puissance_pos , linewidth=2, color="red")

# point de fonctionnement optimum
ax.plot( i_opt , p_min , 'ro' )
	
# légende du graphique	
ax.set_title( 'Optimisation du réseau')
ax.set_xlabel('Courant $I_1$ / A')
ax.set_xlim(i_min, i_max)
ax.set_ylabel('Puissance dissipée / W')
ax.set_ylim(bottom=0)
plt.grid()

# affichage, sauvegarde graphique
plt.savefig("optimisation_3.pdf")
plt.show()    

