Я детально вивчив код симулятора 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 може бути пристойно швидким для схем середнього розміру, які повністю складаються з "лінійних" елементів. Час багаторазового вирішення системи рівнянь є досить розумним, якщо єдине, що змінюється, - це правобічні коефіцієнти. Час стає значно повільнішим, якщо змінюється лівий бік (наприклад, через те, що ефективний опір транзистора йде вгору або вниз), оскільки система повинна "рефакторировать" рівняння. Якщо зробити рефактор рівнянь кілька разів за крок моделювання (можливо, це буде потрібно з транзисторами), все ще стає повільнішим.
Використання однієї великої матриці для всього - не вдалий підхід для великих моделювання; незважаючи на те, що матриця буде досить рідкою, вона займе простір, пропорційний квадрату кількості вузлів плюс джерел напруги. Час, необхідний для вирішення матриці на кожному етапі моделювання, буде пропорційним квадрату розміру матриці, якщо рефакторинг не потрібен, або кубу розміру матриці, якщо потрібен рефакторинг. Тим не менш, підхід має певну елегантність, коли справа стосується показу взаємозв'язку між ланцюгом і системою лінійних рівнянь.