Ich habe den Code des Falstad-Simulators genauer untersucht. Für Schaltungen, die nur aus linearen Komponenten wie Widerständen, Schaltern und Spannungsquellen bestehen (Dinge wie Logikgatterausgänge werden für die Zwecke der Simulation als mit Masse verbundene Spannungsquellen betrachtet), betrachtet der Simulator jeden Schaltungsknoten, die Spannungsquelle (die zwei Knoten verbindet). , oder wir definieren (ebenfalls) eine lineare Gleichung und eine Variable, so dass die Anzahl der Gleichungen und die Anzahl der Variablen immer gleich sind. Für einen Schaltungsknoten ist die Variable die Spannung des Knotens, und die Gleichung berechnet den Gesamtstrom, der durch ihn fließt, gleich dem Gesamtstrom, der von einer beliebigen Stromquelle eingespeist wird. Für eine Spannungsquelle oder einen Draht (ein Draht, der als Spannungsquelle behandelt wird, bei der die Potentialdifferenz Null ist),
Dinge wie Stromquellen und Widerstände sind keinen Widerständen oder Variablen zugeordnet. Stattdessen erhöhen Stromquellen den für einen Schaltungsknoten erforderlichen Gesamtstrom (denken Sie daran, dass jeder Schaltungsknoten eine Gleichung hat, die den ein- und ausfließenden Gesamtstrom auswertet) und verringern ihn für den anderen. Widerstände sind etwas kniffliger: Für jede Endpunktgleichung fügt der Widerstand Terme für die Knotenspannung jedes Endpunkts hinzu.
Ein 100-Ohm-Widerstand, der die Knoten 1 und 2 verbindet, würde beispielsweise sagen, dass jeder Voltanstieg an Knoten 1 den in Knoten 1 fließenden Strom um 0,01 Ampere und den in Knoten 2 fließenden Strom um einen ähnlichen Betrag erhöht. In gleicher Weise würde jede Voltzunahme an Knoten 2 den in Knoten 1 fließenden Strom um 0,01 Ampere erhöhen und den in Knoten 2 fließenden Strom um einen ähnlichen Betrag verringern.
Stellen Sie sich eine Schaltung mit einer 10-Volt-Versorgung vor, die die Knoten 1 und 5 und 100-Ohm-Widerstände verbindet, die die Knoten 1 und 2, 2 und 3, 2 und 4 und 3 und 4 verbinden. Nehmen Sie weiter an, dass sich auf Knoten 1 ein Erdungssymbol befindet.
neg ---+-1---R100---2---R100---3---100---4---pos
gnd | |
+---------100--------+
Es würde zwei "Spannungsquellen" geben: die Erdungsleitung und die 10-Volt-Versorgung (die als Gleichung / Variable 5 bzw. 6 betrachtet werden). Die Gleichungen wären also:
-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)
Dieses Gleichungssystem kann als eine N × N-Matrix plus ein N-Element-Array dargestellt werden. Jede Gleichung wird durch eine Zeile in der Matrix dargestellt, wobei die Werte in jeder Zeile die Koeffizienten jeder Variablen darstellen. Die rechte Seite jeder Gleichung wird in einem separaten Array gespeichert. Vor dem Lösen der Gleichungen werden der in jeden Knoten fließende Nettostrom (in diesem Fall Null) und die Spannungsdifferenz zwischen Knotenpaaren, die durch Spannungsquellen verbunden sind, bekannt. Das Lösen der Gleichungen ergibt die Spannung an jedem Knoten und den Strom, der durch jede Spannungsquelle fließt.
Wenn der Schaltkreis Kondensatoren enthält, wird jeder von diesen als Spannungsquelle in Reihe mit einem Widerstand mit niedrigem Wert betrachtet. Nach jedem Simulationsschritt wird die Spannungsquelle entsprechend der durchflossenen Strommenge angepasst. Induktivitäten werden als hochohmige Widerstände angesehen, die Strom in einen Widerstand einspeisen und aus dem anderen herausnehmen (die Stromstärke wird entsprechend der Spannung über dem Widerstand eingestellt). Sowohl für Kondensatoren als auch für Induktivitäten wird der Wert des Widerstands durch die Zeitdauer gesteuert, die durch einen Simulationsschritt dargestellt wird.
Komplexere Schaltungselemente wie Transistoren werden als Kombinationen von Spannungsquellen, Stromquellen und Widerständen angesehen. Im Gegensatz zu den einfacheren Schaltungselementen, bei denen alles einmal pro Simulationszeitschritt verarbeitet wird, berechnen Elemente wie Transistoren ihre effektiven Widerstände usw. auf der Grundlage der Spannungen und Ströme, die sie sehen, werten alle sich ergebenden Gleichungen aus und werten ihren Widerstand auf der Grundlage neu aus Die neuen Spannungen und Ströme werden erneut ausgewertet, um ein Gleichgewicht zu erreichen, in dem der effektive Widerstand für die Spannung und den Strom, die der Transitor sieht, dementsprechend ist.
Der Falstad-Simulator kann für mittelgroße Schaltungen, die vollständig aus "linearen" Elementen bestehen, recht schnell sein. Die Zeit, um ein Gleichungssystem wiederholt zu lösen, ist ziemlich vernünftig, wenn sich nur die Koeffizienten auf der rechten Seite ändern. Die Zeit wird viel langsamer, wenn sich die linke Seite ändert (z. B. weil der effektive Widerstand eines Transistors steigt oder fällt), weil das System die Gleichungen "refaktorisieren" muss. Die Gleichungen mehrmals pro Simulationsschritt refaktorieren zu müssen (möglicherweise bei Transistoren erforderlich), macht die Sache noch langsamer.
Die Verwendung einer großen Matrix für alles ist kein guter Ansatz für große Simulationen. Obwohl die Matrix ziemlich dünn ist, nimmt sie Platz ein, der proportional zum Quadrat der Anzahl der Knoten plus Spannungsquellen ist. Die zum Lösen der Matrix in jedem Simulationsschritt erforderliche Zeit ist proportional zum Quadrat der Matrixgröße, wenn kein Refactoring erforderlich ist, oder zum Würfel der Matrixgröße, wenn ein Refactoring erforderlich ist. Trotzdem hat der Ansatz eine gewisse Eleganz, wenn es darum geht, die Beziehung zwischen einer Schaltung und einem linearen Gleichungssystem aufzuzeigen.