Электрическая схема, составленная из резисторов, в сущности, является неориентированным графом, в котором резисторы служат в качестве рёбер, а их соединения — в качестве вершин (о графах мы упоминали в главе 36. «Близость последовательностей»). Графы — чрезвычайно важные в информатике объекты, и для них имеются несколько популярных методов представления в памяти компьютера. Один из таких методов заключается в представлении графа как списка его рёбер. Каждое ребро можно задать как пару вершин, им соединяемых. Если пронумеровать каким-то образом вершины, ребро можно задать как пару номеров вершин. Порядок вершин в паре задаёт ориентацию (направление) ребра, так что этот способ хорошо подходит для описания ориентированных графов. В нашем случае можно никак не учитывать ориентацию рёбер.
Не будем забывать, что каждый резистор, и, следовательно, каждое ребро несёт дополнительную информацию — величину сопротивления. Графы, в которых к рёбрам или вершинам идут в нагрузку какие-то дополнительные величины, называются нагруженными. С учётом этого схему можно описать как перечень рёбер, которые, в свою очередь, представляются как три числа. Первые два — это номера вершин, а третье — сопротивление ребра.
Поскольку в Perl списки очень удобно представлять в виде массивов, в которых элементы нумеруются начиная с нуля, будет удобно точно так же нумеровать и резисторы, и узлы. Если раньше мы начинали нумерацию с единицы, то теперь просто уменьшим каждый номер на единицу.
Описывая схему, нужно каким-то образом указать, между какими именно узлами требуется вычислить сопротивление. Поэтому примем дополнительное соглашение, по которому входной и выходной узлы всегда получают номера и . С учётом перенумерации схема на рисунке 50.6. «Разметка схемы» приобретает вид
Если в каждой строке текстового файла разместить по три разделённых пробелами числа, тогда для схемы на рисунке 50.7. «Разметка схемы после перенумерации» получится такой файл:
0 2 1 0 3 1 1 2 1 1 3 1 2 3 1
(здесь мы взяли все пять одинаковых единичных сопротивлений). Между прочим, если в этой схеме все сопротивления одинаковы, рассчитать её нетрудно в уме. Нужно заметить, что в силу симметрии схемы относительно оси, проходящей через входной и выходной узлы, ток через резистор (мостик между узлами и ) не потечёт. Тогда резистор за ненадобностью можно изъять из схемы, и получится параллельное соединение двух последовательных соединений — и . В итоге получаем , так что схема оказывается эквивалентной одному единичному резистору.
Приведём также описания схем из двух последовательно и параллельно соединённых резисторов:
0 2 1 1 2 1 |
0 1 1 0 1 1 |
Как мы установили, задача вычисления сопротивления схемы свелась к численному
решению системы линейных алгебраических уравнений. Для решения таких систем
в наших руках имеется готовое средство — класс Capsule
из главы 49. «Линейные уравнения». Так что нашей будущей
программе нужно лишь преобразовать описание схемы из файла в последовательно
обрабатываемые уравнения.