
Circuiti lineari in regime stazionario
La pubblicazione di questo mio lavoro trae lo spunto dalla necessità di chiarire alcuni concetti di teoria dei circuiti elettrici che erano rimasti non spiegati negli articoli precedenti da me postati sullo stesso argomento.
1.0 - Bipoli elettrici.
Nella esposizione seguente si presuppone da parte del lettore la conoscenza dei concetti fondamentali di corrente elettrica (I) e tensione elettrica (V) e delle relative unità di misura nel Sistema Internazionale (rispettivamente ampere e volt).
Dicesi elemento circuitale un qualunque dispositivo elettrico a due poli o morsetti (bipolo) del quale sia possibile determinare il comportamento elettrico esterno mediante misure simultanee di tensione e corrente ai morsetti. La rappresentazione grafica di tali coppie di valori in un sistema di assi ortogonali (V,I) oppure, alternativamente, la relazione esistente tra tali misure, rappresentabile mediante una formula matematica f(V,I)=0, dicesi caratteristica elettrica esterna tensione-corrente del bipolo.
 
Se la curva che rappresenta la caratteristica esterna del dispositivo sul piano V - I è una retta passante per l’origine, ovvero se la funzione f(V,I)=0 è una funzione lineare nelle variabili V ed I passante per l’origine degli assi (cioè del tipo aV+bI=0), allora il dispositivo si dirà bipolo elettrico lineare passivo (o inerte). Sono bipoli passivi ad esempio i resistori. In tutti gli altri casi, i bipoli, la cui caratteristica interseca gli assi in un punto qualsiasi, diverso dall’origine, si diranno bipoli attivi.
I generatori elettrici, ad esempio, sono bipoli attivi.
1.1 - Generatori ed utilizzatori elettrici.
Dei dispositivi lineari è possibile fornire una rappresentazione mediante modelli ideali di bipoli lineari di due tipi: i generatori e gli utilizzatori. Per gli scopi della nostra trattazione prenderemo in considerazione i seguenti tipi di bipoli ideali:
1) generatore ideale di tensione costante, la cui caratteristica elettrica è esprimibile mediante la funzione V=V0, con il V0 valore costante; essa è rappresentata da una retta parallela all'asse delle I a distanza V0 dall'origine;
2) generatore di ideale di corrente costante, la cui caratteristica elettrica è esprimibile mediante la funzione I = I0 con I0 valore costante; essa è rappresentata da una retta parallela all'asse delle V a distanza I0 dall'origine
3) resistore ideale (utilizzatore), la cui caratteristica elettrica è esprimibile mediante la funzione V = RI con R parametro costante detto resistenza elettrica; essa è rappresentata da una retta passante per l'origine ed avente un coefficiente angolare I/V = 1 / R
Esistono poi altri tipi di dispositivi importanti, i cosiddetti generatori pilotati di cui ci occuperemo più avanti.
2.0 - Circuiti elettrici.
I dispositivi elettrici sopra menzionati possono essere collegati fra di loro tramite i loro morsetti. Si ottiene così un circuito elettrico, di cui i bipoli sono detti lati del circuito e i punti di collegamento (morsetti) nodi del circuito.
Se almeno uno di tali dispositivi è un generatore (di tensione o di corrente costante), i lati del circuito saranno attraversati da correnti elettriche costanti e fra i nodi del circuito si misureranno tensioni elettriche costanti.

Risolvere il circuito elettrico vuol dire determinare, per ogni lato, i valori delle correnti e delle tensioni ai morsetti.
2.1 - Leggi di Kirchhoff.
Per risolvere un circuito elettrico, oltre alle caratteristiche esterne dei bipoli che lo compongono, occorre conoscere come tali bipoli siano collegati tra di loro, ossia la rappresentazione grafica (o grafo) del circuito. Tali collegamenti tra i bipoli comporteranno l'esistenza di relazioni tra le tensioni ai morsetti e tra le correnti di lato, che esprimono sostanzialmente le condizioni al contorno di ciascun bipolo, cioè come ciascun bipolo è interconnesso con gli altri.
Tali relazioni sono note come leggi di Kirchhoff delle tensioni (LKT) e delle correnti (LKC).
Legge di Kirchhoff delle tensioni (LKT): la somma algebrica delle tensioni misurate lungo i lati di una maglia chiusa di un circuito elettrico è nulla (irrotazionalità della tensione).
VDA+VAB+VBC+VCD=0

Legge di Kirchhoff delle correnti (LKC): la somma algebrica di tutte le correnti che entrano ed escono da uno stesso nodo di un circuito elettrico è nulla (solenoidalità della corrente).
I1+I2-I3-I4=0

Tali leggi si traducono in relazioni lineari omogenee tra le tensioni o le correnti in cui gli unici coefficienti che moltiplicano i valori delle variabili sono i numeri +1, -1, 0.
In un circuito elettrico, costituito da l lati ed n nodi, si potranno scrivere n relazioni tra le correnti di lato ed un numero di relazioni fra le tensioni di lato pari al numero delle maglie, che si possono individuare nel circuito, numero che cresce rapidamente all'aumentare del numero di nodi e del numero di lati e che non è qui importante determinare.
Alcune di queste relazioni sono dipendenti dalle altre e cioè l'informazione che esse introducono è già contenuta nelle altre. Tali relazioni vanno quindi scartate perché inutili per la risoluzione del circuito. E' quindi indispensabile poter scrivere tutte e sole le relazioni indipendenti, che contengono le informazioni necessarie e sufficienti per poter pervenire alla risoluzione del circuito.
Una qualsiasi delle n relazioni che traducono la LKC può essere scartata, in quanto dipendente dalle altre n-1. Se infatti proviamo a fare la somma termine a termine delle prime n -1 equazioni otteniamo sempre l'equazione relativa al nodo n: è quindi possibile scartare l'equazione relativa al nodo n.
Per quanto riguarda la LKT, per essere certi di scrivere tutte e solo le equazioni indipendenti è opportuno introdurre altre variabili oltre alle tensioni di lato e alle correnti di lato, e cioè i potenziali e di ciascun nodo, rispetto ad un nodo preso come un riferimento e quindi considerato a potenziale zero. Le tensioni di lato si esprimeranno allora come differenze tra i potenziali dei nodi a cui il lato fa capo rispetto al nodo di riferimento.
Infatti, considerando la maglia costituita dal nodo di riferimento e = 0 e dai nodi i e k, la LKT per questa maglia porta a scrivere l'equazione -ei+Vik+ek=0 e cioè avendo convenuto di assumere per la tensione il verso, associato a quello della corrente nel lato, risultante dal considerare a potenziale più alto (+) il nodo nel quale entra la corrente. Si ha quindi
Vik=ei-ek

Così facendo sono state introdotte n-1 nuove variabili, i potenziali dei nodi indipendenti, ma è possibile scrivere l equazioni, tante quanti sono i lati del circuito. In definitiva abbiamo n-1 equazioni derivate dalla LKC, l equazioni derivate dalla LKT ed l equazioni che esprimono le caratteristiche elettriche dei lati: abbiamo in totale n-1+2l equazioni indipendenti, tante quante sono le incognite (n-1 potenziali, l tensioni di lato ed l correnti di lato).
3.0 - Equazioni di tableau.
Vediamo ora di esprimere in forma matriciale le equazioni lineari che abbiamo introdotto nel paragrafo precedente.
Fissato il verso della corrente (in modo del tutto arbitrario) in ciascun lato del circuito e detto i il vettore delle l correnti di lato, le l equazioni derivate dalla LKC si possono esprimere nella forma matriciale Ai = 0 dove nella matrice A (matrice di incidenza ridotta relativa agli n-1 nodi indipendenti) avente n - 1 righe ed l colonne compaiono soltanto i valori +1, - 1 e 0 e precisamente aik = 1 se il lato k esce dal nodo i, aik = -1 se il lato k entra nel nodo i, aik = 0 se il lato k non tocca il nodo i.
I1-I3=0
-I1+I2+I4=0
-I2-I5+I7=0
I3-I4+I5-I6=0
Come si vede la matrice A descrive in sostanza il grafo del circuito: ogni riga rappresenta un nodo del grafo e ogni colonna un lato di esso. In ciascuna colonna compaiono sempre i coefficienti +1 nel nodo da cui il lato esce e -1 in quello dove entra; per quanto riguarda i lati collegati con il nodo di massa uno di questi due coefficienti è 0.
Scrivendo le equazioni derivate dalla LKT, dopo aver introdotto il vettore dei potenziali e, avente dimensione n – 1, e quello v delle tensioni di lato, avente dimensione l, e aver assunto per le tensioni il verso associato alle correnti di lato, come detto in precedenza, avremo la forma matriciale v = ATe essendo AT la matrice trasposta della matrice di incidenza ridotta (ossia la stessa matrice nella quale le righe sono scambiate con le colonne).
Infine le caratteristiche elettriche possono essere rappresentate con la equazione Mv+Ni = b dove M è una matrice diagonale l x l in cui i termini della diagonale principale sono tali che mii = 1 se il lato i è un generatore di tensione o un resistore; mii = 0 se è un generatore di corrente; mik = 0 per i diverso da k; N è una matrice diagonale l x l in cui i termini della diagonale principale sono tali che nii = 1 se il lato i è un generatore di corrente, nii = -R se il lato i è un resistore di resistenza R, nii = 0 se il lato i è un generatore di tensione, nik = 0 per i diverso da k. Il vettore b avente dimensione l ha i termini tutti nulli tranne per i lati che sono generatori di tensione o di corrente per i quali assumeranno rispettivamente i valori V0 o I0.
Facendo riferimento al circuito già visto, a 4 nodi e 7 lati, supponendo che il lato 1 sia un generatore di tensione V0 e il lato 7 un generatore di corrente I0 mentre i rimanenti lati siano resistori, avremo le seguenti equazioni caratteristiche:
Consideriamo ora il vettore w = (e,v,i)T ottenuto dalla sovrapposizione dei vettori e, v, i e la matrice T data dalla matrice di matrici

detta anche matrice di tableau, dove 0 sono matrici nulle di opportune dimensioni ed I è una matrice identità di dimensioni l x l. Dato il vettore z = (0,0,b)T, vettore dei generatori indipendenti, il sistema di equazioni che risolvono il circuito elettrico in esame può essere scritto nella forma matriciale molto compatta Tw = z, ossia
Ai = 0 ( per la LKC )
-ATe + Iv = 0 ( per la LKT )
Mv + Ni = b ( per le caratteristiche di lato )
equivalente al sistema di equazioni lineari di partenza, dove 0 sono matrici nulle di opportune dimensioni ed I è una matrice identità di dimensioni l x l.
Per il circuito esaminato in precedenza le matrici T, w e z risultano quindi

Il metodo delle equazione di tableau per i circuiti resistivi lineari è estremamente generale e presenta notevoli vantaggi nella moderna analisi dei circuiti, che si avvale dell'uso del computer. Infatti la matrice di Tableau può essere ricavata in modo molto semplice da una ispezione del circuito ed essendo inoltre estremamente sparsa (molti termini sono infatti nulli), consente di pervenire alla soluzione del sistema con algoritmi molto efficienti. In appendice A è riportato il listato di un programma sorgente in Basic, che, dall'ispezione del grafo del circuito, calcola la matrice di tableau e risolve il sistema risultante.
4.0 – Circuiti contenenti generatori pilotati.
Per lo studio dei circuiti contenenti transistori è opportuno introdurre particolari bipoli lineari detti generatori pilotati.
Essi possono essere di quattro tipi differenti: generatori di tensione o di corrente pilotati dalla tensione o dalla corrente di un lato diverso da quello in cui sono inseriti. Le equazioni che esprimono la caratteristica esterna sono le seguenti:
1) GTPT: (generatore di tensione pilotato di tensione) vi = α vk, ovvero la tensione del generatore pilotato inserito nel lato i è α volte la tensione del lato k.

2) GTPC: (generatore di tensione pilotato di corrente) vi = r ik, ovvero la tensione del generatore pilotato inserito nel lato i è data dal prodotto del parametro resistenza r per la corrente del lato k.

3) GCPC: (generatore di corrente pilotato di corrente) ii = β ik ovvero una corrente del lato i è β volte la corrente del lato k.

4) GCPT: (generatore di corrente pilotato di tensione) ii = (1 / r) vk, ovvero la corrente del lato i è data dal prodotto del parametro conduttanza 1 / r per la tensione del lato k.

Per quanto detto sopra è semplice dedurre, per le matrici M e N, le seguenti relazioni:
a) se il lato i è un GTPT sarà mii = 1 e mik = - α;
b) se il lato i è un GTPC sarà mii = 1 e nik = -r;
c) se il lato i è un GCPC sarà nii = 1e nik = - β;
d) se il lato i è un GCPT sarà nii = 1 e mik = - 1 /r.
4.1 Esempio di risoluzione di un circuito resistivo lineare
Come esempio di applicazione dei concetti visti risolviamo il circuito seguente:

dove il lato 1 è costituito da un generatore di tensione costante V0 = 10 V, il lato 7 è un generatore di corrente pilotato dalla corrente del lato 1 (GCPC con b = 1) e i lati 2, 3, 4, 5, 6, hanno rispettivamente resistenze pari a 20 W, 30 W,40 W, 50 W, 60 W.
Utilizzando il programma dell’appendice A si ha il seguente risultato:

Quando il valore delle variabili e, v, i è negativo vuol dire che il verso effettivo di quella grandezza è opposto a quello indicato nello schema del circuito.
5.0 - Circuiti lineari in regime stazionario sinusoidale.
È noto che il regime sinusoidale dei circuiti lineari può essere studiato a partire dalle equazioni scritte per il regime in corrente continua a patto di sostituire la resistenza del lato con l'impedenza, che è una grandezza complessa formata da una parte reale e da una parte immaginaria, e utilizzare, quindi, per i calcoli, l'algebra dei numeri complessi.
I generatori indipendenti potranno essere rappresentati da una parte reale e da una parte immaginaria per tenere conto delle eventuali differenze di fase tra i diversi generatori inseriti nel circuito elettrico.
Il trasformatore elettrico ideale, dispositivo molto usato nei circuiti in corrente alternata sinusoidale, può essere rappresentato con due generatori pilotati: un GTPT inserito nel lato i che rappresenta il secondario del trasformatore e un GCPC inserito nel lato k che rappresenta il primario del trasformatore. Infatti le equazioni del trasformatore ideale nel funzionamento a carico sono le seguenti:
V2=(n2/n1)*V1
I1=-(n2/n1)*I2
dove (n2/n1) rappresenta il rapporto spire del trasformatore.
In appendice B è riportato il listato di un programma sorgente in Basic che dà la soluzione di un circuito lineare in regime stazionario sinusoidale utilizzando il metodo delle equazioni di tableau, mentre in appendice C si ha lo stesso programma nel linguaggio Visual Basic.
Poiché il linguaggio Basic, a differenza del Fortran, non è in grado di effettuare operazioni con i numeri complessi, è stato necessario adottare l'algoritmo di calcolo qui di seguito illustrato.
In campo complesso il sistema matriciale Ax = b può essere rappresentato nel modo seguente: tenendo conto che una matrice i cui elementi sono numeri complessi può scomporsi nella somma di due matrici che hanno come elementi la parte reale e la parte immaginaria e cioè (aik+jbik) = (aik)+j(bik), si ottiene
[re(A)+j im(A)][(re(x)+j im(x)] = re(b)+j im(b)
da cui svolgendo i calcoli si ottiene
re(A)re(x)-im(A)im(x)+j[im(A)re(x)+re(A)im(x)] = re(b)+j im(b)
e quindi, uguagliando la parte reale a primo membro con quella a secondo membro e analogamente per la parte immaginaria, si ottiene l’ equazione matriciale seguente:

che rappresenta un sistema lineare di dimensioni doppie rispetto a quello che si ha nel campo reale. Risolvendo tale sistema possiamo ricavare la parte reale e la parte immaginaria della variabile complessa x.
5.1 Esempio di risoluzione di un circuito in regime stazionario sinusoidale
Come esempio di applicazione dei concetti visti risolviamo il circuito seguente:
.jpg)
Utilizzando il programma riportato nell’appendice C otteniamo:


Appendice A
CLS : PRINT " RISOLUZIONE DELLE EQUAZIONI DI TABLEAU PER I CIRCUITI RESISTIVI LINEARI"
PRINT : PRINT
PRINT "DAI IL NUMERO DEI NODI (n-1) ED IL NUMERO DEI LATI (l) DEL CIRCUITO: ";
INPUT "", n, l
DIM w(n + 2 * l, n + 2 * l + 1), z(n + 2 * l, n + 2 * l + 1), v(n + 2 * l): PRINT
PRINT "DAI IL NUMERO DEL NODO DI PARTENZA (0 per il nodo di massa), DI QUELLO DI ARRIVO"
PRINT "(0 per il nodo di massa), IL TIPO DI LATO (resistenza r, generatore di tensione gt, generatore di tensione pilotato di corrente gtpc etc...) ED IL VALORE": PRINT
FOR i = 1 TO l
100:
PRINT "LATO "; i;
INPUT ; n1, n2, t$, v
IF n1 > n OR n2 > n THEN PRINT " NUMERO DI NODO ERRATO!!": GOTO 100
IF t$ = "gtpt" OR t$ = "GTPT" OR t$ = "gtpc" OR t$ = "GTPC" OR t$ = "gcpt" OR t$ = "GCPT" OR t$ = "gcpc" OR t$ = "GCPC" THEN PRINT TAB(30); "lato"; : INPUT ; lt: IF lt < 1 OR lt > l THEN PRINT "NUMERO DI LATO ERRATO": GOTO 100
w(n1, n + l + i) = 1: w(n2, n + l + i) = -1
w(n + i, n1) = -1: w(n + i, n2) = 1
w(n + i, n + i) = 1
IF t$ = "r" OR t$ = "R" THEN w(n + l + i, n + i) = 1: w(n + l + i, n + l + i) = -v: GOTO 50
IF t$ = "gt" OR t$ = "GT" THEN w(n + l + i, n + i) = 1: w(n + l + i, n + 2 * l + 1) = v: GOTO 50
IF t$ = "gc" OR t$ = "GC" THEN w(n + l + i, n + l + i) = 1: w(n + l + i, n + 2 * l + 1) = v: GOTO 50
IF t$ = "gtpt" OR t$ = "GTPT" THEN w(n + l + i, n + i) = 1: w(n + l + i, n + lt) = -v: GOTO 50
IF t$ = "gtpc" OR t$ = "GTPC" THEN w(n + l + i, n + i) = 1: w(n + l + i, n + l + lt) = -v: GOTO 50
IF t$ = "gcpt" OR t$ = "GCPT" THEN w(n + l + i, n + l + i) = 1: w(n + l + i, n + lt) = -v: GOTO 50
IF t$ = "gcpc" OR t$ = "GCPC" THEN w(n + l + i, n + l + i) = 1: w(n + l + i, n + l + lt) = -v: GOTO 50
PRINT " NON E' CHIARO DI CHE TIPO SIA IL LATO IN QUESTIONE!!": GOTO 100
50 :
PRINT: NEXT i
40:
FOR i = 0 TO n + 2 * l
FOR j = 0 TO n + 2 * l + 1
z(i, j) = w(i, j)
NEXT j
NEXT i
PRINT : PRINT
REM RISOLUZIONE DEL SISTEMA
FOR c = 1 TO n + 2 * l
MAX = 0
REM SCELTA DEL COEFF. MASSIMO
FOR d = 1 TO n + 2 * l
REM RIGA GIA'SFRUTTATA?
IF v(d) <> 0 THEN GOTO 10
FOR e = 1 TO n + 2 * l
IF w(d, e) = 0 THEN GOTO 20
IF ABS(w(d, e)) <= MAX THEN GOTO 20
MAX = ABS(w(d, e))
j = d: k = e
20:
NEXT e
10:
NEXT d
REM IDENTIFICATO MAX w(J,K) SI NORMA RIGA J
MAX = w(j, k): v(j) = 1
REM SI MARCA LA RIGA UTILIZZATA
FOR e = 1 TO n + 2 * l + 1
w(j, e) = w(j, e) / MAX
NEXT e
REM NORMALIZZATA RIGA SI AZZERA LA RESIDUA COLONNA
FOR d = 1 TO n + 2 * l
IF d = j OR w(d, k) = 0 THEN GOTO 30
M = w(d, k)
FOR e = 1 TO n + 2 * l + 1
w(d, e) = w(d, e) - M * w(j, e)
NEXT e
30:
NEXT d
NEXT c
FOR d = 1 TO n + 2 * l
FOR e = 1 TO n + 2 * l
IF w(d, e) = 1 THEN v(e) = w(d, n + 2 * l + 1)
NEXT e
NEXT d
PRINT "I VALORI DEI POTENZIALI NEI NODI SONO: "
FOR d = 1 TO n
PRINT "e"; d; "="; : PRINT USING "###.##"; v(d); : PRINT ,
NEXT d: PRINT : PRINT
PRINT "I VALORI DELLE TENSIONI E DELLE CORRENTI NEI LATI SONO: "
FOR d = n + 1 TO n + l
PRINT "v"; d - n; "="; : PRINT USING "###.##"; v(d); : PRINT ,
NEXT d: PRINT
FOR d = n + l + 1 TO n + 2 * l
PRINT "i"; d - n - l; "="; : PRINT USING "###.##"; v(d); : PRINT ,
NEXT d
PRINT : PRINT : INPUT "VUOI CAMBIARE LA CARATTERISTICA DI UN LATO "; a$
IF a$ = "n" OR a$ = "N" OR a$ = "no" OR a$ = "NO" THEN END
FOR i = 0 TO n + 2 * l
FOR j = 0 TO n + 2 * l + 1
w(i, j) = z(i, j)
NEXT j
v(i) = 0
NEXT i
300:
INPUT "QUALE LATO "; i
IF i < 1 OR i > l THEN PRINT "NUMERO DI LATO ERRATO!!": GOTO 300
FOR j = 0 TO n + 2 * l + 1: w(n + l + i, j) = 0: NEXT j
200:
PRINT "LATO "; i;
INPUT ; n1, n2, t$, v
IF n1 > n OR n2 > n THEN PRINT " NUMERO DI NODO ERRATO!!": GOTO 200:
IF t$ = "gtpt" OR t$ = "GTPT" OR t$ = "gtpc" OR t$ = "GTPC" OR t$ = "gcpt" OR t$ = "GCPT" OR t$ = "gcpc" OR t$ = "GCPC" THEN PRINT TAB(30); "lato"; : INPUT lt
w(n1, n + l + i) = 1: w(n2, n + l + i) = -1
w(n + i, n1) = -1: w(n + i, n2) = 1
IF t$ = "r" OR t$ = "R" THEN w(n + l + i, n + i) = 1: w(n + l + i, n + l + i) = -v: GOTO 40
IF t$ = "gt" OR t$ = "GT" THEN w(n + l + i, n + i) = 1: w(n + l + i, n + 2 * l + 1) = v: GOTO 40
IF t$ = "gc" OR t$ = "GC" THEN w(n + l + i, n + l + i) = 1: w(n + l + i, n + 2 * l + 1) = v: GOTO 40
IF t$ = "gtpt" OR t$ = "GTPT" THEN w(n + l + i, n + i) = 1: w(n + l + i, n + lt) = -v: GOTO 40
IF t$ = "gtpc" OR t$ = "GTPC" THEN w(n + l + i, n + i) = 1: w(n + l + i, n + l + lt) = -v: GOTO 40
IF t$ = "gcpt" OR t$ = "GCPT" THEN w(n + l + i, n + l + i) = 1: w(n + l + i, n + lt) = -v: GOTO 40
IF t$ = "gcpc" OR t$ = "GCPC" THEN w(n + l + i, n + l + i) = 1: w(n + l + i, n + l + lt) = -v: GOTO 40
PRINT " NON E' CHIARO DI CHE TIPO SIA IL LATO IN QUESTIONE!!": GOTO 20
Appendice B
CLS : PRINT " RISOLUZIONE DELLE EQUAZIONI DI TABLEAU PER I CIRCUITI ELETTRICI LINEARI"
PRINT : PRINT : DEFDBL A-Z
PRINT "DAI IL NUMERO DEI NODI (n-1) ED IL NUMERO DEI LATI (l) DEL CIRCUITO: ";
INPUT "", n, l: s = n + 2 * l
DIM w(2 * s, 2 * s + 1), z(2 * s, 2 * s + 1), v(2 * s): PRINT
PRINT "DAI IL NUMERO DEL NODO DI PARTENZA (0 per il nodo di massa), DI QUELLO DI ARRIVO"
PRINT "(0 per il nodo di massa), IL TIPO DI LATO (impedenza z, generatore di tensione gt, generatore di tensione pilotato di corrente gtpc etc...) ED IL VALORE (parte reale e parte immaginaria)": PRINT
OPEN "Circuito.txt" FOR OUTPUT AS 1
FOR i = 1 TO l
100:
PRINT "LATO "; i; : PRINT #1, "LATO "; i;
INPUT ; n1, n2, t$, re, im:
IF t$ = "gtpt" OR t$ = "GTPT" OR t$ = "gtpc" OR t$ = "GTPC" OR t$ = "gcpt" OR t$ = "GCPT" OR t$ = "gcpc" OR t$ = "GCPC" THEN
PRINT #1, n1, n2, t$, re, im, "lato ";
ELSE
PRINT #1, n1, n2, t$, re, im
END IF
IF n1 > n OR n2 > n THEN PRINT " NUMERO DI NODO ERRATO!!": GOTO 100
IF t$ = "gtpt" OR t$ = "GTPT" OR t$ = "gtpc" OR t$ = "GTPC" OR t$ = "gcpt" OR t$ = "GCPT" OR t$ = "gcpc" OR t$ = "GCPC" THEN
PRINT TAB(30); "lato"; : INPUT ; lt: IF lt = i OR lt < 1 OR lt > l THEN PRINT "NUMERO DI LATO ERRATO": GOTO 100
PRINT #1, lt
END IF
w(n1, n + l + i) = 1: w(n2, n + l + i) = -1
w(n + i, n1) = -1: w(n + i, n2) = 1
w(n + i, n + i) = 1
FOR j = 1 TO s
FOR k = 1 TO s
w(j + s, k + s) = w(j, k): NEXT: NEXT
IF t$ = "z" OR t$ = "Z" THEN
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, n + l + i) = -re: w(s + n + l + i, s + n + l + i) = -re
w(s + n + l + i, n + l + i) = -im: w(n + l + i, s + n + l + i) = im
GOTO 50
END IF
IF t$ = "gt" OR t$ = "GT" THEN
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, 2 * s + 1) = re: w(s + n + l + i, 2 * s + 1) = im
GOTO 50
END IF
IF t$ = "gc" OR t$ = "GC" THEN
w(n + l + i, n + l + i) = 1: w(s + n + l + i, s + n + l + i) = 1
w(n + l + i, 2 * s + 1) = re: w(s + nn + l + i, 2 * s + 1) = im
GOTO 50
END IF
IF t$ = "gtpt" OR t$ = "GTPT" THEN
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, n + lt) = -re: w(s + n + l + i, s + n + lt) = -re
w(s + n + l + i, n + lt) = -im: w(n + l + i, s + n + lt) = im
GOTO 50
END IF
IF t$ = "gtpc" OR t$ = "GTPC" THEN
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, n + l + lt) = -re: w(s + n + l + i, s + n + l + lt) = -re
w(s + n + l + i, n + l + lt) = -im: w(n + l + i, s + n + l + lt) = im
GOTO 50
END IF
IF t$ = "gcpt" OR t$ = "GCPT" THEN
w(n + l + i, n + l + i) = 1: w(s + n + l + i, s + n + l + i) = 1
w(n + l + i, n + lt) = -re: w(s + n + l + i, s + n + lt) = -re
w(s + n + l + i, n + lt) = -im: w(n + l + i, s + n + lt) = im
GOTO 50
END IF
IF t$ = "gcpc" OR t$ = "GCPC" THEN
w(n + l + i, n + l + i) = 1: w(s + n + l + i, s + n + l + i) = 1
w(n + l + i, n + l + lt) = -re: w(s + n + l + i, s + n + l + lt) = -re
w(s + n + l + i, n + l + lt) = -im: w(n + l + i, s + n + l + lt) = im
GOTO 50
END IF
PRINT " NON E' CHIARO DI CHE TIPO SIA IL LATO IN QUESTIONE!!": GOTO 100
50 :
PRINT
NEXT i
40:
FOR i = 0 TO 2 * s
FOR j = 0 TO 2 * s + 1
z(i, j) = w(i, j)
NEXT j
NEXT i
PRINT : PRINT
REM RISOLUZIONE DEL SISTEMA
FOR c = 1 TO 2 * s
MAX = 0
REM SCELTA DEL COEFF. MASSIMO
FOR d = 1 TO 2 * s
REM RIGA GIA'SFRUTTATA?
IF v(d) <> 0 THEN GOTO 10
FOR e = 1 TO 2 * s
IF w(d, e) = 0 THEN GOTO 20
IF ABS(w(d, e)) <= MAX THEN GOTO 20
MAX = ABS(w(d, e))
j = d: k = e
20:
NEXT e
10:
NEXT d
REM IDENTIFICATO MAX w(J,K) SI NORMA RIGA J
MAX = w(j, k): v(j) = 1
REM SI MARCA LA RIGA UTILIZZATA
FOR e = 1 TO 2 * s + 1
w(j, e) = w(j, e) / MAX
NEXT e
REM NORMALIZZATA RIGA SI AZZERA LA RESIDUA COLONNA
FOR d = 1 TO 2 * s
IF d = j OR w(d, k) = 0 THEN GOTO 30
M = w(d, k)
FOR e = 1 TO 2 * s + 1
w(d, e) = w(d, e) - M * w(j, e)
NEXT e
30:
NEXT d
NEXT c
FOR d = 1 TO 2 * s
FOR e = 1 TO 2 * s
IF w(d, e) = 1 THEN v(e) = w(d, 2 * s + 1)
NEXT e
NEXT d
PRINT "I VALORI DEI POTENZIALI NEI NODI SONO: "
FOR d = 1 TO n
PRINT "e"; d; "="; : PRINT #1, "e"; d; "=";
PRINT USING "###.###"; v(d); : PRINT " "; : PRINT #1, v(d), v(d + s)
PRINT USING "###.###"; v(d + s); : PRINT " "; :
NEXT d: PRINT
PRINT "I VALORI DELLE TENSIONI E DELLE CORRENTI NEI LATI SONO: "
FOR d = n + 1 TO n + l
PRINT "v"; d - n; "="; : PRINT #1, "v"; d - n; "=";
PRINT USING "###.###"; v(d); : PRINT " "; : PRINT #1, v(d), v(d + s)
PRINT USING "###.###"; v(d + s); : PRINT " "; :
NEXT d: PRINT
FOR d = n + l + 1 TO s
PRINT "i"; d - n - l; "="; : PRINT #1, "i"; d - n - l; "=";
PRINT USING "###.###"; v(d); : PRINT " "; : PRINT #1, v(d), v(d + s)
PRINT USING "###.###"; v(d + s); : PRINT " "; :
NEXT d
CLOSE
PRINT : PRINT : INPUT "VUOI CAMBIARE LA CARATTERISTICA DI UN LATO "; a$
IF a$ = "n" OR a$ = "N" OR a$ = "no" OR a$ = "NO" THEN END
FOR i = 0 TO 2 * s
FOR j = 0 TO 2 * s + 1
w(i, j) = z(i, j)
NEXT j
v(i) = 0
NEXT i
300:
INPUT "QUALE LATO "; i
IF i < 1 OR i > l THEN PRINT "NUMERO DI LATO ERRATO!!": GOTO 300
FOR j = 0 TO 2 * s + 1: w(n + l + i, j) = 0: w(n + l + i + s, j) = 0: NEXT j
200:
PRINT "LATO "; i;
INPUT ; n1, n2, t$, re, im
IF n1 > n OR n2 > n THEN PRINT " NUMERO DI NODO ERRATO!!": GOTO 200
IF t$ = "gtpt" OR t$ = "GTPT" OR t$ = "gtpc" OR t$ = "GTPC" OR t$ = "gcpt" OR t$ = "GCPT" OR t$ = "gcpc" OR t$ = "GCPC" THEN PRINT TAB(30); "lato"; : INPUT ; lt: IF lt = i OR lt < 1 OR lt > l THEN PRINT "NUMERO DI LATO ERRATO": GOTO 200
w(n1, n + l + i) = 1: w(n2, n + l + i) = -1
w(n + i, n1) = -1: w(n + i, n2) = 1
w(n + i, n + i) = 1
FOR j = 1 TO s
FOR k = 1 TO s
w(j + s, k + s) = w(j, k): NEXT: NEXT
IF t$ = "z" OR t$ = "Z" THEN
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, n + l + i) = -re: w(s + n + l + i, s + n + l + i) = -re
w(s + n + l + i, n + l + i) = -im: w(n + l + i, s + n + l + i) = im
GOTO 40
END IF
IF t$ = "gt" OR t$ = "GT" THEN
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, 2 * s + 1) = re: w(s + n + l + i, 2 * s + 1) = im
GOTO 40
END IF
IF t$ = "gc" OR t$ = "GC" THEN
w(n + l + i, n + l + i) = 1: w(s + n + l + i, s + n + l + i) = 1
w(n + l + i, 2 * s + 1) = re: w(s + nn + l + i, 2 * s + 1) = im
GOTO 40
END IF
IF t$ = "gtpt" OR t$ = "GTPT" THEN
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, n + lt) = -re: w(s + n + l + i, s + n + lt) = -re
w(s + n + l + i, n + lt) = -im: w(n + l + i, s + n + lt) = im
GOTO 40
END IF
IF t$ = "gtpc" OR t$ = "GTPC" THEN
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, n + l + lt) = -re: w(s + n + l + i, s + n + l + lt) = -re
w(s + n + l + i, n + l + lt) = -im: w(n + l + i, s + n + l + lt) = im
GOTO 40
END IF
IF t$ = "gcpt" OR t$ = "GCPT" THEN
w(n + l + i, n + l + i) = 1: w(s + n + l + i, s + n + l + i) = 1
w(n + l + i, n + lt) = -re: w(s + n + l + i, s + n + lt) = -re
w(s + n + l + i, n + lt) = -im: w(n + l + i, s + n + lt) = im
GOTO 40
END IF
IF t$ = "gcpc" OR t$ = "GCPC" THEN
w(n + l + i, n + l + i) = 1: w(s + n + l + i, s + n + l + i) = 1
w(n + l + i, n + l + lt) = -re: w(s + n + l + i, s + n + l + lt) = -re
w(s + n + l + i, n + l + lt) = -im: w(n + l + i, s + n + l + lt) = im
GOTO 40
END IF
PRINT " NON E' CHIARO DI CHE TIPO SIA IL LATO IN QUESTIONE!!": GOTO 200
Appendice C
Listato del form Avvio.frm
'$INCLUDE: 'GLOBAL.BI'
SUB Form_Load ()
Print : Print
Print " RISOLUZIONE DEI CIRCUITI LINEARI IN REGIME STAZIONARIO"
Print : Print
Print " Dai il numero dei nodi (n-1) ed il numero dei lati (l) del circuito."
Print " Per spostarsi utilizzare il tasto TAB."
End Sub
SUB Command1_Click ()
s = n + 2 * l
End Sub
SUB txtLati_KeyPress (KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub
SUB txtNodi_KeyPress (KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub
SUB txtLati_LostFocus ()
l = Val(txtLati.Text)
cmdOK.SetFocus
End Sub
SUB txtNodi_LostFocus ()
n = Val(txtNodi.Text)
txtLati.SetFocus
End Sub
SUB cmdSalva_Click ()
nomefile$ = InputBox$("Nome del file", "Salvataggio file di uscita", "out.txt")
If nomefile$ = "" Then nomefile$ = "file.txt"
Open nomefile$ For Output As 1
Print #1, "RISOLUZIONE DEI CIRCUITI LINEARI IN REGIME STAZIONARIO"
Print #1,
Print #1, "DESCRIZIONE DEL CIRCUITO"
Print #1, "n°lato", "Nodo part.", "Nodoarr.", "Tipo lato", "Val.reale", "Val.immag."
form4.Print "RISOLUZIONE DEI CIRCUITI LINEARI IN REGIME STAZIONARIO"
form4.Print
form4.Print "DESCRIZIONE DEL CIRCUITO"
form4.Print "n°lato", "Nodo part.", "Nodo arr.", "Tipo lato", "Val.reale", "Val.immag."
form1.Hide
form2.Show
End Sub
SUB cmdOK_Click ()
s = n + 2 * l
cmdSalva.SetFocus
End Sub
Listato del form Calc.frm
'$INCLUDE: 'GLOBAL.BI'
SUB Form_Load ()
form4.windowstate = 2
End Sub
SUB cmdCalc_Click ()
Rem RISOLUZIONE DEL SISTEMA
For c = 1 To 2 * s
MAX = 0
Rem SCELTA DEL COEFF. MASSIMO
For d = 1 To 2 * s
Rem RIGA GIA'SFRUTTATA?
If v(d) <> 0 Then GoTo 10
For e = 1 To 2 * s
If w(d, e) = 0 Then GoTo 20
If Abs(w(d, e)) <= MAX Then GoTo 20
MAX = Abs(w(d, e))
j = d: k = e
20:
Next e
10:
Next d
Rem IDENTIFICATO MAX w(J,K) SI NORMA RIGA J
MAX = w(j, k): v(j) = 1
Rem SI MARCA LA RIGA UTILIZZATA
For e = 1 To 2 * s + 1
w(j, e) = w(j, e) / MAX
Next e
Rem NORMALIZZATA RIGA SI AZZERA LA RESIDUA COLONNA
For d = 1 To 2 * s
If d = j Or w(d, k) = 0 Then GoTo 30
M = w(d, k)
For e = 1 To 2 * s + 1
w(d, e) = w(d, e) - M * w(j, e)
Next e
30:
Next d
Next c
For d = 1 To 2 * s
For e = 1 To 2 * s
If w(d, e) = 1 Then v(e) = w(d, 2 * s + 1)
Next e
Next d
form4.Print
form4.Print "I VALORI DEI POTENZIALI NEI NODI SONO: "
Print #1,
Print #1, "I VALORI DEI POTENZIALI NEI NODI SONO: "
For d = 1 To n
form4.Print "e"; Format$(d); " = "; "("; Format$(v(d), "#,##0.000"); ";";
form4.Print Format$(v(d + s), "#,##0.000"); ")"
Print #1, "e"; Format$(d); " = "; "("; Format$(v(d), "#,##0.000"); ";";
Print #1, Format$(v(d + s), "#,##0.000"); ")"
Next d
form4.Print
form4.Print "I VALORI DELLE TENSIONI E DELLE CORRENTI NEI LATI SONO: "
Print #1,
Print #1, "I VALORI DELLE TENSIONI E DELLE CORRENTI NEI LATI SONO: "
For d = n + 1 To n + l
form4.Print "v"; Format$(d - n); " = "; "("; Format$(v(d), "#,##0.000"); ";";
form4.Print Format$(v(d + s), "#,##0.000"); ")"; Tab(30); "i"; Format$(d - n); " = ";
form4.Print "("; Format$(v(d + l), "#,##0.000"); ";"; Format$(v(d + s + l), "#,##0.000"); ")"
Print #1, "v"; Format$(d - n); " = "; "("; Format$(v(d), "#,##0.000"); ";";
Print #1, Format$(v(d + s), "#,##0.000"); ")"; Tab(30); "i"; Format$(d - n); " = ";
Print #1, "("; Format$(v(d + l), "#,##0.000"); ";"; Format$(v(d + s + l), "#,##0.000"); ")"
Next d
cmdFine.SetFocus
End Sub
SUB cmdFine_Click ()
If nomefile$ = "file.txt" Then
Close 1
Kill "file.txt"
End If
End
End Sub
Listato del form Dati.frm
'$INCLUDE: 'GLOBAL.BI'
SUB Form_Load ()
msg$ = "Dai il numero del nodo di partenza, di quello di arrivo, "
msg$ = msg$ + "utilizzando lo 0 per il nodo di massa, "
msg$ = msg$ + "il tipo di lato (resistenza R, generatore di tensione gt "
msg$ = msg$ + "generatore di tensione pilotato di corrente gtpc ecc.), "
msg$ = msg$ + "ed il valore come parte reale e parte immaginaria, "
msg$ = msg$ + "oppure i valori di R, L, C."
msg$ = msg$ + " Per spostarsi utilizzare il tasto TAB."
MsgBox (msg$)
i = 1
etiNum.Caption = Str$(i)
combo1.AddItem ""
combo1.AddItem "gt"
combo1.AddItem "gc"
combo1.AddItem "gtpt"
combo1.AddItem "gtpc"
combo1.AddItem "gcpt"
combo1.AddItem "gcpc"
combo1.AddItem "R"
combo1.AddItem "L"
combo1.AddItem "C"
combo1.AddItem "RL"
combo1.AddItem "RC"
End Sub
SUB cmdOK_Click ()
re = Val(txtReale.text)
im = Val(txtImmag.text)
w(n1, n + l + i) = 1: w(n2, n + l + i) = -1
w(n + i, n1) = -1: w(n + i, n2) = 1
w(n + i, n + i) = 1
For j = 1 To s
For k = 1 To s
w(j + s, k + s) = w(j, k)
Next k
Next j
If t$ = "R" Or t$ = "L" Or t$ = "C" Or t$ = "RL" Or t$ = "RC" Then
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, n + l + i) = -re: w(s + n + l + i, s + n + l + i) = -re
w(s + n + l + i, n + l + i) = -im: w(n + l + i, s + n + l + i) = im
End If
If t$ = "gt" Then
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, 2 * s + 1) = re: w(s + n + l + i, 2 * s + 1) = im
End If
If t$ = "gc" Then
w(n + l + i, n + l + i) = 1: w(s + n + l + i, s + n + l + i) = 1
w(n + l + i, 2 * s + 1) = re: w(s + nn + l + i, 2 * s + 1) = im
End If
If t$ = "gtpt" Then
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, n + lt) = -re: w(s + n + l + i, s + n + lt) = -re
w(s + n + l + i, n + lt) = -im: w(n + l + i, s + n + lt) = im
End If
If t$ = "gtpc" Then
w(n + l + i, n + i) = 1: w(s + n + l + i, s + n + i) = 1
w(n + l + i, n + l + lt) = -re: w(s + n + l + i, s + n + l + lt) = -re
w(s + n + l + i, n + l + lt) = -im: w(n + l + i, s + n + l + lt) = im
End If
If t$ = "gcpt" Then
w(n + l + i, n + l + i) = 1: w(s + n + l + i, s + n + l + i) = 1
w(n + l + i, n + lt) = -re: w(s + n + l + i, s + n + lt) = -re
w(s + n + l + i, n + lt) = -im: w(n + l + i, s + n + lt) = im
End If
If t$ = "gcpc" Then
w(n + l + i, n + l + i) = 1: w(s + n + l + i, s + n + l + i) = 1
w(n + l + i, n + l + lt) = -re: w(s + n + l + i, s + n + l + lt) = -re
w(s + n + l + i, n + l + lt) = -im: w(n + l + i, s + n + l + lt) = im
End If
form4.Print Format$(i), Format$(n1), Format$(n2), t$;
Print #1, Format$(i), Format$(n1), Format$(n2), t$;
If t$ = "gtpt" Or t$ = "gtpc" Or t$ = "gcpt" Or t$ = "gcpc" Then
form4.Print "("; Format$(lt); ")";
Print #1, "("; Format$(lt); ")";
End If
form4.Print , Format$(re), Format$(im, "#,##0.000")
Print #1, , Format$(re), Format$(im, "#,##0.000")
etiNum.Caption = ""
txtPart.text = ""
txtArr.text = ""
combo1.listindex = 0
txtReale.text = ""
txtImmag.text = ""
txtNlato.text = ""
txtValR.text = ""
txtValL.text = ""
txtValC.text = ""
txtPart.SetFocus
If i = l Then
Form2.Hide
form4.Show
form4.cmdCalc.SetFocus
Else
i = i + 1
etiNum.Caption = Str$(i)
End If
End Sub
SUB txtPart_LostFocus ()
n1 = Val(txtPart.text)
If n1 < 0 Or n1 > n Then
txtPart.text = ""
Beep
txtPart.SetFocus
End If
End Sub
SUB txtTipo_LostFocus ()
End Sub
SUB txtArr_LostFocus ()
n2 = Val(txtArr.text)
If n2 < 0 Or n2 > n Or n2 = n1 Then
txtArr.text = ""
Beep
txtArr.SetFocus
End If
End Sub
SUB txtNlato_LostFocus ()
lt = Val(txtNlato.text)
If lt < 0 Or lt > l Or lt = i Then
txtNlato.text = ""
txtNlato.SetFocus
Beep
Else
txtReale.SetFocus
End If
End Sub
SUB txtReale_LostFocus ()
re = Val(txtReale.text)
End Sub
SUB txtImmag_LostFocus ()
im = Val(txtImmag.text)
cmdOK.SetFocus
End Sub
SUB Combo1_Click ()
t$ = combo1.text
If t$ = "gt" Or t$ = "gc" Then txtReale.SetFocus
If t$ = "gtpt" Or t$ = "gtpc" Or t$ = "gcpt" Or t$ = "gcpc" Then
txtNlato.SetFocus
End If
If t$ = "R" Or t$ = "RL" Or t$ = "RC" Then
txtValR.SetFocus
End If
If t$ = "L" Then
txtValL.SetFocus
End If
If t$ = "C" Then
txtValC.SetFocus
End If
End Sub
SUB txtReale_KeyPress (KeyAscii As Integer)
If KeyAscii < 45 Or KeyAscii > 58 Then KeyAscii = 0
End Sub
SUB txtImmag_KeyPress (KeyAscii As Integer)
If KeyAscii < 45 Or KeyAscii > 58 Then KeyAscii = 0
End Sub
SUB txtPart_KeyPress (KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub
SUB txtArr_KeyPress (KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub
SUB txtNlato_KeyPress (KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub
SUB txtValR_KeyPress (KeyAscii As Integer)
If KeyAscii < 46 Or KeyAscii > 58 Then KeyAscii = 0
End Sub
SUB txtValR_LostFocus ()
txtReale.text = txtValR.text
txtImmag.text = "0"
If t$ = "RL" Then txtValL.SetFocus
If t$ = "RC" Then txtValC.SetFocus
If t$ = "R" Then cmdOK.SetFocus
End Sub
SUB txtValL_KeyPress (KeyAscii As Integer)
If KeyAscii < 46 Or KeyAscii > 58 Then KeyAscii = 0
End Sub
SUB txtValL_LostFocus ()
txtImmag.text = Str$(Val(txtValL.text) * 314 * .001!)
If t$ = "L" Then
txtReale.text = "0"
cmdOK.SetFocus
End If
If t$ = "RL" Then cmdOK.SetFocus
End Sub
SUB txtValC_KeyPress (KeyAscii As Integer)
If KeyAscii < 46 Or KeyAscii > 58 Then KeyAscii = 0
End Sub
SUB txtValC_LostFocus ()
If Val(txtValC.text) = 0 Then
cmdOK.SetFocus
Else
txtImmag.text = Str$(-1000000! / 314 / Val(txtValC.text))
End If
If t$ = "C" Then txtReale.text = "0"
cmdOK.SetFocus
End Sub
il parere della community |
| esprimi il tuo voto |
approvi questa pagina?  |
promo |
|
|
|
|
|