CENTRALI E CITTA'

Situazione:
Ci sono 2 centrali elettriche C_1 (Aurisina) e C_2 (Monfalcone) che producono, giornalmente, p_1 e p_2 Kw, rispettivamente (p_1 e p_2 sono quantità note che preciseremo numericamente in seguito).

L'energia prodotta dalle 2 centrali viene inviata a 2 città T_1 (Trieste) e T_2 (Gorizia) che consumano, rispettivamente, b_1 e b_2 Kw al giorno (pure quantità note da precisare).

Problema:

Quanti Kw, x_ij,  bisogna inviare da C_i a T_j in modo da esaurire tutta la produzione giornaliera delle 2 centrali e da soddisfare

le richieste delle due città ?

Disponiamo i nostri dati nella la seguente tabella:

> with(linalg):

> with(plots):

> tab:=matrix([[[],T[1],T[2],[]],[C[1],x[1,1],x[1,2],p[1]],[C[2],x[2,1],x[2,2],p[2]],[[],b[1],b[2],[]]]);

tab := matrix([[[], T[1], T[2], []], [C[1], x[1, 1], x[1, 2], p[1]], [C[2], x[2, 1], x[2, 2], p[2]], [[], b[1], b[2], []]])

Se leggiamo in orizzontale (per riga) allora:  x_11+ x_12 deve essere il numero totale dei Kw erogati da C_1; cioè:

> riga1:=x[1,1]+x[1,2]=p[1];

riga1 := x[1, 1]+x[1, 2] = p[1]

Così x_21+ x_22 deve essere il numero totale dei Kw erogati da C_2; cioè:

> riga2:=x[2,1]+x[2,2]=p[2];

riga2 := x[2, 1]+x[2, 2] = p[2]

Ma dobbiamo leggerla anche in verticale per colonna); dunque: x_11+x_21 deve essere il numero dei Kw richiesti da T_1; cioè:

> colonna1:=x[1,1]+x[2,1]=b[1];

colonna1 := x[1, 1]+x[2, 1] = b[1]

Infine, x_12+x_22 deve essere il numero dei Kw richiesti da T_2; cioè:

> colonna2:=x[1,2]+x[2,2]=b[2];

colonna2 := x[1, 2]+x[2, 2] = b[2]

Bisogna dunque vedere se esistono dei valori maggiori o uguali a 0 da assegnare alle variabili (incognite)  x_11, x_12, x_21, x_22, in modo tale da verificare tutte le precedenti 4 "equazioni". Se detti valori non esistono, o le centrali vanno in sovra/sotto produzione o non vengono soddisfatte le richieste delle città; in questo caso, il sistema entra in black-out.

Vediamo intanto se ci sono valori che soddisfano simultaneamente alle precedenti 4 equazioni; cioè parlando in "matematichese",  vediamo se il sistema lineare delle 4 equazioni soprascritte nelle 4 incognite x_11, x_12, x_21, x_22 ammette qualche soluzione.

Coinvolgendo tutte le incognite, il sistema può essere scritto al modo seguente:

1 x_11 + 1 x12 + 0 x_21 + 0 x_22 = p_1

0 x_11 + 0 x12 + 1 x_21 + 1 x_22 = p_2

1 x_11 + 0 x12 + 1 x_21 + 0 x_22 = b_1

0 x_11 + 1 x12 + 0 x_21 + 1 x_22 = b_2

Osserviamo che possiamo estrarre le seguenti due "tabelle" ("matrici"  in matematichese):

> A:=matrix([[1,1,0,0],[0,0,1,1],[1,0,1,0],[0,1,0,1]]);

A := matrix([[1, 1, 0, 0], [0, 0, 1, 1], [1, 0, 1, 0], [0, 1, 0, 1]])

> AA:=matrix([[1,1,0,0,p[1]],[0,0,1,1,p[2]],[1,0,1,0,b[1]],[0,1,0,1,b[2]]]);

AA := matrix([[1, 1, 0, 0, p[1]], [0, 0, 1, 1, p[2]], [1, 0, 1, 0, b[1]], [0, 1, 0, 1, b[2]]])


Ora, sommate le prime due righe (r_1, r_2) di A e sottraete ad  r_1 + r_2 la terza riga r_3. Cosa ottenete ? Ma vediamo subito che si ottiene la quarta riga r_4 !  Dunque si ha:

> rel1:=r[1]+r[2]-r[3]=r[4];

rel1 := r[1]+r[2]-r[3] = r[4]

Inoltre (ma questo è un pò più difficile e coinvolge qualche conoscenza di teoria dei sistemi lineari) si vede che r_1, r_2, r_3 non hanno relazioni fra loro cioè, in parole povere, nessuna delle tre si può trovare dalle altre (in matematichese: sono linearmente indipendenti).

In questa situazione chi ha visto qualcosa sui sistemi lineari saprà che il sistema precedente ammette soluzioni se e solo se vale la relazione (per il teorema di Kronecker-Rouché-Capelli):

> rel2:=p[1]+p[2]-b[1]=b[2];

rel2 := p[1]+p[2]-b[1] = b[2]

Inoltre, lo stesso teorema ci assicura che, se vale la precedente relazione, le soluzioni del sistema sono infinite quaterne che dipendono da un solo parametro che si può scegliere in modo completamente arbitrario.

Finora abbiamo appurato che, per non avere black-out, le produzioni delle centrali ed i consumi delle città  
devono necessariamente rispettare la precedente relazione. Questo ancora non è sufficiente perchè, come abbiamo detto, non devono esserci soluzioni negative.

Cerchiamo di capire geometricamente la situazione. Poiché le soluzioni sono quaterne esse "vivono" in uno spazio a 4 dimensioni e, come chi ha studiato un pò d'algebra lineare ben sa, formano una "retta" di tale spazio. Chiaramente quest'ambiente non possiamo visualizzarlo (ci vorrebbe ET!), ma possiamo immaginarlo estrapolando quello che succede in tre dimensioni.  Dunque, pensiamo di essere nello spazio ordinario e supponiamo che le soluzioni siano una retta. Come deve essere posta tale retta perché non ci sia black-out?

> segm:=proc(P,Q)
local OO,u,v,upiuv,uu,vv,M;

u:=[P,Q];

M:=PLOT3D(CURVES(u,COLOR(RGB,1,0,0)),AXESSTYLE(NORMAL),AXESLABELS("x","y","z"),POINTS(P,Q,SYMBOL(BOX),COLOR(RGB,0,0,1))):

display3d([M],orientation=[22,50]);

end:

> segm([2,0,0],[0,2,2]);

[Plot]

Ad esempio come quella qui sopra (in tale caso il segmento rosso ci fornisce tutte le soluzioni ammissibili). Pensate ora di aggiungere una coordinata in più ed il gioco è fatto !  (Il codice "segm" che trovate sopra permette ai più smaliziati di testare altre situazioni; basta inserire le coordinate dei punti P e Q).

Conclusioni:

Bene, ora che abbiamo capito teoricamente quello che deve accadere per non avere black-out, passiamo a qualche esempio pratico. Il codice "cent_cit" che vi ho scritto sotto permette di trovare la famosa retta delle soluzioni a partire dai dati di produzione (p_1, p_2) e da quelli di consumo (b_1, b_2). Funziona così:
"c" è la lista [p_1, p_2] e "t" è la lista [b_1, b_2] (
attenzione !  p_1, p_2 e b_1 possono essere scelti a caso, mentre b_2 deve essere uguale a  p_1 + p_2 - b_1, come abbiamo visto!). Metteteci i dati che piu' vi piacciono e vedete cosa succede.

Facciamo un esempio (le cifre in gioco sono Kw ):

> cent_cit:=proc(c,t)
local A,u,v,cc,d,l;

A:=matrix([[1,1,0,0],[0,0,1,1],[1,0,1,0],[0,1,0,1]]);

u:=matrix([c]);

v:=matrix([t]);

cc:=concat(u,v);

d:=convert(cc,vector);

l:=linsolve(A,d);

end:

> p[1]:=10000000;

p[1] := 10000000

> p[2]:=7000000;

p[2] := 7000000

> b[1]:=9000000;

b[1] := 9000000

Dunque b_2 deve essere:

> b[2]:=p[1]+p[2]-b[1];

b[2] := 8000000

Applichiamo ora il codice che risolve il nostro sistema lineare  (per gli iniziati:  il comando "linsolve" richiama l'algoritmo di gradinizzazione di Gauss-Jordan):

> C:=cent_cit([p[1],p[2]],[b[1],b[2]]);

C := vector([2000000+_t[1], 8000000-_t[1], 7000000-_t[1], _t[1]])

Quella scritta sopra è la retta delle soluzioni. Come si leggono ? Al modo seguente:

> x[1,1]:=C[1];

x[1, 1] := 2000000+_t[1]

> x[1,2]:=C[2];

x[1, 2] := 8000000-_t[1]

> x[2,1]:=C[3];

x[2, 1] := 7000000-_t[1]

> x[2,2]:=C[4];

x[2, 2] := _t[1]

Dobbiamo scegliere ora t_1 in modo che tutti gli x_ij siano  maggiori o uguali a 0. Beh, vediamo subito che, per esempio, possiamo scegliere t_1 = 0. Fare i conti in questo caso è immediato; qui sotto trovate i codici per fare i conti nel caso voleste scegliere un valore diverso, per esempio h, per t_1 (basta sostituire h a 0 in quanto segue).

> x11:=eval(x[1,1],[_t[1]=0]);

x11 := 2000000

> x12:=eval(x[1,2],[_t[1]=0]);

x12 := 8000000

> x21:=eval(x[2,1],[_t[1]=0]);

x21 := 7000000

> x22:=eval(x[2,2],[_t[1]=0]);

x22 := 0

Ricordate la nostra tabella iniziale ?  x_ij è la quantità di  Kw che la centrale C_i invia alla città T_j. In questo caso, i risultati si possono interpretare cosi':

C_1 (Aurisina), invia
2000000 Kw a T_1 (Trieste) e 8000000 Kw a T_2 (Gorizia).
C_2 (Monfalcone) invia
7000000 Kw a Trieste e non invia corrente a Gorizia (cioè invia tutta la sua produzione giornaliera solo a Trieste).

Ora che avete capito come funzionano le cose, giocate voi ! Buon divertimento !

FINE

> save tab, riga1, riga2, colonna1, colonna2, A, AA, rel1, rel2, segm, cent_cit, "demo_cent_city.m":

>