Ho esaminato il codice del simulatore Falstad in dettaglio. Per circuiti costituiti solo da componenti lineari come resistori, interruttori e sorgenti di tensione (elementi come le uscite della porta logica sono considerati fonti di tensione collegate a terra ai fini della simulazione) il simulatore riguarda ciascun nodo del circuito, sorgente di tensione (che collega due nodi) , o wire (allo stesso modo) come definizione di un'equazione lineare e una variabile, in modo tale che il numero di equazioni e il numero di variabili siano sempre uguali. Per un nodo di circuito, la variabile è la tensione del nodo e l'equazione calcola la corrente totale che scorre attraverso di essa pari alla corrente totale iniettata da qualsiasi sorgente di corrente. Per una sorgente di tensione o filo (un filo gestito come fonte di tensione in cui la differenza potenziale è zero),
Cose come fonti e resistori attuali non sono associati a resistori o variabili. Invece, le fonti di corrente aumentano la corrente totale richiesta per un nodo di circuito (ricordare che ciascun nodo di circuito ha un'equazione che valuta la corrente totale che scorre dentro e fuori) e la diminuisce per l'altro. I resistori sono un po 'più complicati: per ogni equazione dell'endpoint, il resistore aggiunge termini per la tensione del nodo di ciascun endpoint.
Un resistore da 100 ohm che collega i nodi 1 e 2, ad esempio, direbbe che ogni aumento di volt sul nodo 1 ridurrà la corrente che fluisce nel nodo 1 di 0,01 ampere e aumenterebbe la corrente che fluisce nel nodo 2 di una quantità simile. Allo stesso modo, ogni aumento di volt sul nodo 2 aumenterebbe la corrente che scorre nel nodo 1 di 0,01 ampere e diminuirebbe la corrente che scorre nel nodo 2 di una quantità simile.
Si consideri un circuito con un'alimentazione da 10 volt che collega i nodi 1 e 5 e resistenze da 100 ohm che collegano i nodi 1 e 2, 2 e 3, 2 e 4 e 3 e 4. Supponiamo inoltre che sul nodo 1 sia presente un'icona di terra:
neg ---+-1---R100---2---R100---3---100---4---pos
gnd | |
+---------100--------+
Ci sarebbero due "fonti di tensione": il conduttore di terra e l'alimentazione a 10 volt (che sono considerati rispettivamente equazione / variabile 5 e 6). Le equazioni sarebbero quindi:
-X1*0.01 +X5 -X6 = 0 Node 1
+X1*0.01 -X2*0.01 +X4*0.01 = 0 Node 2
+X2*0.01 -X3*0.01 +X4*0.01 = 0 Node 3
+X2*0.01 -X4*0.01 +X6 = 0 Node 4
-X1*1 = 0 Volts 5 (voltage between 1 and gnd)
-X1*1 +X4*1 = 10 Volts 6 (voltage between 1 and 4)
Questo sistema di equazioni può essere rappresentato come una matrice NxN più una matrice di elementi N. Ogni equazione è rappresentata da una riga nella matrice, con valori su ciascuna riga che rappresentano i coefficienti di ciascuna variabile. Il lato destro di ogni equazione è memorizzato nell'array separato. Prima di risolvere le equazioni, si conoscerà la corrente netta che scorre in ciascun nodo (zero in questo caso) e la differenza di tensione tra coppie di nodi collegati da sorgenti di tensione. Risolvere le equazioni produrrà la tensione su ciascun nodo e la corrente che scorre attraverso ciascuna sorgente di tensione.
Se il circuito contiene condensatori, ciascuno di questi verrà considerato come una sorgente di tensione in serie con un resistore di basso valore; dopo ogni fase di simulazione, la sorgente di tensione verrà regolata in base alla quantità di corrente che scorreva attraverso di essa. Gli induttori saranno considerati resistori di alto valore che alimentano la corrente in uno e lo eliminano dall'altro (la quantità di corrente viene regolata in base alla tensione attraverso la resistenza). Sia per i condensatori che per gli induttori, il valore della resistenza sarà controllato dalla quantità di tempo rappresentata da una fase di simulazione.
Gli elementi circuitali più complessi come i transistor sono considerati combinazioni di sorgenti di tensione, sorgenti di corrente e resistori. A differenza degli elementi circuitali più semplici che consentono di elaborare tutto una volta per ogni fase del tempo di simulazione, elementi come i transistor calcolano le resistenze effettive ecc. In base alle tensioni e alle correnti che stanno vedendo, valutano tutte le equazioni risultanti e rivalutano la loro resistenza in base a le nuove tensioni e correnti, rivalutano le equazioni, ecc. nel tentativo di raggiungere un equilibrio in cui la loro resistenza effettiva è come dovrebbe essere per la tensione e la corrente che il transitor sta vedendo.
Il simulatore Falstad può essere decentemente veloce per circuiti di medie dimensioni che consistono interamente di elementi "lineari". Il tempo per risolvere ripetutamente un sistema di equazioni è abbastanza ragionevole se l'unica cosa che cambia sono i coefficienti del lato destro. Il tempo diventa molto più lento se la parte sinistra cambia (ad es. Perché la resistenza effettiva di un transistor sale o scende) perché il sistema deve "rifattorizzare" le equazioni. Dover rifattare le equazioni più volte per fase di simulazione (potrebbe essere necessario con i transistor) rende le cose ancora più lente.
Usare una matrice grande per tutto non è un buon approccio per simulazioni di grandi dimensioni; anche se la matrice sarà abbastanza scarsa, occuperà spazio proporzionale al quadrato del numero di nodi più sorgenti di tensione. Il tempo necessario per risolvere la matrice in ciascuna fase di simulazione sarà proporzionale al quadrato della dimensione della matrice se non è richiesto il refactoring o al cubo della dimensione della matrice se è richiesto il refactoring. Tuttavia, l'approccio ha una certa eleganza quando si tratta di mostrare la relazione tra un circuito e un sistema di equazioni lineari.