Я рассмотрел код симулятора Falstad более подробно. Для цепей, которые состоят только из линейных компонентов, таких как резисторы, переключатели и источники напряжения (такие вещи, как выходы логического затвора для целей моделирования рассматриваются как заземленные источники напряжения), симулятор рассматривает каждый узел цепи, источник напряжения (соединяющий два узла) или провод (аналогично) как определение линейного уравнения и переменной, так что число уравнений и количество переменных всегда равны. Для узла схемы переменная является напряжением узла, и уравнение вычисляет общий ток, протекающий через него, равный общему току, подаваемому любыми источниками тока. Для источника напряжения или провода (провод обрабатывается как источник напряжения, где разность потенциалов равна нулю),
Такие вещи, как источники тока и резисторы, не связаны с резисторами или переменными. Вместо этого источники тока увеличивают общий ток, требуемый для одного узла схемы (помните, что у каждого узла схемы есть уравнение, которое оценивает общий ток, протекающий внутрь и наружу) и уменьшают его для другого. Резисторы немного сложнее: для каждого уравнения конечной точки резистор добавляет термины для напряжения узла каждой конечной точки.
Например, 100-омный резистор, соединяющий узлы 1 и 2, сказал бы, что каждое увеличение напряжения на узле 1 будет уменьшать ток, протекающий в узел 1, на 0,01 ампер и увеличивать ток, протекающий в узел 2, примерно на такую же величину. Аналогичным образом, каждое увеличение напряжения в узле 2 увеличит ток, протекающий в узел 1, на 0,01 ампер и уменьшит ток, протекающий в узел 2, примерно на такую же величину.
Рассмотрим схему с 10-вольтовым источником питания, соединяющим узлы 1 и 5 и резисторы 100 Ом, соединяющие узлы 1 и 2, 2 и 3, 2 и 4 и 3 и 4. Предположим далее, что на узле 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 может быть достаточно быстрым для цепей среднего размера, которые полностью состоят из «линейных» элементов. Время многократного решения системы уравнений вполне разумно, если изменяются только правые коэффициенты. Время становится намного медленнее, если изменяется левая сторона (например, из-за того, что эффективное сопротивление транзистора увеличивается или уменьшается), потому что система должна «рефакторировать» уравнения. Необходимость многократного рефакторинга уравнений за один шаг моделирования (может быть необходимо с транзисторами) делает процесс еще медленнее.
Использование одной большой матрицы для всего не подходит для больших симуляций; хотя матрица будет довольно разреженной, она будет занимать пространство, пропорциональное квадрату числа узлов плюс источники напряжения. Время, необходимое для определения матрицы на каждом этапе моделирования, будет пропорционально квадрату размера матрицы, если рефакторинг не требуется, или кубу размера матрицы, если требуется рефакторинг. Тем не менее, подход имеет определенную элегантность, когда дело доходит до демонстрации взаимосвязи между цепью и системой линейных уравнений.