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