我已经详细研究了Falstad模拟器的代码。对于仅由线性组件(例如电阻器,开关和电压源)组成的电路(出于仿真目的,逻辑门输出之类的对象被视为接地电压源),模拟器将视每个电路节点,电压源(连接两个节点)或连线(同样)定义线性方程和变量,这样方程的数量和变量的数量始终相等。对于电路节点,变量是节点的电压,该方程式计算流经该节点的总电流等于任何电流源注入的总电流。对于电压源或电线(将电线作为电位差为零的电压源),
诸如电流源和电阻器之类的东西与电阻器或变量无关。取而代之的是,电流源会增加一个电路节点所需的总电流(请记住,每个电路节点都有一个方程,该方程可评估流入和流出的总电流),而对于另一电路节点则减小该电流。电阻有些棘手:对于每个端点的方程式,电阻会为每个端点的节点电压添加项。
例如,连接节点1和2的100欧姆电阻将表示节点1上的每伏增加都会使流入节点1的电流减少0.01安培,并使流入节点2的电流增加相同的量。同样,节点2上的每伏增加都会使流入节点1的电流增加0.01安培,并使流入节点2的电流减少相似的量。
考虑一个具有10伏电源的电路,该电路连接节点1和5,以及连接节点1和2、2和3、2和4以及3和4的100欧姆电阻。进一步假设节点1上有一个接地图标。因此:
neg ---+-1---R100---2---R100---3---100---4---pos
gnd | |
+---------100--------+
将有两个“电压源”:接地线和10伏电源(分别被视为方程式/变量5和6)。因此,等式为:
-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)
该等式系统可以表示为N×N矩阵加N项阵列。每个方程式由矩阵中的一行表示,每一行上的值表示每个变量的系数。每个方程的右侧存储在单独的数组中。在求解方程式之前,您将知道流入每个节点的净电流(在这种情况下为零),以及通过电压源连接的成对节点之间的电压差。求解方程式将得出每个节点的电压和流过每个电压源的电流。
如果电路中包含电容器,则每个电容器都将被视为与低值电阻器串联的电压源;在每个模拟步骤之后,将根据流过电压的电流量来调整电压源。电感器将被视为高值电阻器,将电流馈入一个电阻,然后从另一个电阻中取出(电流量根据电阻两端的电压进行调整)。对于电容器和电感器,电阻值将由仿真步骤表示的时间量控制。
更复杂的电路元件(如晶体管)被视为电压源,电流源和电阻器的组合。不同于使每个模拟时间步长都处理一次的较简单的电路元件,像晶体管之类的元件会根据它们所看到的电压和电流来计算其有效电阻等,评估所有结果方程式,并根据以下公式重新评估其电阻新的电压和电流,重新计算方程式等,以达到平衡,在平衡中,其有效电阻应与运输者所看到的电压和电流相同。
对于完全由“线性”元素组成的中等规模的电路,Falstad仿真器的速度可以相当快。如果唯一改变的是右侧系数,那么重复求解方程组的时间是非常合理的。如果左侧发生变化(例如,由于晶体管的有效电阻上升或下降),则时间会变慢得多,因为系统必须“重构”方程式。每个仿真步骤必须多次重构方程式(对于晶体管可能是必需的),这会使事情变得更慢。
对于大型仿真,使用一个大矩阵并不是一个好的方法;即使矩阵相当稀疏,它也将占用与节点数加上电压源的平方成正比的空间。如果不需要重构,则在每个模拟步骤上求解矩阵所需的时间将与矩阵大小的平方成正比;如果需要重构,则与矩阵大小的立方成正比。但是,在显示电路与线性方程组之间的关系时,该方法确实具有一定的优雅。