Реферат: Математическое моделирование физических задач на ЭВМ

--PAGE_BREAK--1. Напряжение и ток в электрической цепи


Электрический ток и напряжение являются основны­ми величинами, характеризующими состояние электрических цепей.

Электрический ток в проводниках представляет явление упорядоченного движения электрических зарядов. Под терми­ном «ток» понимают также интенсивность или силу тока, измеряемую количеством электрического зарядаq,прошед­шего через поперечное сечение проводника в единицу вре­мени:

<img width=«275» height=«42» src=«ref-1_550226705-1591.coolpic» v:shapes="_x0000_i1025">

Следовательно, ток представляет собой скорость изменения заряда во времени. В СИ заряд выражается в кулонах (Кл), время – в секундах (с), ток – в амперах (А).

Ток как отношение двух скалярных величин является скалярной алгебраической величиной, знак которой зависит от направления движения зарядов одного знака, а именно условно принятого положительного заряда. Для однозначного опреде­ления знака тока за положительное направление достаточно произвольно выбрать одно из двух возможных направлений, которое отмечают стрелкой (рис.1.1, а).

<img width=«133» height=«154» src=«ref-1_550228296-5449.coolpic» v:shapes="_x0000_i1026">

Если движение поло­жительного заряда происходит в направлении стрелки, а движение отрицательного заряда—навстречу ей, то ток поло­жителен. При изменении направления движения зарядов на противоположный ток будет отрицательным.

Перед началом анализа на всех участках цепи необходимо отметить положительные направления то­ков, выбор которых может быть произ­вольным. Программа расчета построена так, что за положительное направление тока принято направление движения «по часовой стрелке».

Прохождение электрического тока или перенос зарядов в цепи связаны с преобра­зованием или потреблением энергии. Для определения энергии, затрачиваемой на перемещение заряда между двумя рассмат­риваемыми точками проводника, вводят новую величину – напряжение.

Напряжением называют количество энергии, затрачи­ваемой на перемещение единицы заряда из одной точки в другую:

<img width=«289» height=«45» src=«ref-1_550233745-1720.coolpic» v:shapes="_x0000_i1027">

гдеw—энергия.

При измерении энергии в джоулях (Дж) и заряда в кулонах (Кл) напряжение выражают в вольтах (В).

Напряжение как отношение двух скалярных величин также является скалярной алгебраической величиной. Для однознач­ного определения знака напряжения между двумя выводами рассматриваемого участка цепи одному из выводов условно приписывают положительную полярность, которую отмечают либо стрелкой, направленной от вывода, либо знаками«+», «-» (рис.1.1, б, в). Напряжение положительно, если его поляр­ность совпадает с выбранной; это означает, что потенциал вывода со знаком«+», из которого выходит стрелка, выше потенциала второго вывода.

Перед началом анализа должны быть указаны выбранные положительные полярности напряжений – только при этом условии возможно однозначное определение напряжений. В программе по умолчанию каждому источнику ЭДС приписывают «+» к высшему потенциалу, а «-» – к  низшему.

Положительную полярность напряжения выбирают согласованной с выбранным положительным направлением тока, когда стрелки для тока и напряжения совпадают или знак «+» полярности напряжения находится в хвосте стрелки, обозначающей положительное направление тока. При согласо­ванном выборе полярности, очевидно, достаточно ограничиться указанием только одной стрелки положительного направления тока.

Для обозначения условно положитель­ной полярности применяют знаки«+», «-» у выводов участка цепи.
2.Резистивный элемент


Под резистивным элементом электрической цепи или активным сопротивлением понимают идеализированный эле­мент, в котором происходит только необратимое преобразование электромагнитной энергии в теплоту или другие виды энергии, а запасание энергии в электрическом и магнитном полях от­сутствует.

По свойствам к этому идеальному элементу довольно близки такие реальные устройства, как угольные сопротивления, реостаты, лампы накаливания при относительно небыстрых изменениях токов.

Условное графическое обозначение резистивного элемента Представлено на рис.1.2, а, где указаны принятые положитель­ные направления напряжения и тока.

<img width=«366» height=«125» src=«ref-1_550235465-9568.coolpic» v:shapes="_x0000_i1028">

Основное уравнение элемента, связывающее ток и напряжение, так называемая вольт-амперная характеристика, определяется законом Ома, который устанавливает пропорциональ­ность между напряжением и током:

U=RI, I=GU                    (1.3)

Коэффициент пропорциональности в первом выражении (1.3), равный отношению напряжения и тока, является электрическим сопротивлением:

R=U/I                             (1.4)

Численно сопротивление равно напряжению на элементе при токе в1 А. Значение сопротивления выражается в омах.

Обратная величина – отношение тока к напряжению –представляет собой электрическую проводимость:

G=I/U=1/R.                    (1.5)

В теории линейных электрических цепей сопротивление и проводимость принимают постоянными, не зависящими от тока, напряжения и других величин. В реальных элементах это допущение, так же как и допущение отсутствия запасания энергии, выполняется приближенно.
    продолжение
--PAGE_BREAK--3. Источники


Под источником в теории цепей понимают элемент, питающий цепь электромагнитной энергией. Эта энергия по­требляется пассивными элементами цепи – запасается в индуктивностях и емкостях и расходуется в активном сопротивлении.

Напряжения источников, представляющие задан­ные функции времени, называют также приложенными к цепи или возбуждающими цепь сигналами. Примерами реальных источников электромагнитной энергии могут служить генераторы постоянных, синусоидальных и импульсных сигналов разнообразной формы, сигналы, полу­чаемые от различного рода датчиков, антенн радиоприемных устройств и т. д. Эти источники сигналов либо являются первичными источниками, в которых происходит непосредст­венное преобразование энергии неэлектромагнитной природы (механической, химической, тепловой и т. д.) в электромагнит­ную энергию, либо получают питание от первичных источников. Источник является актив­ным элементом.

Для анализа цепей вводят идеализированный источник напряжения, который учитывает главные свойства реального источника.

Источник напряжения.Под источником напряжения понимают такой элемент с двумя выводами (полюсами), напряжение между которыми задано в виде некоторой функции времени независимо от тока, отдаваемого во внешнюю цепь.

<img width=«142» height=«50» src=«ref-1_550245033-1100.coolpic» v:shapes="_x0000_s1037 _x0000_s1030 _x0000_s1029 _x0000_s1026 _x0000_s1028 _x0000_s1027 _x0000_s1036 _x0000_s1031 _x0000_s1032 _x0000_s1034 _x0000_s1035">



а)                      б)

Рисунок 1.3.

Наиболее часто применяемые условные графические обо­значения источника напряжения представлены на рис.1.3, а и б, где принятая положительная полярность напряжения источника указывается либо стрелкой внутри кружочка, либо большой и малой чертами, малая соответствует знаку«-», а большая — «+». Поскольку положительную полярность напряжения усло­вились обозначать знаками«+», «-», для источника напряже­ния в программе применено обозначение, показанное на рис.1.3, б.



Глава 1. Задача анализа разветвленной цепи


Электрическую цепь, приближенно отображающую электро­магнитные процессы в реальном устройстве, составляют путем соответствующего соединения между собой рассмотренных двухполюсных элементов: сопротивления, индуктивности, ем­кости и источников сигнала. В общем случае отдельные элементы, а также отдельные участки цепи могут соединиться произвольно. В дипломной работе рассмотрены только соединение сопротивления и источника сигнала, в качестве которого используют ЭДС.

В результате получается электрическая схема, имеющая определенную геометрическую конфигурацию. На рис.4 приложения показан пример схемы электрической цепи, составлен­ной из нескольких сопротивлений и источников ЭДС.
Основными понятиями, характеризующими геометрическую конфигурацию разветвленной цепи, являются ветвь и узел.

Под ветвью в общем случае понимают участок цепи с двумя выводами. Токи ветви принимают в качестве неизвестных переменных, характеризующих состояние цепи. Поэтому, что конкретно следует понимать под ветвью, зависит от выбора переменных цепи. Ветвью можно считать каждый элемент цепи. Но для уменьшения числа переменных за ветви иногда принимают также участки из последовательного соеди­нения отдельных элементов, токи которых имеют одно и то же значение, и участки из параллельного соединения отдельных элементов, напряжения на которых имеют одно и то же значение. При анализе схемы за ветвь принимается участок цепи между двумя узлами цепи.

Узел электрической цепи – это точка на схеме, в которой сходятся болеедвух ветвей [4]. Например, на рисунке №4 приложения – 4 узла.

Задача анализа электри­ческой цепиформулируется та­ким образом: Заданы схема электрической цепи со значения­ми всех ее элементов, а также напряжения источников, действующих в цепи. Требуется найти токи ветвей. В дальнейшем будем применять общие термины, назы­вая заданные напряжения источников функциями воз­буждения или сигналами, а искомые токи вет­вей, определяемые в результате анализа цепи, — реакциями. Следовательно, требуется найти реакции цепи на действие заданных сигналов.

Выводы – узлы или ветви, реакции которых необходимо найти, — называют   выходными, а выводы, к которым при­соединены источники, — входными.

Программа предназначена для анализа любой линейной цепи произвольной конфигура­ции с любым конечным числом элементов.

Для определения искомых реакций– токовветвейв общем случае – необходимо со­ставить уравнения цепи с помощью двух систем уравнений:

1)уравнений элементов, связывающих ток и напряже­ние каждого элемента, а также заданные напряжения. Уравнения элементов не зависят от схемы и геометрической конфигурации цепи, в которую входят элементы;

2)уравнений соединений, которые определяются только геометрической конфигурацией и способами соединений ветвей (элементов цепи) и не зависят от вида и характера элементов. Уравнения соединений устанавливают связи между токами и напряжениями отдельных элементов, входящих в цепь.

Уравнения соединений составляют па основе двух законов Кирхгофа, которые связывают токи ветвей, сходящихся в узлах, и напряжения ветвей, входящих в контуры; контуры представляют замкнутые пути, проходящие однократно через ряд ветвей и узлов.

Первый закон Кирхгофа, выражающий закон сохра­нения заряда, дает уравнение равновесия токов в узле цепи и формулируется так: в любой момент алгебраическая сумма токов ветвей, сходящихся в узле электрической цепи, равна нулю:

<img width=«61» height=«27» src=«ref-1_550246133-261.coolpic» v:shapes="_x0000_i1029">.

Знак тока определяется выбором положительных направле­ний токов ветвей; токам, выходящим из узла, приписывают условно знак«-», а током, входящим в узел, — знак«+».

Второй закон Кирхгофа, выражающий закон сохра­нения энергии, дает уравнение равновесия напряжений в контуре и формулируется следующим образом: в любой момент алгебраическая сумма напряжений ветвей в контуре равна нулю

<img width=«65» height=«27» src=«ref-1_550246394-267.coolpic» v:shapes="_x0000_i1030">.

Знак напряжения определяется выбором положительных полярностей напряжений ветвей: если при обходе контура перемещение происходит в сторону понижения или падения напряжения, то напряжению ветви условно приписывают знак «+», если в сторону повышения напряжения — знак«-».

Линейные цепи, составленные из элементов одного вида, например резистивных, описываются системами линейных ал­гебраических уравнений.

Применяя программу расчета линейных разветвленных электрических схем, необходимо лишь нарисовать схему, и ввести все значениясопротивлений и ЭДС. Все остальные преобразования, такие как выбор обхода контура, направления ЭДС, программа выполнит сама и выдаст конечный результат – значения токов в ветвях схемы.
Целью настоящей дипломной работы является создание математической модели и программы работающей по этой модели, позволяющей анализировать и расчитывать разветвленные электрические цепи постоянного тока, на основе использования законов Кирхгофа.

На основе проведенного литературного обзора я убедился, что в настоящее время существуют только программы, которые решают лишь уравнения созданные при анализе цепи, но не производят анализ самой цепи.

    продолжение
--PAGE_BREAK--Глава 2. Пример. Результаты вычислений
Задача [3, №1.50]

Дано:

Е1=120В; Е2=60В; Е3=140В;

R1=1Ом; R2=0,5Ом; R3=0,4Ом; R4=R5=R6=3Ом

Найтитоки в ветвях.

<img width=«532» height=«368» src=«ref-1_550246661-4679.coolpic» v:shapes="_x0000_s1038 _x0000_s1039 _x0000_s1040 _x0000_s1041 _x0000_s1042 _x0000_s1043 _x0000_s1044 _x0000_s1045 _x0000_s1046 _x0000_s1047 _x0000_s1048 _x0000_s1049 _x0000_s1050 _x0000_s1051 _x0000_s1052 _x0000_s1053 _x0000_s1054 _x0000_s1055 _x0000_s1056 _x0000_s1057 _x0000_s1058 _x0000_s1059 _x0000_s1060 _x0000_s1061 _x0000_s1062 _x0000_s1063 _x0000_s1064 _x0000_s1065 _x0000_s1066 _x0000_s1067 _x0000_s1068 _x0000_s1069 _x0000_s1070 _x0000_s1071 _x0000_s1072 _x0000_s1073 _x0000_s1074 _x0000_s1075 _x0000_s1076 _x0000_s1077 _x0000_s1078 _x0000_s1079 _x0000_s1080 _x0000_s1081 _x0000_s1082 _x0000_s1083 _x0000_s1084 _x0000_s1085 _x0000_s1086 _x0000_s1087 _x0000_s1088 _x0000_s1089 _x0000_s1090 _x0000_s1091 _x0000_s1092 _x0000_s1093 _x0000_s1094">Ответ задачи: I1=6,8; I2=30,9; I3=24,1; I4=12,6; I5=18,3; I6=5,8.

Схема для задачи:
<img width=«532» height=«369» src=«ref-1_550251340-4136.coolpic» v:shapes="_x0000_s1095 _x0000_s1096 _x0000_s1097 _x0000_s1098 _x0000_s1099 _x0000_s1100 _x0000_s1101 _x0000_s1102 _x0000_s1103 _x0000_s1104 _x0000_s1105 _x0000_s1106 _x0000_s1107 _x0000_s1108 _x0000_s1109 _x0000_s1110 _x0000_s1111 _x0000_s1112 _x0000_s1113 _x0000_s1114 _x0000_s1115 _x0000_s1116 _x0000_s1117 _x0000_s1118 _x0000_s1119 _x0000_s1120 _x0000_s1121 _x0000_s1122 _x0000_s1123 _x0000_s1124 _x0000_s1125 _x0000_s1126 _x0000_s1127 _x0000_s1128 _x0000_s1129 _x0000_s1130 _x0000_s1131 _x0000_s1132 _x0000_s1133 _x0000_s1134 _x0000_s1135 _x0000_s1136 _x0000_s1137 _x0000_s1138 _x0000_s1139 _x0000_s1140 _x0000_s1141 _x0000_s1142 _x0000_s1143 _x0000_s1144 _x0000_s1145 _x0000_s1146 _x0000_s1147 _x0000_s1148 _x0000_s1149">


Эквивалентная схема для программы:
Результат вычисления программы:

Ответ: I1=6,83; I2=30,88;I3=24,05; I4=12,57; I5=18,31; I6=5,74.
Как видно, программа дает более точный результат, чем тот, который предлагается для проверки правильности решения задачи.

Результаты вычислений выводятся в отдельном окне. (Рисунок №6 приложения).
Глава 3. Методика моделирования


В этой главе излагаются общие методы анализа цепей произвольной структуры, составленных из двух­полюсных резистивных элементов с постоянными сопротивле­ниями и ЭДС, использованные для анализа схем в программе. Методы основаны на составлении уравне­ний цепи относительно выбранных переменных и их решении.


1. Линейный граф и матрица соединений


Для цепей сложной структуры использовалась за­пись уравнений в матричной форме. Матричная запись:

1)    позволяет распространять формальным образом полученные уравнения на цепи любой сложной структуры;

2)    системати­зирует и упрощает процесс составления уравнений;

3)    дает алгоритмы формирования уравнений с помощью ЭВМ; в случае сложных цепей составление уравнений «вручную» (без ЭВМ) требует значительных затрат времени.

Рассмотрим классические методы контурных и узловых уравнений. Вначале введем понятие графа цепи, описы­вающего свойства цепи, связанные с взаимным соединением ветвей, т. е. с геометрической структурой (топологией) схемы. Применение понятия графа позволяет записывать в матричной форме уравнения соединений, составляемые на основе законов Кирхгофа, и тем самым формировать уравнения разветвленных цепей с помощью ЭВМ.

Уравнения равновесия токов и напряжений, составленные по Законам Кирхгофа, как указывалось, линейными однородными уравнениями. Важное условие, которое должно обеспечиваться, состоит в линейной независимости уравнений. Ни одно уравнение не должно быть получено линейной комбинацией остальных уравнений. Общий систематический метод получения линейно независимых уравнений цепи основан также на привлечении понятий теории линейного графа, одного разделов математической дисциплины—топологии. К линейному графу приводит следующее соображение:

Уравнения равновесия токов и напряжений, составленные по законам Кирхгофа, определяются только схемами соединений ветвей, т. е. геометрической структурой цепи, и не зависят от вида и характеристик элементов, т. е. от физического со­держания ветвей. Поэтому при составлении уравнений со­единений удобно отвлекаться от вида и характеристик ветвей цепи, заменив их линиями. В результате для цепи рис.3.1, а, составленной из любых двухполюсных элементов, получим линейный граф, показанный на рис.3.1, б.

<img width=«419» height=«192» src=«ref-1_550255476-22820.coolpic» v:shapes="_x0000_i1031">

Граф является системой или совокупностью двух элемен­тов—узлов (вершин), изображаемых точками, и ветвей (ре­бер), изображаемых отрезками линий, которые соединяют пары узлов.В предельном вырожденном случае граф может состоять только из одного узла.

Числа узлов и ветвей графа обозначим пyи n
д
. Поскольку каждому узлу и каждой ветви цепи сопоставляется узел и ветвь графа, граф цепи содержит всю информацию о соединениях и геометрических свойствах исходной цепи. На рис.3.1, а, б соответственные узлы, а также ветви цепи и графа имеют одинаковые номера.

Граф, так же как и исходная цепь, может иметь различную структуру. Различают планарный (плоский) граф, если его можно изобразить на плоскости без пересечения ветвей (рис.3.1,6), и не планарный (пространственный) граф, если при его изображении на плоском чертеже невозможно избежать пересечения ветвей (рис.3.2, а). Полным назы­вают граф, у которого каждая пара узлов соединена одной ветвью. Примером полного графа цепи может служить граф рис.3.2, а.

Любую часть графа, элементы которой являются элемен­тами исходного графа, называют подграфом. Подграф получают путем удаления (исключения) некоторых ветвей исходного графа.

Важным подграфом является путь графа, представляю­щий непрерывную последовательность ветвей, связывающую пару выбранных узлов, с прохождением каждого узла не болееодного раза. Смежные вет­ви пути имеют общий узел, так что к каждо­му  узлу  присоединены две ветви, лишь к край­ним  узлам— по  одной ветви.
<img width=«238» height=«139» src=«ref-1_550278296-9039.coolpic» v:shapes="_x0000_i1032">
На рис.3.1, б пути, свя­зывающие узлы1, 4, образованы ветвями2-4, 5-6, 1, 2-3-5 и т. д. Если в заданном графе имеется хотя бы один путь между любой парой узлов, то граф называется связным—он соответствует цепи, элементы которой соединены только электрически. Граф рис.3.1, бявляется примером связного графа, а рис.3.2, б —несвяз­ного: он состоит из двух раздельных частей, элементы ко­торых могут иметь связь, например, через взаимную ин­дуктивность.

Для составления уравнений соединений по законам Кирх­гофа необходимо на всех ветвях графа стрелками указать положительные направления токов. В результате получается граф с ориентированными ветвями, называемый направлен­ным графом токов цепи (рис.3.1, б), ветви которого явля­ются токами. Положительные полярности напряжений ветвей удобно принимать согласованными с положительными на­правлениями токов. Тогда в цепях, составленных из двух­полюсных элементов, направленный граф напряжений, реб­ра которого являются напряжениями ветвей, будет совпа­дать с графом токов. Переход к направленному графу позволяет производить аналитическую запись структуры графа и подграфов в виде таблиц – матриц, называемых топологическими матрицами. Аналитическое представ­ление графа необходимо для формирования уравнений сложной цепи с помощью ЭВМ.

Полное описание структуры направленного графа дает n
у
xnв
матрица соединений, nустрок ко­торой являются порядковыми номерами узлов, nвстолб­цов – номерами ветвей. Элементами аi,j
этой матрицы яв­ляются символы наличия или отсутствия ветвиk,присое­диненной к узлуi,которые принимаются равными+1 (—1) для выходящей из узла (входящей) ветви и0, если ветвь не связана с узлом.

Для того чтобы записать матрицу соединений, достаточно для каждой ветви определить номера обоих соединяемых узлов i,jи заполнить клеточки на пересечениях строкi, jи столбца с номером ветвиk значениями+1, — 1; в остальных клеточках должны быть проставлены нули. Для графа рис.3.1,б получим полную матрицу соединений:
<img width=«266» height=«107» src=«ref-1_550287335-3792.coolpic» v:shapes="_x0000_i1033">

(3.1)
Так как каждая ветвь соединяет два узла—выходит из одного узла и входит в другой, то столбец матрицы состоит из двух ненулевых элементов+1, —1 (их сумма равна нулю), так что достаточно заполнить таблицу дляny-1 узлов, которая является редуцированной матрицей соединений А. Эту незави­симую матрицу можно получить из полной матрицы Аaвычеркиванием строки, соответствующей выбранному базисно­му узлу.

Приняв в качестве базисного узел4 и соответственно вычеркивая четвертую строку в(3.1), получим редуцированную матрицу соединений:
<img width=«243» height=«81» src=«ref-1_550291127-5305.coolpic» v:shapes="_x0000_i1034">

(3.2)
Строка матрицы А показывает, какие ветви выходят из каждого независимого узла графа цепи (и входят в него), а столбец– ккаким узлам присоединена ветвь.

В отличие от полной матрицы Аа у реду­цированной матрицы соединений связного графа множест­во всех строк линейно независимо. Отсюда можно сделать вывод о том, что система уравнений равновесия токов в ny-1узлах цепи линейно независима. Если ввести вектор токов пв, ветвей:
i=[i1, i2, … inв]Т,                     (3.3)
то систему независимых уравнений в nу
-
1узлах поЗТК в соответствии со смыслом матрицы А можно записать в виде:
Ai=0,                             (3.4)
где 0=[0 0 … 0]T — нулевой вектор размерностиnу
-
1.

Для графа цепи рис.3.1, б с матрицей соединений(3.2) имеем:
<img width=«243» height=«183» src=«ref-1_550296432-5069.coolpic» v:shapes="_x0000_i1035">
Транспонированная матрица соединений имеет вид:
<img width=«176» height=«127» src=«ref-1_550301501-2729.coolpic» v:shapes="_x0000_i1036">

(3.5)
Строка этой матрицы показывает, между какими узлами присоединена каждая ветвь.

Если задана матрица соединений, то всегда можно построить соответствующий граф. Для этого, расположив точки, обозначающие узлы, следует соединить их попарно ветвями. Номера и направление ветвей определяются ненулевыми эле­ментами столбцов матрицы соединения.


    продолжение
--PAGE_BREAK--2. Уравнения контурных токов


Метод контурных токов применим к цепям с планарным графом (рис.3.3, а). В качестве переменных принимают замкну­тые контурные токи, проходящие по ветвям, образующим все внутренние ячейки графа.

Если намечать контуры – периметры ячеек – по порядку, начиная с одного края цепи, то легко убедиться, что в каждый последующий контур вносится новая ветвь, не вошедшая в предыдущие контуры. Отсюда следует, что уравнения равно­весия напряжений в таких контурах будут линейно независимы. Число внутренних ячеек равно nx=nв-ny+1.

<img width=«273» height=«210» src=«ref-1_550304230-18645.coolpic» v:shapes="_x0000_i1037">

Каждой ячейке при­писывается один кон­турный ток, замыкаю­щийся по ветвям, об­разующим ячейку. Об­щее число перемен­ных– контурныхтоков– равночислу ячеек. Направления всех контурных токов принимают одинаковыми– почасовой стрел­ке. Как видно из рис.3.3, a, по каждой ветви цепи, за исключением периферийных ветвей, замыкаются два контурных тока, направленные в противоположные стороны. Запишем уравнения соединений.

1.    Приравнивая нулю суммы напряжений ветвей всех неза­висимых контуров (ячеек), имеем nх  уравнений поЗНК<img width=«75» height=«27» src=«ref-1_550322875-273.coolpic» v:shapes="_x0000_i1038">.

2.    Выражая ток каждой ветви через разность двух (в общем случае) замыкающихся по смежным контурам контурных токов, получим nвуравнений по ЗТК:

<img width=«157» height=«27» src=«ref-1_550323148-398.coolpic» v:shapes="_x0000_i1039">.

Как видно, токи всех ветвей, т. е. поведение всей цепи, полностью определяются nхконтурными токами, число кото­рых меньше числа ветвей.

Запишем уравнения ветвей. Положим для удобства, что выполнено преобразование всех источников тока и цепь содержит только источники напряжения. Примем для общности каждую ветвь состоящей из последовательного соединения резистивного элемента и источника напряжения (рис.3.3,6). Уравнение такой составной ветви имеет вид:

<img width=«184» height=«24» src=«ref-1_550323546-412.coolpic» v:shapes="_x0000_i1040">.

Для получения уравнений относительно выбранных перемен­ных необходимо:

1)    с помощью уравнений ветвей<img width=«184» height=«24» src=«ref-1_550323546-412.coolpic» v:shapes="_x0000_i1041"> в уравнениях равновесия напряжений заменить напряжения всех ветвей токами;

2)    токи ветвей в получившейся системе заменить, согласно<img width=«157» height=«27» src=«ref-1_550323148-398.coolpic» v:shapes="_x0000_i1042">, контурными токами.

Получим уравнения для одной из ячеек, например первой (рис.3.3, в), образованной тремя ветвями. Основным уравнени­ем равновесия напряжений в первом контуре будет:

u1+u2+u3=0 (*)

Токи ветвей ячейки:

<img width=«181» height=«25» src=«ref-1_550324768-414.coolpic» v:shapes="_x0000_i1043">.(**)

Уравнения ветвей:

<img width=«227» height=«72» src=«ref-1_550325182-523.coolpic» v:shapes="_x0000_i1044"> (***)

Из трех систем уравнений(*),(**),(***)необходимо получить уравнение, содержащее только искомые контурные токи. В соответствии со сказанным с помощью(***)заменяем в основном уравнении(*) напряжения на токи ветвей, которые затем выражаем через контурные токи согласно (**):

<img width=«319» height=«25» src=«ref-1_550325705-621.coolpic» v:shapes="_x0000_i1045">,

       После группировки имеем:

<img width=«359» height=«25» src=«ref-1_550326326-669.coolpic» v:shapes="_x0000_i1046">

Первое слагаемое здесь представляет сумму напряжений всех резистивных ветвей контура только от собственного контурного тока в отсутствие токов других контуров (при их разрыве), а остальные слагаемые—напряжения ветвей контура от токов других контуров в отсутствие собственного контурного тока. В правую часть перенесены напряжения всех источников, входящих в контур.

Аналогичные уравнения получим для остальных контуров. Если число контуров равно п, топредположив для общности число ветвей каждой ячейки также равным п, можно записать систему уравнений контурных токов:

<img width=«164» height=«128» src=«ref-1_550326995-975.coolpic» v:shapes="_x0000_i1047">

КоэффициентRkkсобственное сопротивление контура, рав­ное сумме сопротивлений всех ветвей ячейки, а коэффициент Rik=Rki (i<>k) – взаимное сопротивление контуров, равное сопротивлению общей для контуров iиkветви, взятому с отрицательным знаком, которым учитываются встречные на­правления контурных токов в рассматриваемой ветви.

Каждое уравнение системы выражает условие равно­весия напряжений ветвей контура – резистивных  и источников напряжения (в правой части). Слагаемое на главной диагонали <img width=«71» height=«25» src=«ref-1_550327970-282.coolpic» v:shapes="_x0000_i1048"> дает напряжение всех резистивных ветвей только от собственного контурного тока, а слагаемое Рkjij=ukj — напря­жениена взаимном сопротивлении контуров только от тока в j-м контуре.

Составление уравнений сводится к записи симметричной матрицы параметров контурных токов:

<img width=«175» height=«99» src=«ref-1_550328252-581.coolpic» v:shapes="_x0000_i1049">
Вектора контурных напряжений источников, составляющие которых равны суммам напряжений источников в контурах:

<img width=«155» height=«29» src=«ref-1_550328833-372.coolpic» v:shapes="_x0000_i1050">


При введении вектора искомых контурных токов уравнения (3.10) в матричной форме можно записать в виде:

<img width=«73» height=«21» src=«ref-1_550329205-272.coolpic» v:shapes="_x0000_i1051">.


    продолжение
--PAGE_BREAK--3. Алгоритм формирования узловых уравнений


Для ввода графа или соединений цепи производят последовательную нумерацию:

1)    всех узлов от1 до п=пy
-1
(опорному узлу присваивают нулевой номер);

2)    всех ветвей от 1 до nв.Как указывалось, всю информацию о структуре графа содержит матрица соединений. Но вводить в память этуматрицу в виде двумерного массива нерационально из-за большого числа нулевых элементов. Поэтому структуру графа вводят с помощью таблицы соединений– одномерногомассива троек целых чисел(k, i, j),гдеkномер ветви;i—номер узла, откуда ветвь выходит;j—номер узла, куда ветвь входит. Тройки чисел дают ненулевые элементы aik=1 и аjk=-1 матрицы А. По заданной таблице соединений можно получить все необходимые для формирования уравнений матрицы.

Формировать узловые уравнения на ЭВМ можно перемножив произведение первых двух матриц па транспонированную матрицу соединений, получим матрицу узловых проводимостей; перемножение транспониро­ванной матрицы АТ на вектор токов источников дает вектор узловых токов. Действия над матрицами (транспонирование, сум­мирование, перемножение) легко программируется. Упомяну­тые матрицы являются разреженными, т. е. содержат много нуле­вых элементов. Поэтому приведенный алгоритм, включающий мно­го действий умножения на нулевой элемент, применять невыгодно.

Более рационально формировать матрицуGyи векторiyнепосредственно— по мере поступления данных составных ветвей, исходя из смысла собственной и взаимной проводи­мостей. Вначале матрицу узловых проводимостей и вектор узловых токов принимают равными нулю: Gy=0иiy=0,затем к ним добавляют элементы, вносимые каждой составной ветвью. Данные ветви (k, i, j) с проводимостьюGkи током источника тока iokвойдут в собственные проводимости Gii, Gjj, узлов i, j как добавки Gk, во взаимные проводимости Gij, Gji как добавкиGkи в элементы вектора узловых токовiyi, iyi-как добавки ±i0k. Добавки ветви в матрицу проводимости Gyи вектор токаiyможно представить в виде:
<img width=«294» height=«118» src=«ref-1_550329477-8272.coolpic» v:shapes="_x0000_i1052">
Если ветвь присоединена к базисному узлу (j=0) то она внесет добавкуGk,только в собственную проводимость Giiи добавку i0k в составляющую iiyвектора узловых токов. Учет данных последней ветви завершает формирование узловых проводимостей и вектора узловых токов.

Заключение
       Таким образом в настоящей дипломной работе: ·        проведен литературный обзор по моделированию процессов в радиотехнических цепях, методов и средств расчетов токов и направлений в них; ·        построена математическая модель разветвленной цепи постоянного тока;
·        на языке программирования Турбо Паскаль версии 7.0. в удобном графическом интерфейсе разработана программа построения и анализа электрической схемы цепи постоянного тока;

·        приведены методические пояснения при работе с разработанной программой, а также расчетов и анализа электрических цепей;

·        программа допускает без принципиальных изменений расширение её функциональных возможностей для расчетов цепей переменного тока, а также моделирования и анализа электромагнитных полей;

·        результаты настоящей дипломной работы могут быть использованы в учебном процессе, при разработке электронной аппаратуры в научных лабораториях и на производстве.

        

       В заключение хочу выразить благодарность своим научным руководителям: Цыпишка Дмитрию Ивановичу, Брагарь Луке Федеровичу и заведующиему кафедрой кафедрой общей физики и методики преподавания физики Стамову Ивану Григорьевичу, за методическую помощь, оказанную при написании дипломной работы.



    продолжение
--PAGE_BREAK--Использованная литература


1.    К.С. Демирчан, П.А. Бутырин. Моделирование и машинный расчет электрических цепей. М., «Высшая школа», 1988г.

2.    В. Нерретер. Расчет электрических цепей на ПЭВМ. М., «Энергоатомиздат», 1991г.

3.    Пантюшин В.С. Сборник задач по электротехнике и основам электронники. М., «Высшая школа», 1979г.

4.    П.Н. Махтанов. Основы анализа электрических цепей. Линейные цепи. М., «Высшая школа», 1990г.

5.    «Электротехника». Под редакцией проф. В.С. Пантюшина. М., «Высшая школа», 1976г.

6.    В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова. «Введение в язык Паскаль». М., «Наука», 1988г.

7.    Ж.Джонс, К. Харроу. «Решение задач в системе Турбо Паскаль». М., «Финансы и статистика», 1991г.

8.    К. Боон. «Паскаль для всех». М.,  «Энергоиздат», 1988г.

9.    Д. Прайс. «Программирование на языке Паскаль». Практическое руководство. М., «Мир», 1987г.




Приложение


I. Рисунки с видами экрана при работе с программой… 20

Рисунок №1. Общий вид экрана.… 20

Рисунок №2. Меню – Файл.… 21

Рисунок №3. Открытие файла, сохраненного на диске.… 22

Рисунок №4. Вид экрана с изображением схемы.… 23

Рисунок №5. Вывод результата вычисления токов в ветвях схемы.… 24

Рисунок №6. Просмотр направления токов в ветвях схемы.… 25

Рисунок №7. Вид экрана при сохранении схемы в файл.… 26

Рисунок №8. Меню – Окно.… 27

Рисунок №9. Окно помощи выводимое на экран при нажатии клавиши F1.… 29

II. Листинг программы на языке Паскаль.… 30

1. Основная программа… 30

2. Модуль с библиотекой элементов… 36

3. Модуль вычисления токов ветвей… 48



I. Рисунки с видами экрана при работе с программой Рисунок №1. Общий вид экрана.


<img width=«50» height=«165» src=«ref-1_550337749-977.coolpic» v:shapes="_x0000_s1155">Меню

                        Меню элементов

<img width=«50» height=«214» src=«ref-1_550338726-1192.coolpic» v:shapes="_x0000_s1154">                                                                        Рабочее поле

<img width=«40» height=«405» src=«ref-1_550339918-1993.coolpic» v:shapes="_x0000_s1152">                                                                                                            Указатель мыши

<img width=«261» height=«248» src=«ref-1_550341911-2045.coolpic» v:shapes="_x0000_s1153">



<img width=«223» height=«79» src=«ref-1_550343956-798.coolpic» v:shapes="_x0000_s1151"><img width=«319» height=«98» src=«ref-1_550344754-977.coolpic» v:shapes="_x0000_s1150"><img width=«640» height=«480» src=«ref-1_550345731-4631.coolpic» v:shapes="_x0000_i1053">
Строка статуса                                     Индекатор  свободной памяти
Рисунок №2. Меню – Файл.


Меню – Файл

<img width=«69» height=«194» src=«ref-1_550350362-1279.coolpic» v:shapes="_x0000_s1156">



<img width=«640» height=«480» src=«ref-1_550351641-5933.coolpic» v:shapes="_x0000_i1054">

    продолжение
--PAGE_BREAK--Рисунок №3. Открытие файла, сохраненного на диске.

Открытие файла со схемой

<img width=«146» height=«357» src=«ref-1_550357574-2327.coolpic» v:shapes="_x0000_s1157">



<img width=«640» height=«480» src=«ref-1_550359901-6722.coolpic» v:shapes="_x0000_i1055">

Рисунок №4. Вид экрана с изображением схемы.

Изображение схемы

<img width=«194» height=«252» src=«ref-1_550366623-1717.coolpic» v:shapes="_x0000_s1158">



<img width=«290» height=«146» src=«ref-1_550368340-768.coolpic» v:shapes="_x0000_s1162"><img width=«640» height=«480» src=«ref-1_550369108-5892.coolpic» v:shapes="_x0000_i1056">
Расчет схемы
Рисунок №5. Вывод результата вычисления токов в ветвях схемы.

Результаты вычислений

<img width=«41» height=«185» src=«ref-1_550375000-1024.coolpic» v:shapes="_x0000_s1159">



<img width=«213» height=«137» src=«ref-1_550376024-1088.coolpic» v:shapes="_x0000_s1161"><img width=«203» height=«98» src=«ref-1_550377112-921.coolpic» v:shapes="_x0000_s1160"><img width=«640» height=«480» src=«ref-1_550378033-7033.coolpic» v:shapes="_x0000_i1057">
Токи             Резисторы
Рисунок №6. Просмотр направления токов в ветвях схемы.

<img width=«31» height=«213» src=«ref-1_550385066-1114.coolpic» v:shapes="_x0000_s1163">Значения токов
Направления токов

<img width=«195» height=«451» src=«ref-1_550386180-6816.coolpic» v:shapes="_x0000_s1164 _x0000_s1165 _x0000_s1166 _x0000_s1167 _x0000_s1168">



<img width=«640» height=«480» src=«ref-1_550392996-7028.coolpic» v:shapes="_x0000_i1058">

Рисунок №7. Вид экрана при сохранении схемы в файл.

<img width=«204» height=«270» src=«ref-1_550400024-1258.coolpic» v:shapes="_x0000_s1169">Сохранение схемы
<img width=«640» height=«480» src=«ref-1_550401282-7165.coolpic» v:shapes="_x0000_i1059">

Рисунок №8. Меню – Окно.

<img width=«117» height=«194» src=«ref-1_550408447-913.coolpic» v:shapes="_x0000_s1171">Работа с окнами

<img width=«640» height=«480» src=«ref-1_550409360-6661.coolpic» v:shapes="_x0000_i1060">
Рисунок №9. Вид экрана при закрытии всех окон.

Указатель мыши

<img width=«88» height=«271» src=«ref-1_550416021-1701.coolpic» v:shapes="_x0000_s1172">




                                    Меню

<img width=«2» height=«98» src=«ref-1_550417722-158.coolpic» v:shapes="_x0000_s1173">



<img width=«444» height=«98» src=«ref-1_550417880-1001.coolpic» v:shapes="_x0000_s1174"><img width=«640» height=«480» src=«ref-1_550418881-3123.coolpic» v:shapes="_x0000_i1061">
<img width=«300» height=«126» src=«ref-1_550422004-1161.coolpic» v:shapes="_x0000_s1175">
Строка статуса                                     Информация о свободной памяти
Рисунок №10. Окно помощи выводимое на экран при нажатии клавиши F1.

Закрытие окна

<img width=«50» height=«174» src=«ref-1_550423165-1063.coolpic» v:shapes="_x0000_s1176">


                                    Окно с помощью программы

<img width=«21» height=«136» src=«ref-1_550424228-694.coolpic» v:shapes="_x0000_s1177">



<img width=«107» height=«55» src=«ref-1_550424922-489.coolpic» v:shapes="_x0000_s1178"><img width=«300» height=«448» src=«ref-1_550425411-2429.coolpic» v:shapes="_x0000_s1179"><img width=«640» height=«480» src=«ref-1_550427840-11738.coolpic» v:shapes="_x0000_i1062">
Горизонтальный скролинг

                                                       Вертикальный скролинг

    продолжение
--PAGE_BREAK--II. Листинг программы на языке Паскаль.

1. Основная программа


Program UzPotenc; {Метод узловых потенциалов}

{$F+,O+,X+,V-,R-,I-,S-}

Uses

    Crt, Applic1, Objects, Drivers, Dialogs, Views, Menus, App, StdDlg,

    Fonts,  HelpFile, MsgBox, TxtRead, WInDows, PalObj, Grv16, DemoHlp,

    Types2;

Type TNewApp=Object(TMyApp)

       Procedure ReCounte; Virtual;

     End;

Var MyApp:TNewApp;

Type

     PMyCollection=^TMyCollection;

     TMyCollection=Object(TCollection)

       Procedure FreeItem(Item:poInter); Virtual;

     End;
Procedure CurView; {Просмотр значений токов}

Var R,R1:TRect;

       D:PDialog;

       L:PListBox;

       C:PMyCollection;

      Sb:PScrollBar;

       i:Integer;

       s:String;

Begin

  Sb:=Nil;

  MyApp.ShemeWInDow^.GeTextentWIn(R);

  R.B.X:=R.A.X+(R.B.X-R.A.X) Div 4;

  D:=New(PDialog,Init(R,'Значения токов'));

  D^.GeTextentWIn(R);

  Inc(R.A.Y,CurrentFont^.Height*2);

  R1.Copy(R);

  R1.A.X:=R1.B.X-CurrentFont^.Width*2;

  If RCount>(R.B.Y-R.A.Y) Div CurrentFont^.Height

   Then

    Begin

     Sb:=D^.StAndardScrollBar(sbVertical+sbHAndleKeyBoard);

    End;

  C:=New(PMyCollection,Init(RCount,1));

  For i:=1 To RCount Do

   Begin

    Str(abs(Currents[i]):9:6,s);

    If i Div 10>0

     Then C^.Insert(NewStr('I'+IntToStr(i)+'='+s+'A'))

     Else C^.Insert(NewStr(' I'+IntToStr(i)+'='+s+'A'))

   End;

  L:=New(PListBox,Init(R,1,Sb));

  L^.NewList(C);

  D^.Insert(L);

  R.B.Y:=R.A.Y;

  Dec(R.A.Y,CurrentFont^.Height*2);

  D^.Insert(New(PLabel,Init(R,'  Токи в ветвях',L)));

  DeskTop^.Insert(D);

 End;
Procedure TNewApp.ReCounte;{Обсчет}

  Var

      i,j,k,l,m,Ii,Sizex,Index:Integer;

      A:TElAr;

      f1,f2:Boolean;

      Ratio:Real;
Function Vetv1(Ai,Aj,Ad:Integer):Boolean;

{Функция сохраняет в A ветвь от элемента (Ai,Aj) в направлении Ad (0-Up,1-Down,2-Left,3-Right и возвращает TRUE, если она содержит элементы}

  Var i,j,k,l:Integer;

  Flag1,Flag2:Boolean;

  Begin

     Flag1:=True;

   Flag2:=False;

   With A[Index] Do

    Begin

     Str:=Ai; Col:=Aj;

     Num:=Sheme[Ai,Aj,2];

     Typ:=Sheme[Ai,Aj,1];

    End;

   Inc(Index);

   Case Ad Of

    0: Begin i:=Ai+1; j:=Aj-1;   End;

    1: Begin i:=Ai-1; j:=Aj+1;   End;

    2: Begini:=Ai-1;  j:=Aj+1; End;   

    3: Begini:=Ai+1;  j:=Aj-1;End;

   End;

   While Flag1 And (i>0) And (j>0) And (i<=nS) And (j<=mS) And Not

         (Sheme[i,j,1] In [0,14..18]) Do

    Begin

     If Sheme[i,j,1] In [3..8]

      Then

       Begin

        Flag2:=True;

        With A[Index] Do

         Begin

          Str:=i;

          Col:=j;

          Num:=Sheme[i,j,2];

          Typ:=Sheme[i,j,1];

          Case Ad Of

           0:Dir:=Typ In [5,8];

           1:Dir:=Typ=6;

           2:Dir:=Typ=4;

           3:Dir:=Typ In [3,7];

          End;

         End;

        Inc(Index);

       End;

     Case Ad Of

      0: Case Sheme[i,j,1] Of

          2,5,6,8,9: Dec(i);

          10        : BeginInc(j);Ad:=3;End;

          11        : BeginDec(j);Ad:=2;End;

          Else Flag1:=False;

         End;

      1: Case Sheme[i,j,1] Of

          2,5,6,8,9: Inc(i);

          12        : BeginInc(j);Ad:=3; End;

          13        : BeginDec(j);Ad:=2;End;

          Else Flag1:=False;

         End;

      2: Case Sheme[i,j,1] Of

          1,3,4,7,9: Dec(j);

          10        : BeginInc(i);Ad:=1;End;

          12        : BeginDec(i);Ad:=0;End;

          Else Flag1:=False;

         End;

      3: Case Sheme[i,j,1] Of

          1,3,4,7,9: Inc(j);

          13        : BeginDec(i);Ad:=0;End;

          11        : BeginInc(i);Ad:=1;End;

          Else Flag1:=False;

         End;

     End;

    End;

   If Sheme[i,j,1] In [14..18]

    Then

     Begin

      With A[Index] Do

       Begin

        Str:=i;

        Col:=j;

        Num:=Sheme[i,j,2];

        Typ:=Sheme[i,j,1];

       End;

      Inc(Index);

      With A[Index] Do

       Begin

        Str:=0;

        Col:=0;

        Num:=0;

        Typ:=0;

       End;

      Inc(Index);

     End;

   If Not Flag2

    Then

     Begin

      For k:=1 To NoDecount Do

       If (Nodes[k,1]=i) And (Nodes[k,2]=j)

        Then l:=k;

      NNum[l]:=NNum[Ii]; {Исключение накоротко замкнутых ветвей}

     End;

   Vetv1:=Flag2;

  End;
Function ElEqu(Var Src,Dst:TEl):Boolean; {Returns TRUE, If Src=Dst}

  Begin

   With Src Do

    ElEqu:=(Str=Dst.Str)And(Col=Dst.Col)And(Typ=Dst.Typ)And(Num=Dst.Num);

  End;
Function IsDiv(Var Src:TEl):Boolean; {Returns TRUE, If Src — Divider}

  Begin

   With Src Do

    IsDiv:=(Str=0)And(Col=0)And(Typ=0)And(Num=0);

  End;
Function NextDiv(i:Integer):Integer; {Поиск след. разд. элемента в массиве}

  Begin

   Repeat

    Inc(i);

   Until (i>Sizex) Or IsDiv(A[i]);

   If i<=Sizex

    Then NextDiv:=i

  End;
Function PrevDiv(i:Integer):Integer; {Поиск пред. разд. элемента в массиве}

  Begin

   Repeat

    Dec(i);

   Until (i<1) Or IsDiv(A[i]);

   If i>=1

    Then PrevDiv:=i

    Else PrevDiv:=0;

  End;

Begin

  For i:=1 To nS*mS Div 2 Do

   For j:=1 To nS*mS Div 2 Do

    Equals[i,j]:=0;

  For Ii:=1 To NoDecount Do

   NNum[Ii]:=Ii;

  Index:=1;

  For Ii:=1 To NoDecount Do

   Begin

    Case Sheme[Nodes[Ii,1],Nodes[Ii,2],1] Of

     14:Begin

         Vetv1(Nodes[Ii,1],Nodes[Ii,2],0);Vetv1(Nodes[Ii,1],Nodes[Ii,2],1);

        End;

     15:Begin

         Vetv1(Nodes[Ii,1],Nodes[Ii,2],0);Vetv1(Nodes[Ii,1],Nodes[Ii,2],1);

        End;

     16:Begin

         Vetv1(Nodes[Ii,1],Nodes[Ii,2],0);Vetv1(Nodes[Ii,1],Nodes[Ii,2],1);

        End;

     17:Begin

         Vetv1(Nodes[Ii,1],Nodes[Ii,2],1);Vetv1(Nodes[Ii,1],Nodes[Ii,2],2);

        End;

     18:Begin

         Vetv1(Nodes[Ii,1],Nodes[Ii,2],0);Vetv1(Nodes[Ii,1],Nodes[Ii,2],2);

        End;

    End;

   End;

  Sizex:=Index-1;

  {Оставляет нужные ветви}

  i:=1;

  While i<=Sizex Do

   Begin

    j:=0;

    f1:=True;

    While (i+j<=Sizex) And f1 Do

     Begin

      k:=NextDiv(i+j);

      If ElEqu(A[k-1],A[i])And ElEqu(A[k-2],A[i+1])

       Then

        Begin

         f1:=False;

         l:=PrevDiv(k);

         For m:=0 To Sizex-k Do

          A[l+m]:=A[k+m];

         Sizex:=Sizex-(k-l);

         i:=NextDiv(i)+1;

         If i=1

          Then i:=Sizex+1;

        End

       Else

        j:=k-i;

     End;

   End;

  i:=0;

  {Исключает пустые ветви}

  While i<=Sizex Do

   Begin

    j:=NextDiv(i);

    If j-i=3

     Then

      Begin

       For k:=1 To Sizex-j Do

End;

    If j<>0

     Then i:=j

     Else i:=Sizex+1;

   End;

  {Считаем сколько узлов с учётом соединений}

  NCount:=NoDecount;

  For i:=1 To NoDecount Do

   If NNum[i]<>i

    Then Dec(NCount);

  If NCount<>NoDecount

   Then

    For i:=1 To NoDecount Do

     Begin

      j:=0;

      For k:=1 To NoDecount Do

       If NNum[k]=i

        Then j:=1;

      If j=0

       Then

        For k:=1 To NoDecount Do

         If NNum[k]>i

          Then Dec(NNum[k]);

     End;

  i:=1;

  j:=0;

  Repeat

   Inc(j);

   k:=NextDiv(i);

   With Brunches[j] Do

    Begin

     AEDS:=0;

     ARes:=0;

     For l:=i To k Do

      With A[l] Do

        Case Typ Of

         3..6: If Dir

                Then EDS:=AEDS+EDS[Str,Col]

                Else EDS:=AEDS-EDS[Str,Col];

         7..8: ARes:=ARes+abs(Res[Str,Col]);

        End;

     FromN:=NNum[A[i].Num];

     If k<>0

      Then

       Begin

        ToN:=NNum[A[k-1].Num];

        i:=k+1;

       End

      Else

       Begin

        ToN:=NNum[A[Sizex-1].Num];

        i:=Sizex+1;

       End;

    End;

  Until i>Sizex;

  BrunchCount:=j;

  {Заполняем систему}

  For i:=1 To BrunchCount Do

   With Brunches[i] Do

    Begin

      Equals[FromN,FromN]:=Equals[FromN,FromN]+1/ARes;

Equals[ToN,NCount+1]:=Equals[ToN,NCount+1]+AEDS/ARes;

    End;

  {Решаем систему}

  For i:=2 To NCount Do

   Begin

    Ratio:=Equals[i,i];

    For j:=2 To NCount+1 Do

     Equals[i,j]:=Equals[i,j]/Ratio;

    For k:=2 To NCount Do

     If k<>i

     For i:=1 To NCount+1 Do

   Begin

    Equals[1,i]:=0;

    Equals[i,1]:=0;

   End;

  {После решения расставляем токи}

  For i:=1 To RCount Do

   Begin

    j:=1;

    While (j<=Sizex) And Not ((A[j].Typ In [7,8]) And (A[j].Num=i)) Do

     Inc(j); k:=0; l:=j;

    Repeat

     k:=k+1; j:=PrevDiv(j);

    Until j=0;

    With Brunches[k] Do

     Begin

      Currents[i]:=(AEDS-Equals[ToN,NCount+1]+Equals[FromN,NCount+1])/ARes;

      If Not A[l].Dir

       Then Currents[i]:=-Currents[i];

     End;

   End;

  CurView;

 End;
Procedure TMyCollection.FreeItem;

 Begin

  If Item<>Nil

   Then DisposeStr(PString(Item));

 End;
BEGIN

 MyApp.Init;

 MyApp.Run;

 MyApp.Done;

END.

    продолжение
--PAGE_BREAK--2. Модуль с библиотекой элементов


Unit Types2;

Interface

Uses

     Crt,

     Objects, Drivers, Dialogs, Views, Menus, App, StdDlg,

     Fonts,  HelpFile, MsgBox, TxtRead, WInDows,

     PalObj, Grv16, DemoHlp;

Const

  nS=8;

  mS=13;

  Sx:Integer = 50;

  Sy:Integer = 40;

  Sx1:Integer=20;

  Sy1:Integer=20;

  cmMemoViewChange = 1001;

  CurrentElement:Byte=0;

  IsResist:Boolean=True; {If True — resistOrs, Else — currents}

 Type

  TSheme=Array [1..nS,1..mS,1..2] Of Byte; {Массив сдержит схему}

  TNodes=Array [1..nS*mS,1..2] Of Byte;    {Массив содержит координаты всех

                                             узловых элементов (i,j)}

  TElems=Array [1..nS,1..mS] Of Real; {Содержит элементы значения}

  TCurrents=Array [1..nS*mS] Of Real; {Токи}

  TNNum=Array [1..nS*mS] Of Byte;  {Номера узлов}

  PEl=^TEl; {Элемент}

  TEl=recOrd

   Str,Col:Byte;{строка, столбец}

   Typ:Byte;{тип}

   Num:Byte;{номер}

   Dir:Boolean;

  End;

  TBrunch=recOrd {Ветвь}

   FromN,ToN:Byte;

   ARes,AEDS:Real;

  End;

  TElAr=Array [1..2*mS*nS] Of TEl; {Элементы}

  TBrunches=Array[1..mS*nS] Of TBrunch; {Ветви}

  TEquals=Array[1..mS*nS Div 2,1..mS*nS Div 2] Of Real; {Уравнения}

   PToolBar = ^TToolBar;

   TToolBar = Object(TView)

    ConstructOr Init(Var R: TRect);

Procedure Draw; Virtual;

Procedure HAndleEvent(Var Event:TEvent); Virtual; {Реагирование на события}

   End;

  PMemoView = ^TMemoView;

  TMemoView = Object(TView)

    ConstructOr Init(Var Bounds: TRect);

Procedure HAndleEvent(Var Event: TEvent); Virtual;

Procedure Draw; Virtual;

  End;
  {П- указатель, Т — тип}

  PShemeView = ^TShemeView;

  TShemeView = Object(TView)

   ConstructOr Init(Var R: TRect);

Procedure Draw; Virtual;

Procedure HAndleEvent(Var Event:TEvent); Virtual;

  End;
   PShemeWIn = ^TShemeWIn;

   TShemeWIn = Object(TDialog)

    ConstructOr Init(Var R:TRect);

Function ElMatter(IsEDS:Boolean):Real; {Окно ввода значений}

    DestructOr Done; Virtual;

   End;

 Var

     Sheme:TSheme;

     Nodes:TNodes;

     EDS,Res:TElems;

     Currents:TCurrents; {Токи}

     NCount,NoDecount,ECount,RCount:Integer;

    {Реално узлов, Узловых эл-тов, Колво ЭДС и Кол-во Рез.}

     Changed:Boolean;

     Exist:Boolean;

     SetPhase:Boolean;

     NNum:TNNum;

     Brunches:TBrunches;

    {Ветви}

     BrunchCount:Integer;

          {Кол-во}

     Equals:TEquals;

Function IntToStr(i:longInt):String;

Procedure ElNumbers(Var ASheme:TSheme);

Procedure InitSheme(Var ASheme:TSheme);

Implementation

Procedure InitSheme(Var ASheme:TSheme);

  {Зануляет текущую схему. Вызывается при старте и команде ОЧИСТИТЬ}

  Var i,j,k:Integer;

 Begin

  For i:=1 To nS Do

   For j:=1 To mS Do

    For k:=1 To 2 Do

     Begin

      ASheme[i,j,k]:=0;

      EDS[i,j]:=0;

      Res[i,j]:=0;

     End;

 End;
 ConstructOr TMemoView.Init(Var Bounds: TRect);

 Begin

  TView.Init(Bounds);

  EventMask:= EventMask Or evBroadCast;

  Options  := OfPreProcess;

 End;
Procedure TMemoView.HAndleEvent(Var Event: TEvent);

 Begin

  Inherited HAndleEvent(Event);

  With Event Do

  If (What =evBroadCast)And(CommAnd=cmMemoViewChange)

  Then DrawView

  Else Exit;

  ClearEvent(Event);

 End;
Procedure TMemoView.Draw;

  Var

   R: TRect;

   S: String;

 Begin

  SetColOr(7);

  FillRect(1, 1, Pred(Size.X), Pred(Size.Y));

  GeTextent(R);

  With R Do DrawFrame(A, B, OfWhiteRight);

  Str(MemAvail:6, S);

  SetColOr(0);

  WriteStr(5, 3, S + 'b');

 End;
 ConstructOr TToolBar.Init(Var R: TRect);

 Begin

  Inherited Init(R);

  GrowMode:= GrowMode Or (gfGrowHiX+gfGrowHiY);

 End;
Procedure TToolBar.Draw;

 Var

     i,j: Integer;
Procedure ElDraw(Ax,Ay:Integer; An:Byte);

Procedure _1(x,y:Integer);

   Begin

    plotlIne (x,y+Sy Div 2,x+Sx,y+Sy Div 2);

   End;

Procedure _2(x,y:Integer);

   Begin

    PlotLIne (x+sx Div 2,y,x+sx Div 2,y+sy);

   End;

Procedure _9(x,y:Integer);

   Begin

    PlotLIne (x,y+sy Div 2,x+sx,y+sy Div 2);

    PlotLIne (x+sx Div 2,y,x+sx Div 2,y+sy);

   End;

{   Procedure _3(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy Div 2,x+Sx Div 5,y+Sy Div 2);

    PlotLIne (x+Sx*4 Div 5,y+Sy Div 2,x+Sx,y+Sy Div 2);

    ThickCircle(x+Sx Div 2,y+Sy Div 2,sx*2 Div 6,1);

    PlotLIne (x+Sx Div 4,y+Sy Div 2,x+Sx*3 Div 4,y+Sy Div 2);

    PlotLIne (x+Sx*3 Div 4,y+Sy Div 2,x+Sx Div 2,y+Sy*13 Div 20);

    PlotLIne (x+Sx*3 Div 4,y+Sy Div 2,x+Sx Div 2,y+Sy*7 Div 20);

   End;

   Procedure _4(x,y:Integer);

   Begin

    PlotLIne (x,y+sy Div 2,x+sx Div 5,y+sy Div 2);

    PlotLIne (x+sx*4 Div 5,y+sy Div 2,x+sx,y+sy Div 2);

    ThickCircle(x+sx Div 2,y+sy Div 2,sx*2 Div 6,1);

    PlotLIne (x+sx Div 4,y+sy Div 2,x+sx*3 Div 4,y+sy Div 2);

    PlotLIne (x+sx Div 4,y+sy Div 2,x+sx Div 2,y+sy*13 Div 20);

    PlotLIne (x+sx Div 4,y+sy Div 2,x+sx Div 2,y+sy*7 Div 20);

   End;

   Procedure _5(x,y:Integer);

   Begin

    PlotLIne (x+sx Div 2,y,x+sx Div 2,y+sy*2 Div 10);

    PlotLIne (x+sx Div 2,y+sy*8 Div 10,x+sx Div 2,y+sy);

    ThickCircle(x+sx Div 2,y+sy Div 2,sx*2 Div 6,1);

    PlotLIne (x+sx Div 2,y+sy Div 4,x+sx Div 2,y+sy*3 Div 4);

    PlotLIne (x+sx Div 2,y+sy Div 4,x+sx*13 Div 20,y+sy Div 2);

    PlotLIne (x+sx Div 2,y+sy Div 4,x+sx*7 Div 20,y+sy Div 2);

   End;

   Procedure _6(x,y:Integer);

   Begin

    PlotLIne (x+sx Div 2,y,x+sx Div 2,y+sy*2 Div 10);

    PlotLIne (x+sx Div 2,y+sy*8 Div 10,x+sx Div 2,y+sy);

    ThickCircle(x+sx Div 2,y+sy Div 2,sx*2 Div 6,1);

    PlotLIne (x+sx Div 2,y+sy Div 4,x+sx Div 2,y+sy*3 Div 4);

    PlotLIne (x+sx Div 2,y+sy*3 Div 4,x+sx*13 Div 20,y+sy Div 2);

    PlotLIne (x+sx Div 2,y+sy*3 Div 4,x+sx*7 Div 20,y+sy Div 2);

   End;}

Procedure _3(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy Div 2,x+Sx*2 Div 5,y+Sy Div 2);

    PlotLIne (x+Sx*3 Div 5,y+Sy Div 2,x+Sx,y+Sy Div 2);

    PlotLIne (x+Sx*3 Div 5,y+Sy Div 8,x+Sx*3 Div 5,y+Sy*7 Div 8);

    PlotLIne (x+Sx*2 Div 5,y+Sy Div 3,x+Sx*2 Div 5,y+Sy*2 Div 3);

   End;

Procedure _4(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy Div 2,x+Sx*2 Div 5,y+Sy Div 2);

    PlotLIne (x+Sx*3 Div 5,y+Sy Div 2,x+Sx,y+Sy Div 2);

    PlotLIne (x+Sx*2 Div 5,y+Sy Div 8,x+Sx*2 Div 5,y+Sy*7 Div 8);

    PlotLIne (x+Sx*3 Div 5,y+Sy Div 3,x+Sx*3 Div 5,y+Sy*2 Div 3);

   End;

Procedure _5(x,y:Integer);

   Begin

    PlotLIne (x+Sx Div 2,y,x+Sx Div 2,y+Sy*2 Div 5);

    PlotLIne (x+Sx Div 2,y+Sy*3 Div 5,x+Sx Div 2,y+Sy);

    PlotLIne (x+Sx Div 8,y+Sy*2 Div 5,x+Sx*7 Div 8,y+Sy*2 Div 5);

    PlotLIne (x+Sx Div 3,y+Sy*3 Div 5,x+Sx*2 Div 3,y+Sy*3 Div 5);

   End;

Procedure _6(x,y:Integer);

   Begin

    PlotLIne (x+Sx Div 2,y,x+Sx Div 2,y+Sy*2 Div 5);

    PlotLIne (x+Sx Div 2,y+Sy*3 Div 5,x+Sx Div 2,y+Sy);

    PlotLIne (x+Sx Div 8,y+Sy*3 Div 5,x+Sx*7 Div 8,y+Sy*3 Div 5);

    PlotLIne (x+Sx Div 3,y+Sy*2 Div 5,x+Sx*2 Div 3,y+Sy*2 Div 5);

   End;

Procedure _7(x,y:Integer);

   Begin

    PlotLIne(x,y+Sy Div 2,x+sx Div 5,y+Sy Div 2);

    PlotLIne(x+sx*4 Div 5,y+Sy Div 2,x+sx,y+Sy Div 2);

    PlotLIne(x+sx Div 5,y+Sy*12 Div 20,x+sx*4 Div 5,y+Sy*12 Div 20);

    PlotLIne(x+sx*4 Div 5,y+Sy*12 Div 20,x+sx*4 Div 5,y+Sy*8 Div 20);

    PlotLIne(x+sx*4 Div 5,y+Sy*8 Div 20,x+sx Div 5,y+Sy*8 Div 20);

    PlotLIne(x+sx Div 5,y+Sy*8 Div 20,x+sx Div 5,y+Sy*12 Div 20);

   End;

Procedure _8(x,y:Integer);

   Begin

    PlotLIne(x+Sx Div 2,y,x+Sx Div 2,y+Sy Div 5);

    PlotLIne(x+Sx Div 2,y+Sy*4 Div 5,x+Sx Div 2,y+Sy);

    PlotLIne(x+Sx*12 Div 20,y+Sy Div 5,x+Sx*12 Div 20,y+Sy*4 Div 5);

    PlotLIne(x+Sx*12 Div 20,y+Sy*4 Div 5,x+Sx*8 Div 20,y+Sy*4 Div 5);

    PlotLIne(x+Sx*8 Div 20,y+Sy*4 Div 5,x+Sx*8 Div 20,y+Sy Div 5);

    PlotLIne(x+Sx*8 Div 20,y+Sy Div 5,x+Sx*12 Div 20,y+Sy Div 5);

   End;

Procedure _0(x,y:Integer);

   Begin

   End;

Procedure _10(x,y:Integer);

   Begin

    PlotLIne(x+sx,y+sy Div 2,x+sx Div 2,y+sy Div 2);

    PlotLIne(x+sx Div 2,y+sy Div 2,x+sx Div 2,y+sy);

   End;

Procedure _11(x,y:Integer);

   Begin

    PlotLIne(x,y+sy Div 2,x+sx Div 2,y+sy Div 2);

    PlotLIne(x+sx Div 2,y+sy Div 2,x+sx Div 2,y+sy);

   End;

Procedure _12(x,y:Integer);

   Begin

    PlotLIne(x+sx Div 2,y,x+sx Div 2,y+sy Div 2);

    PlotLIne(x+sx Div 2,y+sy Div 2,x+sx,y+sy Div 2);

   End;

Procedure _13(x,y:Integer);

   Begin

    PlotLIne(x+sx Div 2,y,x+sx Div 2,y+sy Div 2);

    PlotLIne(x+sx Div 2,y+sy Div 2,x,y+sy Div 2);

   End;

Procedure _14(x,y:Integer);

   Begin

    PlotLIne (x,y+sy Div 2,x+sx,y+sy Div 2);

    PlotLIne (x+sx Div 2,y,x+sx Div 2,y+sy);

    FillCircle(x+sx Div 2,y+sy Div 2,2);

   End;

Procedure _15(x,y:Integer);

   Begin

    PlotLIne (x+sx Div 2,y+sy Div 2,x+sx,y+sy Div 2);

    PlotLIne (x+sx Div 2,y,x+sx Div 2,y+sy);

    FillCircle(x+sx Div 2,y+sy Div 2,2);

   End;

Procedure _16(x,y:Integer);

   Begin

    PlotLIne (x,y+sy Div 2,x+sx Div 2,y+sy Div 2);

    PlotLIne (x+sx Div 2,y,x+sx Div 2,y+sy);

    FillCircle(x+sx Div 2,y+sy Div 2,2);

   End;

Procedure _17(x,y:Integer);

   Begin

    PlotLIne (x,y+sy Div 2,x+sx,y+sy Div 2);

    PlotLIne (x+sx Div 2,y+sy Div 2,x+sx Div 2,y+sy);

    FillCircle(x+sx Div 2,y+sy Div 2,2);

   End;

Procedure _18(x,y:Integer);

   Begin

    PlotLIne (x,y+sy Div 2,x+sx,y+sy Div 2);

    PlotLIne (x+sx Div 2,y,x+sx Div 2,y+sy Div 2);

    FillCircle(x+sx Div 2,y+sy Div 2,2);

   End;

  Begin

   If An=CurrentElement

    Then

     SetColOr(2)

    Else

     SetColOr(10);

   FillRect(Ax,Ay,Sx,Sy);

   SetColOr(4);

   Case An Of

1:_1(Ax,Ay);      2:_2(Ax,Ay);      3:_3(Ax,Ay);      4:_4(Ax,Ay);     5:_5(Ax,Ay);      6:_6(Ax,Ay);      7:_7(Ax,Ay);      8:_8(Ax,Ay);

      9:_9(Ax,Ay);     10:_10(Ax,Ay);    11:_11(Ax,Ay);    12:_12(Ax,Ay);

     13:_13(Ax,Ay);    14:_14(Ax,Ay);    15:_15(Ax,Ay);    16:_16(Ax,Ay);

     17:_17(Ax,Ay);    18:_18(Ax,Ay);

    Else _0(Ax,Ay);

   End;

  End;

 Begin

  With Size Do

   Begin

    Sx:=x Div 3 — 2; Sy:=y Div 7 — 2;

   End;

  SetColOr(9);

  FillRect(0,0,Size.X,(Sy+2)*6+CurrentFont^.Height+2);

  SetColOr(4);

  WriteStr((Size.X-14*CurrentFont^.Width) Div 2, 0, 'Меню элементов');

  For i:=1 To 6 Do

   For j:=1 To 3 Do

    ElDraw((j-1)*(Sx+2),(i-1)*(Sy+2)+CurrentFont^.Height+2,(i-1)*3+j);

  If CurrentElement=0

   Then

    SetColOr(2)

   Else

    SetColOr(10);

  FillRect(0,(Sy+2)*6+CurrentFont^.Height+2,Size.X,Size.Y);

  SetColOr(15);

  WriteStr((Size.X-12*CurrentFont^.Width) Div 2,((Sy+2)*6+

            CurrentFont^.Height Div 2 +2 + Size.Y) Div 2, 'Пустое место');

 End;
Procedure TToolBar.HAndleEvent;

  Var x,y:Integer;

 Begin

  Inherited HAndleEvent(Event);

  If (Event.What=evMouseDown) And (Event.Buttons=mbLeftButton)

   Then

    Begin

     x:=(Event.Where.X-CurrentFont^.Width-2) Div Sx;

     y:=(Event.Where.Y-CurrentFont^.Height-2) Div Sy-1;

     CurrentElement:=y*3+x+1;

     If Event.Where.Y>Sy*7+CurrentFont^.Height+2

      Then CurrentElement:=0;

     DrawView;

     ClearEvent(Event);

    End;

 End;
 ConstructOr TShemeView.Init(Var R: TRect);

 Begin

  Inherited Init(R);

  Font:=@Font8x8;

  GrowMode:= GrowMode Or (gfGrowHiX+gfGrowHiY);

 End;
Procedure TShemeView.Draw;

  Const

     Special:Integer=2;

 Var

     i,j: Integer;

     c:Byte;

Procedure ElDraw(Ax,Ay:Integer; An,l:Byte);

Procedure _1(x,y:Integer);

   Begin

    plotlIne (x,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

   End;

Procedure _2(x,y:Integer);

   Begin

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1);

   End;

Procedure _9(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1);

   End;

{   Procedure _3(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy1 Div 2,x+Sx1 Div 5+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1*4 Div 5+Special,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

    ThickCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,Sx1*2 Div 6,1);

    PlotLIne (x+Sx1 Div 4+Special,y+Sy1 Div 2,x+Sx1*3 Div 4+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1*3 Div 4+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1*12 Div 20);

    PlotLIne (x+Sx1*3 Div 4+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1*8 Div 20);

   End;

   Procedure _4(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy1 Div 2,x+Sx1 Div 5+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1*4 Div 5+Special,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

    ThickCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,Sx1*2 Div 6,1);

    PlotLIne (x+Sx1 Div 4+Special,y+Sy1 Div 2,x+Sx1*3 Div 4+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1 Div 4+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1*12 Div 20);

    PlotLIne (x+Sx1 Div 4+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1*8 Div 20);

   End;

   Procedure _5(x,y:Integer);

   Begin

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1*3 Div 10);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*7 Div 10,x+Sx1 Div 2+Special,y+Sy1);

    ThickCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,Sx1*2 Div 6,1);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1 Div 2+Special,y+Sy1*5 Div 8);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1*12 Div 20+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1*8 Div 20+Special,y+Sy1 Div 2);

   End;

   Procedure _6(x,y:Integer);

   Begin

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1*3 Div 10);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*7 Div 10,x+Sx1 Div 2+Special,y+Sy1);

    ThickCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,Sx1*2 Div 6,1);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1 Div 2+Special,y+Sy1*5 Div 8);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*5 Div 8,x+Sx1*12 Div 20+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*5 Div 8,x+Sx1*8 Div 20+Special,y+Sy1 Div 2);

   End;}

Procedure _3(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy1 Div 2,x+Sx1*2 Div 5+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1*3 Div 5+Special,y+Sy1 Div 2,x+Sx1+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1*3 Div 5+Special,y+Sy1 Div 8,x+Sx1*3 Div 5+Special,y+Sy1*7 Div 8);

    PlotLIne (x+Sx1*2 Div 5+Special,y+Sy1 Div 3,x+Sx1*2 Div 5+Special,y+Sy1*2 Div 3);

   End;

Procedure _4(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy1 Div 2,x+Sx1*2 Div 5+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1*3 Div 5+Special,y+Sy1 Div 2,x+Sx1+Special,y+Sy1 Div 2);

    PlotLIne (x+Sx1*2 Div 5+Special,y+Sy1 Div 8,x+Sx1*2 Div 5+Special,y+Sy1*7 Div 8);

    PlotLIne (x+Sx1*3 Div 5+Special,y+Sy1 Div 3,x+Sx1*3 Div 5+Special,y+Sy1*2 Div 3);

   End;

Procedure _5(x,y:Integer);

   Begin

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1*2 Div 5);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 5,x+Sx1 Div 2+Special,y+Sy1);

    PlotLIne (x+Sx1 Div 8+Special,y+Sy1*2 Div 5,x+Sx1*7 Div 8+Special,y+Sy1*2 Div 5);

    PlotLIne (x+Sx1 Div 3+Special,y+Sy1*3 Div 5,x+Sx1*2 Div 3+Special,y+Sy1*3 Div 5);

   End;

Procedure _6(x,y:Integer);

   Begin

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1*2 Div 5);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 5,x+Sx1 Div 2+Special,y+Sy1);

    PlotLIne (x+Sx1 Div 8+Special,y+Sy1*3 Div 5,x+Sx1*7 Div 8+Special,y+Sy1*3 Div 5);

    PlotLIne (x+Sx1 Div 3+Special,y+Sy1*2 Div 5,x+Sx1*2 Div 3+Special,y+Sy1*2 Div 5);

   End;

Procedure _7(x,y:Integer);

   Begin

    If IsResist

     Then

      Begin

       PlotLIne(x,y+Sy1 Div 2,x+Sx1 Div 5+Special,y+Sy1 Div 2);

       PlotLIne(x+Sx1*4 Div 5+Special,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

       PlotLIne(x+Sx1 Div 5+Special,y+Sy1*12 Div 20,x+Sx1*4 Div 5+Special,y+Sy1*12 Div 20);

       PlotLIne(x+Sx1*4 Div 5+Special,y+Sy1*12 Div 20,x+Sx1*4 Div 5+Special,y+Sy1*8 Div 20);

       PlotLIne(x+Sx1*4 Div 5+Special,y+Sy1*8 Div 20,x+Sx1 Div 5+Special,y+Sy1*8 Div 20);

       PlotLIne(x+Sx1 Div 5+Special,y+Sy1*8 Div 20,x+Sx1 Div 5+Special,y+Sy1*12 Div 20);

      End

     Else

      If Currents[Sheme[i,j,2]]>0

       Then

        Begin

         PlotLIne (x,y+Sy1 Div 2,x+Sx1 Div 5+Special,y+Sy1 Div 2);

         PlotLIne (x+Sx1*4 Div 5+Special,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

         PlotLIne (x+Sx1 Div 4+Special,y+Sy1 Div 2,x+Sx1*3 Div 4+Special,y+Sy1 Div 2);

         PlotLIne (x+Sx1*3 Div 4+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1*12 Div 20);

         PlotLIne (x+Sx1*3 Div 4+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1*8 Div 20);

        End

       Else

        Begin

         PlotLIne (x,y+Sy1 Div 2,x+Sx1 Div 5+Special,y+Sy1 Div 2);

         PlotLIne (x+Sx1*4 Div 5+Special,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

         PlotLIne (x+Sx1 Div 4+Special,y+Sy1 Div 2,x+Sx1*3 Div 4+Special,y+Sy1 Div 2);

         PlotLIne (x+Sx1 Div 4+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1*12 Div 20);

         PlotLIne (x+Sx1 Div 4+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1*8 Div 20);

        End;

   End;

Procedure _8(x,y:Integer);

   Begin

    If IsResist

     Then

      Begin

       PlotLIne(x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1 Div 5);

       PlotLIne(x+Sx1 Div 2+Special,y+Sy1*4 Div 5,x+Sx1 Div 2+Special,y+Sy1);

       PlotLIne(x+Sx1*12 Div 20+Special,y+Sy1 Div 5,x+Sx1*12 Div 20+Special,y+Sy1*4 Div 5);

       PlotLIne(x+Sx1*12 Div 20+Special,y+Sy1*4 Div 5,x+Sx1*8 Div 20+Special,y+Sy1*4 Div 5);

       PlotLIne(x+Sx1*8 Div 20+Special,y+Sy1*4 Div 5,x+Sx1*8 Div 20+Special,y+Sy1 Div 5);

       PlotLIne(x+Sx1*8 Div 20+Special,y+Sy1 Div 5,x+Sx1*12 Div 20+Special,y+Sy1 Div 5);

      End

     Else

      If Currents[Sheme[i,j,2]]>0

       Then

        Begin

         PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1*3 Div 10);

         PlotLIne (x+Sx1 Div 2+Special,y+Sy1*7 Div 10,x+Sx1 Div 2+Special,y+Sy1);

         PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1 Div 2+Special,y+Sy1*5 Div 8);

         PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1*12 Div 20+Special,y+Sy1 Div 2);

         PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1*8 Div 20+Special,y+Sy1 Div 2);

        End

       Else

        Begin

         PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1*3 Div 10);

         PlotLIne (x+Sx1 Div 2+Special,y+Sy1*7 Div 10,x+Sx1 Div 2+Special,y+Sy1);

         PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1 Div 2+Special,y+Sy1*5 Div 8);

         PlotLIne (x+Sx1 Div 2+Special,y+Sy1*5 Div 8,x+Sx1*12 Div 20+Special,y+Sy1 Div 2);

         PlotLIne (x+Sx1 Div 2+Special,y+Sy1*5 Div 8,x+Sx1*8 Div 20+Special,y+Sy1 Div 2);

        End;

   End;
Procedure _0(x,y:Integer);

   Begin

   End;

Procedure _10(x,y:Integer);

   Begin

    PlotLIne(x+Sx1,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1 Div 2);

    PlotLIne(x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1);

   End;

Procedure _11(x,y:Integer);

   Begin

    PlotLIne(x,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1 Div 2);

    PlotLIne(x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1);

   End;

Procedure _12(x,y:Integer);

   Begin

    PlotLIne(x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1 Div 2);

    PlotLIne(x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

   End;

Procedure _13(x,y:Integer);

   Begin

    PlotLIne(x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1 Div 2);

    PlotLIne(x,y+Sy1 Div 2,x+Sx1 Div 2+Special+1,y+Sy1 Div 2);

   End;

Procedure _14(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1);

    FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

   End;

Procedure _15(x,y:Integer);

   Begin

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1);

    FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

   End;

Procedure _16(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy1 Div 2,x+Sx1 Div 2,y+Sy1 Div 2);

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1);

    FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

   End;

Procedure _17(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

    PlotLIne (x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1);

    FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

   End;

Procedure _18(x,y:Integer);

   Begin

    PlotLIne (x,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

    PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1 Div 2);

    FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

   End;

  Begin

   Special:=Sx1 Div 10;

   SetColOr(l);

   FillRect(Ax,Ay,Sx1,Sy1);

   SetColOr(4);

   Case An Of

    1:_1(Ax,Ay);     2:_2(Ax,Ay);    3:_3(Ax,Ay);    4:_4(Ax,Ay);

    5:_5(Ax,Ay);     6:_6(Ax,Ay);    7:_7(Ax,Ay);    8:_8(Ax,Ay);

    9:_9(Ax,Ay);    10:_10(Ax,Ay);  11:_11(Ax,Ay);  12:_12(Ax,Ay);

    13:_13(Ax,Ay);  14:_14(Ax,Ay);  15:_15(Ax,Ay);  16:_16(Ax,Ay);

    17:_17(Ax,Ay);  18:_18(Ax,Ay);

    Else _0(Ax,Ay);

   End;

  End;

 Begin

  C:= GetColOr(6);

  {Определение цвета нормального текста}

  SetColOr(C shr 4);

  With Size Do

   Begin

    FillRect(0, 0, Size.X, Size.Y);

    Sx1:=x Div mS;

    Sy1:=y Div nS;

    For i:=1 To nS Do

     For j:=1 To mS Do

      Begin

       ElDraw((j-1)*Sx1+(x-Sx1*mS) Div 2 ,(i-1)*Sy1+(y-Sy1*nS) Div 2,Sheme[i,j,1],((i+j) mod 2)+14);

       Case Sheme[i,j,1]Of

        3,4,5,6:WriteStr((j-1)*Sx1+(x-Sx1*mS) Div 2 ,(i-1)*Sy1+(y-Sy1*nS) Div 2,'E'+IntToStr(Sheme[i,j,2]));

        7,8:    If IsResist

                 Then WriteStr((j-1)*Sx1+(x-Sx1*mS) Div 2 ,(i-1)*Sy1+(y-Sy1*nS) Div 2,'R'+IntToStr(Sheme[i,j,2]))

                 Else WriteStr((j-1)*Sx1+(x-Sx1*mS) Div 2 ,(i-1)*Sy1+(y-Sy1*nS) Div 2,'I'+IntToStr(Sheme[i,j,2]));

       End; {Of Case}

      End;

   { RestOreFont;}

   End;

 End;
Procedure TShemeView.HAndleEvent;

  Var x,y:Integer;

 Begin

  Inherited HAndleEvent(Event);

  If (Event.What=evMouseDown) And (Event.Buttons=mbLeftButton)

   Then

    Begin

     x:=(Event.Where.X-Sx1*3 Div 8-(Size.X-Sx1*mS) Div 2) Div Sx1-3;

     y:=(Event.Where.Y-(Size.Y-Sy1*nS) Div 2) Div Sy1;

     Case Sheme[y,x,1] Of

      3..6: EDS[y,x]:=0;

      7..8: Res[y,x]:=0;

     End;

     Sheme[y,x,1]:=CurrentElement;

     Changed:=True;

     ElNumbers(Sheme);

     DrawView;

     Case CurrentElement Of

      3..6: EDS[y,x]:=PShemeWIn(Owner)^.ElMatter(True);

      7..8: Res[y,x]:=PShemeWIn(Owner)^.ElMatter(False);

     End;

     ClearEvent(Event);

    End;

   End;
Function IntToStr(I: LongInt): String;

   { Convert any Integer Type To a String }

   Var S: String[11];

  Begin

   Str(I, S);

   IntToStr:= S;

  End;
Procedure ElNumbers(Var ASheme:TSheme);

  {Нумерует элементы схемы (ЭДС, резисторы и узловые элементы для служебных

  целей).Вызывается когда схема готова}

  Var i,j:Integer;

      nE,nR,nN:Byte;

 Begin

  nE:=0;nR:=0;nN:=0;

  For j:=1 To mS Do

   For i:=1 To nS Do

    Case ASheme[i,j,1] Of

     3,4,5,6: Begin {ЭДС}      Inc(nE); ASheme[i,j,2]:=nE; End;

     7,8:     Begin {резистор} Inc(nR); ASheme[i,j,2]:=nR; End;

     14..18:  Begin Inc(nN); ASheme[i,j,2]:=nN; Nodes[nN,1]:=i; Nodes[nN,2]:=j; End;

    End; {Of Case}

  ECount:=nE; RCount:=nR; NoDecount:=nN;

 End;

 ConstructOr TShemeWIn.Init;

 Begin

  Inherited Init(R, 'Схема без имени');

  SetPhase:=True;

  Exist:=True;

  Options:= Options Or OfCentered;

  DragMode:=0;

  Palette:= wpCyanWInDow;

  GeTextentWIn(R);

  R.B.X:=R.A.X+(R.B.X-R.A.X) Div 4;

  Insert(New(PToolBar, Init(R)));

  GeTextentWIn(R);

  R.A.X:=(R.B.X-R.A.X) Div 4;

  Insert(New(PShemeView, Init(R)));

  HelpCtx:= hcGraphic;

 End;
Function TShemeWIn.ElMatter;

  Var R:TRect;

      M:Real;

      c:wOrd;

      i:Integer;

      D:PDialog;

      L:PInputLIne;

      s:String;

 Begin

  M:=0;

  GeTextentWIn(R);

  R.B.X:=R.A.X+(R.B.X-R.A.X) Div 4;

  Inc(R.A.Y,CurrentFont^.Height*5);

  Dec(R.B.Y,CurrentFont^.Height*10);

  If IsEDS

   Then s:='Напряжение'

   Else s:='Сопртивление';

  D:=New(PDialog,Init(R,s));

  Inc(R.A.Y,CurrentFont^.Height*3);

  Inc(R.A.X,CurrentFont^.Width*5);

  Dec(R.B.X,CurrentFont^.Width*5);

  R.B.Y:=R.A.Y+CurrentFont^.Height*1;

  L:=New(PInputLIne,Init(R,10));

  If D<>Nil

   Then

    Begin

     D^.GeTextentWIn(R);

     Inc(R.A.Y,CurrentFont^.Height Div 2);

     Inc(R.A.X,CurrentFont^.Width);

     Dec(R.B.X,CurrentFont^.Width*4);

     R.B.Y:=R.A.Y+CurrentFont^.Height;

     L:=New(PInputLIne,Init(R,10));

     R.A.X:=R.B.X+CurrentFont^.Width;

     R.B.X:=R.A.X+CurrentFont^.Width*3;

     If IsEDS

      Then s:='В'

      Else s:='Ом';

     D^.Insert(New(PStaticText,Init(R,s)));

     D^.GeTextentWIn(R);

     R.Move(CurrentFont^.Width*2,CurrentFont^.Height*2);

     R.B.Y:=R.A.Y+CurrentFont^.Height;

     R.B.X:=R.A.X+CurrentFont^.Width*15;

     D^.Insert(New(PButton,Init(R,'O~k~',cmOk,bfDefault)));

     If L<>Nil

      Then

       D^.Insert(L);

     c:=DeskTop^.ExecView(D);

     If c<>cmCancel

      Then

       Begin

        If L<>Nil

         Then

          BeginL^.GetData(s);Dispose(L,Done);End;

        i:=0;

        val(s,M,i);

       End;

     If D<>Nil

      Then

       Dispose(D,Done);

    End;

  ElMatter:=M;

 End;

 DestructOr TShemeWIn.Done;

 Begin

  Inherited Done;

  Exist:=False;

 End;

END.



    продолжение
--PAGE_BREAK--
еще рефераты
Еще работы по физике