Методы построения высокопроизводительных схемотехнических САПР тема диссертации и автореферата по ВАК РФ 05.13.12, кандидат наук Абу Хазим Монзер Мохаммед Салем

  • Абу Хазим Монзер Мохаммед Салем
  • кандидат науккандидат наук
  • 2019, ФГАОУ ВО «Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В.И. Ульянова (Ленина)»
  • Специальность ВАК РФ05.13.12
  • Количество страниц 160
Абу Хазим Монзер Мохаммед Салем. Методы построения высокопроизводительных схемотехнических САПР: дис. кандидат наук: 05.13.12 - Системы автоматизации проектирования (по отраслям). ФГАОУ ВО «Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В.И. Ульянова (Ленина)». 2019. 160 с.

Оглавление диссертации кандидат наук Абу Хазим Монзер Мохаммед Салем

Введение

Глава 1. Методы работы с неплотными матрицами

1.1. Слабосвязанные схемы

1.2. Метод адресации

1.3. Связанные списковые схемы

1.4. Реализация методов фиксированного формата

1.5. Выводы по Главе

Глава 2. Повышение производительности схемотехнических САПР при расчете частотных характеристик электронных схем

2.1. Математическое обеспечение для расчета частотных характеристик

2.2. Расчет частотных характеристик линейных электронных схем на основе метода адресации

2.3. Сжатые методы расчета частотных характеристик на базе симметричных матриц

2.4. Выводы по Главе

Глава 3. Повышение эффективности моделирования нелинейных электронных схем на основе сжатого описания данных

3.1. Математическое описание нелинейных систем

3.1.1. Основные уравнения для статического режима нелинейных схем

3.1.2. Математическое описание для расчета переходных процессов нелинейных схем

3.2. Повышение производительности систем расчета электронных схем в стационарном режиме

3.2.1. Расчет статического режима на основе матриц адресации

3.2.2. Моделирование стационарного режима на основе описания схем в симметричном формате

3.3. Методы построения высокопроизводительных систем для расчета

электронных схем в динамическом режиме

3.3.1. Расчет динамического режима на основе матриц адресации

3.3.2. Повышение производительности систем моделирования динамического режима на основе симметричных матриц

3.4. Выводы по Главе

Глава 4. Повышение производительности схемотехнических САПР

на основе сжатого описания многополюсных подсхем

4.1. Алгоритмическое описание расчета сложных систем по частям

4.2. Расчет сложных схем по частям на основе сжатия описания методом адресации

4.3. Расчет схем по частям с использованием технологии сжатия данных в симметричном формате

4.4. Выводы по Главе

Заключение

Список литературы

Приложение

П1. Листинг ЕК^У^ЛОК - Расчет частотных характеристик методом адресации

П2. Акты о внедрении

Рекомендованный список диссертаций по специальности «Системы автоматизации проектирования (по отраслям)», 05.13.12 шифр ВАК

Введение диссертации (часть автореферата) на тему «Методы построения высокопроизводительных схемотехнических САПР»

Введение

Постоянное усложнение проектируемых электронных устройств и значительное повышение размерности массивов, входящих в программный код схемотехнических САПР, приводит к необходимости разработки новых методов повышения производительности программного обеспечения таких систем. Основным резервом для существенного повышения производительности программного обеспечения САПР электронных устройств является слабосвязанная иерархическая структура, которая присуща практически всем электронным схемам. Следствием такой структуры является слабое заполнение ненулевыми элементами матриц, входящих в уравнения моделируемой схемы. Обработка таких матриц в программном обеспечении для решения уравнений моделируемой схемы приводит к выполнению избыточных операций с нулевыми элементами, которые существенно затягивают процесс вычислений. Используемые часто условные операторы для исключения избыточных арифметических операций с нулевыми элементами не снимают полностью проблему, поскольку для выполнения условных операций также требуется определенное время.

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

Общие идеи такой технологии были сформулированы сравнительно давно, однако в существующих отечественных и зарубежных схемотехнических САПР они практически не использованы. Объяснить этот факт можно многими обстоятельствами, среди которых основной является высокая стоимость разработки новых САПР. Кроме того, следует учитывать

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

Вследствие указанных причин полное решение задачи может заключаться только в построении современных отечественных схемотехнических САПР, которые будут полностью построены на основе сжатия информации в матрицах, имеющих низкую степень заполнения ненулевыми элементами, что обеспечит наибольшее увеличение производительности системы. Поскольку все известные в настоящее время методы сжатия данных матриц с низкой степенью заполнения ненулевыми элементами существенно отличаются друг от друга показателями своей эффективности и трудоемкостью построения на их основе программного обеспечения моделируемых систем, то выбор метода сжатия данных должен быть выполнен на основе детальной сравнительной оценки возможных методов. При этом следует учитывать, что некоторые методы фиксированного формата имеют высокую эффективность с точки зрения объема занимаемой памяти при хранении информации, но совершенно не пригодны для формирования функций, которые выполняют решение систем уравнений методом Гаусса или на основе LU-факторизации, поскольку в процессе реализации процесса расчета переменных неизбежно появляются новые ненулевые элементы, для которых в фиксированном формате не предусмотрено место хранения. Существенной характеристикой методов сжатия данных является также возможность их использования для обработки информации непосредственно в сжатой форме без необходимости выполнения даже временного восстановления полного описания моделируемой схемы.

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

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

Цель диссертационной работы

Цель диссертационной работы заключается в исследовании и разработке методов построения высокопроизводительных схемотехнических САПР

Для реализации такой цели следует выполнить решение следующих

задач:

1. Дать сравнительный анализ известных методов сжатия данных в

матрицах с низкой степенью заполнения ненулевыми элементами с

целью оценки их функциональных характеристик, как на этапе разработки системы, так и в процессе эксплуатации системы САПР.

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

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

4. Провести исследование методов увеличения эффективности систем моделирования динамических характеристик нелинейных схем.

5. Реализовать при расчете больших электронных схем технологию сжатия данных на основе декомпозиции исходной схемы путем приведения ее к слабосвязанной иерархической структуре. Объектом исследования являются высокопроизводительные

схемотехнические САПР.

Предметом исследования являются методы построения высокопроизводительного математического и программного обеспечения схемотехнических САПР.

Новые научные результаты

1. Разработана методика повышения производительности систем автоматизации схемотехнического проектирования на основе использования технологии адресных матриц.

2. Разработана методика построения высокопроизводительных схемотехнических САПР на основе двухэтапной технологии сжатия данных в симметричном формате.

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

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

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

Практическая ценность результатов диссертационной работы

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

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

3. Реализовано программное обеспечение для виртуального решения уравнений электронной схемы на основе сжатого описания схемы без восстановления ее исходных матриц.

Основные результаты диссертации внедрены в организации «Модем» и применяются при проведении практических занятий в СПбГЭТУ, о чем имеются соответствующие акты.

Положения, выносимые на защиту 1. Концепция двухуровневой структуры программного обеспечения схемотехнических САПР на основе топологического образа моделируемой схемы с последующим формированием и обработкой ее численного компактного описания.

2. Виртуальные методы реализации матричных операций при формировании и обработке сжатого описания схемы в симметричном формате.

3. Методика сжатия данных при декомпозиции исходной моделируемой схемы на слабосвязанные подсхемы.

Достоверность результатов подтверждается материалами тестовой эксплуатации разработанного программного обеспечения, а также апробацией результатов диссертационной работы при обсуждении докладов на научно-технической конференции СПбГЭТУ и на международных конференциях. Публикации

Основное теоретическое и практическое содержание диссертации опубликовано в 1 4 научных работах, в числе которых 7 - статьи в ведущих рецензируемых изданиях, рекомендованных ВАК к опубликованию основных результатов диссертаций на соискание ученых степеней доктора и кандидата наук, 6 работ - в материалах международных конференций, 1 Свидетельство программы ЭВМ.

Структура и объем диссертации

Текст диссертационной работы состоит из введения, четырех глав с выводами по каждой главе, заключения и библиографического списка, в который входит 71 источник. Диссертационная работа изложена на 160 страницах текста, и содержит 18 рисунков и 7 таблиц.

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

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

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

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

В результате анализа основных характеристик возможных подходов к решению задачи построения сжатого описания электронной схемы

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

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

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

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

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

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

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

В работе рассматриваются технологии сжатой обработки при использовании двух наиболее перспективных для создания высокопроизводительных схемотехнических САПР методов сжатия данных -метода адресации, который обеспечивает минимизацию затрат при

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

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

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

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

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

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

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

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

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

Построение подсистемы схемотехнической САПР для расчета переходных характеристик основано на описании нелинейных электронных схем неявными уравнениями вида, решение которых в работе предлагается проводить на основе неявных методов Гира высших порядков. Для решения используется формула коррекции Гира, которая может быть получена из обобщенной формулы решением ее относительно вектора производных. При практической реализации метода вместо подстановки значений производных в общее уравнение схемы, осуществляется подстановка производных непосредственно в уравнения инерционных компонентов (двухполюсники типа R, ^ L, частотно зависимые управляемые источники), что позволяет получить дискретные модели компонентов, которые приведены в диссертации.

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

топологией электронной схемы и параметрами ее компонентов. Методика построения сжатых массивов в целом аналогична методике, рассмотренной в диссертационной работе при решении задач в частотной области, основное различие заключается в замене типа данных Complex на тип double и использовании дискретных моделей компонентов.

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

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

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

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

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

Решение матричного уравнения схемы можно провести в четыре этапа. На первом этапе вводится описание к-й подсхемы и реализуется нормализованный алгоритм Гаусса Жордано. При этом к-й блочный диагональный элемент преобразуется в единичную матрицу.

На втором этапе выполняется исключение вектора внутренних переменных из уравнения последней блочной строки. На третьем этапе выполняется расчет вектор переменных связи и на четвертом этапе для каждой подсхемы выполняется расчет вектора подсхем.

Похожие диссертационные работы по специальности «Системы автоматизации проектирования (по отраслям)», 05.13.12 шифр ВАК

Список литературы диссертационного исследования кандидат наук Абу Хазим Монзер Мохаммед Салем, 2019 год

- 606 с.

54. Сигорский, В.П. Математический аппарат инженера [Текст]: монография / В.П.Сигорский. - Киев: Техника, 1975. - 765 с.

55. Слипченко, В.Г. Машинные алгоритмы и программы моделирования электронных схем [Текст]: монография / В.Г.Слипченко, В.Г.Табарный -Киев: Техника, 1976. - 157 с.

56. Советов, Б.Я. Моделирование систем [Текст]: монография / Б.Я.Советов, С.А.Яковлев. - М.: Высшая школа, 1985. - 271 с.

57. Сольницев, Р.И. Автоматизация проектирования систем автоматического управления [Текст]: монография / Р.И.Сольницев. - М.: Высшая школа, 1991. - 328 с.

58. Сольницев, Р.И. Основы автоматизации проектирования гироскопических систем. [Текст]: монография / Р.И. Сольницев. - М.: Высшая школа, 1985. - 240 с.

59. Степаненко, И.П. Основы микроэлектроники: учеб. пособие для вузов [Текст]: монография / И.П.Степаненко. - М.: Советское радио, 1980. -567 с.

60. Трауб Дж. Итерационные методы решения уравнений. [Текст]: монография / Дж. Трауб. пер. с англ.. - М.: Мир, 1985. - 263 с.

61. Тарасик, В.П. Математическое моделирование технических систем [Текст]: монография / В.П. Тарасик. - Минск: Дизайн ПРО, 2004. - 639 с.

62. Трудономин, В.А. Математические модели технических объектов / В.А. Трудономин, Н.В.Пивоварова. - М. : Высшая школа, 1986. - 157 с.

63.Тьюарсон, Ф.Р. Разреженные матрицы [Текст]: монография / Ф.Р.Тьюарсон.; пер. с анг. - М.: Мир, 1977. - 189 с.

64. Фадеев, Д.К. Вычислительные методы линейной алгебры [Текст]: монография / Д.К.Фадеев, В.Н. Фадеева. - М.: Изд-во Физ-мат литературы, 1963. - 734 с.

65. Форсайт, Дж. Машинные методы математических вычислений [Текст]: монография / Дж.Форсайт, М.Малькольм, К.Моулер.; пер. с англ. под ред. Х.Д.Икрамова. - М.: Мир, 1980. - 277 с.

66. Цимбал, А.А. Технология создания распределенных систем [Текст]: монография / А.А.Цимбал, М.Л.Аншина. - СПб.: Питер, 2003. - 576 с.

67. Чуа, Л.О. Машинный анализ электронных схем [Текст]: монография / Л.О.Чуа, Лин.Пен-Мин.; пер. с анг. -М.: Энергия, 1980. - 631с.

68. Хайнеман, Р. PSPICE Моделирование работы электронных схем [Текст]: монография / Р.Хайнеман. -M.: Издательство ДМК, 2005. - 327с.

69. Хэпп, Х. Диакоптика и электрические цепи [Текст]: монография / пер. с анг. -M.: Изд. «Мир» 1974. - 342 с.

70. Шакиров М.А Теоретические основы электротехники. Новые идеи и принципы. Схемоанализ и диакоптики. [Текст]: монография / - СПб.: Изд-во СПбГТУ, 2001. - 212с.

71. Эстербю, О. Прямые методы для разреженных матриц [Текст]: монография / О.Эстербю, З. Златев.; пер. с анг. - М.: Мир, 1987. - 111 с.

Приложение

П1. Листинг FRQVS_ADR - Расчет частотных характеристик методом адресации

using System;

using System.Collections .Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; //+ using System.Collections;//+ using System.Linq; namespace FRQVS { public partial class FrqvsDlg : Form { public FrqvsDlg()

{ InitializeComponent(); }

private void ID_CONS_Click(object sender, EventArgs e) { SIZE size = new SIZE(); size.ShowDialog(this); size.Dispose(); if (GV.nr > 0) { R ir = new R(); ir.ShowDialog(this); ir.Dispose();

}

if (GV.nc > 0) { C ic = new C(); ic.ShowDialog(this);

ic.Dispose();

if (GV.nl > 0)

{ L il = new L(); il.ShowDialog(this); il.Dispose();

}

if (GV.nju > 0) //если введенное количество ч/з ИТУН больше нуля

{ JU iju = new JU(); //создание экземпляра класса JU iju.ShowDialog(this); //открытие диалогового окна iju.Dispose(); //освобождение ресурсов, используемым объектом iju

}

if (GV.neu > 0) //если введенное количество ч/з ИНУН больше нуля

{ EU ieu = new EU(); //создание экземпляра класса EU ieu.ShowDialog(this); //открытие диалогового окна ieu.Dispose(); //освобождение ресурсов, используемым объектом ieu

}

if (GV.nji > 0) //если введенное количество ч/н ИТУТ больше нуля

{ JI iji = new JI(); //создание экземпляра класса JI iji.ShowDialog(this); //открытие диалогового окна iji.Dispose(); //освобождение ресурсов, используемым объектом iju

}

if (GV.nei > 0) //если введенное количество ч/н ИНУТ больше нуля

{ EI iei = new EI(); //создание экземпляра класса EI iei.ShowDialog(this); //открытие диалогового окна iei.Dispose(); //освобождение ресурсов, используемым объектом iei

}

if (GV.ntri > 0 { TRI itri = new TRI(); //создание экземпляра класса TRI itri.ShowDialog(this); //открытие диалогового окна

itri.Dispose(); //освобождение ресурсов, используемым объектом itri

if (GV.ntr > 0) {

TR itr = new TR(); //создание экземпляра класса TR itr.ShowDialog(this); //открытие диалогового окна itr.Dispose(); //освобождение ресурсов, используемым объектом itr

}

if (GV.ntb > 0

{ TB itb = new TB(); //создание экземпляра класса TB itb.ShowDialog(this); //открытие диалогового окна itb.Dispose(); //освобождение ресурсов, используемым объектом itb

}

if (GV.ntu > 0)

{ TU itu = new TU(); //создание экземпляра класса TU itu.ShowDialog(this); //открытие диалогового окна itu.Dispose(); //освобождение ресурсов, используемым объектом itu

}

if (GV.nou > 0)

{

OU iou = new OU(); //создание экземпляра класса OU iou.ShowDialog(this); //открытие диалогового окна iou.Dispose(); //освобождение ресурсов

}

F f = new F(); //создание экземпляра класса F

f.ShowDialog(this); //открытие диалогового окна

f.Dispose(); //освобождение ресурсов, используемым объектом f

IO io = new IO(); //создание экземпляра класса IO

io.ShowDialog(this); //открытие диалогового окна

io.Dispose(); //освобождение ресурсов, используемым объектом io

OnCalc(); //вызов метода расчета

private void ID_F_Click(object sender, EventArgs e) //метод, вызываемый при нажатии на "Вид частотной характеристики" { F f = new F(); //создание экземпляра класса F f.ShowDialog(this); //открытие диалогового окна f.Dispose(); //освобождение ресурсов, используемым объектом f MessageBox.Show("Выберите в меню дальнейший режим работы",

"Режим работы", MessageBoxButtons.OK); }

private void ID_IO_Click(object sender, EventArgs e) { IO io = new IO(); //создание экземпляра класса IO io.ShowDialog(this); //открытие диалогового окна io.Dispose(); //освобождение ресурсов, используемым объектом io MessageBox.Show("Выберите в меню дальнейший режим работы",

"Режим работы", MessageBoxButtons.OK); }

private void OnCalc() //метод для расчета { GV.X = new Complex[GV.n + 1]; GV.WZ.Add(new Complex(0, 0)); GV.SZ.Add(new Complex(0, 0));

for (int kf = 1; kf <= GV.nf; kf++) //для всех частотных точек { GV.s = new Complex(0.0, 2 * 3.141593 * GV.f[kf]); for (int i = 0; i < GV.n + 1; i++) for (int j = 0; j < GV.n + 1; j++) GV.A[ij] = 0; for (int i = 0; i < GV.WZ.Count; i++)

GV.WZ[i] = GV.cn; for (int i = 0; i < GV.SZ.Count; i++)

GV.SZ[i] = GV.cn; GV.n = GV.nv; //количество узлов

form_d(ref GV.in_r, ref GV.z_r, GV.nr, 'R');

form_d(ref GV.in_c, ref GV.z_c, GV.nc, 'C');

form_l();

form_ju();

form_eu();

form_ji();

form_ei();

form_tri();

form_tr();

form_tb();

form_tu();

form_ou();

form_s(); // формирование задающего источника int v;

gauss_c(); //метод Гаусса sf2(kf); //расчет передаточных функций } //end kf //Вывод результатов моделирования

dataGridViewl.RowCount = GV.f.Count(); string str = "";

for (int kf = 1; kf < GV.f.Count() - 1; kf++) {

if (kf <= GV.nf)

{

dataGridView 1. Rows [kf - 1].Cells[0].Value = GV.f[kf]; str = String.Format("{0,12:E2}",GV.kum[kf]); dataGridView 1.Rows [kf - 1].Cells[1].Value = str; str = String.Format("{0,12:F2}", GV.kua[kf]); dataGridView 1.Rows [kf - 1].Cells[2].Value = str; str = String.Format("{0,12:E2}", GV.rim[kf]);

dataGridView l.Rows [kf - 1].Cells[3].Value = str; str = String.Format("{0,12:F2}", GV.ria[kf]); dataGridView l.Rows [kf - 1].Cells[4].Value = str;

}

else

{ str = "";

dataGridView 1 .Rows [kf - 1].Cells[0].Value = str; dataGridView 1.Rows [kf - 1].Cells[1].Value = str; dataGridView 1.Rows [kf - 1].Cells[2].Value = str; dataGridView 1.Rows [kf - 1].Cells[3].Value = str; dataGridView 1.Rows [kf - 1].Cells[4].Value = str;

}

}

}

}

}

//Функции формирования описания namespace FRQVS { public partial class FrqvsDlg { public void form_d (ref int[,] in_d, ref float[] z_d, int nd, char td) { int i,j,g,a=0; Complex z = new Complex(0,0); for(int kd= 1 ;kd<=nd;kd++) for(int l=0;l<=1;l++) { i=in_d[kd,l]; if(i==0) continue; for(int m=0;m<=1;m++) { j=in_d[kd,m]; if(j==0) continue; g=(1-2*l)*(1-2*m);

switch(td) { case 'R': a=GV.A[i, j];

z = new Complex(g / z_d[kd], 0); if (a!= 0)

{ GV.WZ[a] = (Complex)GV.WZ [a] + z; }

else {

GV.WZ.Add(z);

GV.A[i, j] = (short)(GV. WZ .Count-1);

}

break; case 'C': a = GV.A[i, j];

z = g * GV.s * z_d[kd]; if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ [a] + z; }

else

{ GV.WZ.Add(z); GV.A[i, j] = (short)(GV. WZ.Count-1);

}

break;

}

}

}

}

public void form_l() { int i, j, g, a = 0; Complex z = new Complex(0, 0);

for (int kl = 1; kl<= GV.nl; kl++) //цикл по всем строкам { i = GV.n + kl; //число узлов+текущий номер строки z = GV.s * GV.z_l[kl]; a = GV.A[i, i]; if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ[a] + z;

}

else

{ GV.WZ.Add(z); GV.A[i, i] = (short)(GV.WZ.Count - 1);

}

for (int m = 0; m <= 1; m++) { j = GV.in_l[kl, m]; if (j == 0) continue; g = (1 - 2 * m);

z = new Complex(-g, 0); //запись в матрицу 1 или -1 a = GV.A[i, j]; if (a != 0)

{GV.WZ[a] = (Complex)GV. WZ [a] + z;

}

else

{ GV.WZ.Add(z); GV.A[i, j] = (short)(GV.WZ.Count - 1);

}

z = new Complex(+g, 0); //запись в матрицу 1 или -1 a = GV.A[j, i]; if (a != 0)

{ GV.WZ[a] = (Complex)GV. WZ [a] + z;

}

else

{ GV.WZ.Add(z); GV.A[j, i] = (short)(GV.WZ.Count - 1);

}

}

}

GV.n += GV.nl;

}

public void form_ju() { Complex ys = new Complex(0, 0); int i, j, g, a=0;

Complex z = new Complex(0, 0);

for (int kju = 1; kju <= GV.nju; kju++) //цикл по всем строкам { ys = GV.z_ju[kju, 0] * (1 + GV.s * GV.z_ju[kju, 1]) / (1 + GV.s * GV.z_ju[kju, 2]); //y(s)=y0*(1+s*T1)/(1+s*T2)

for (int l = 2; l <= 3; l++) //цикл по последним двум столбцам { i = GV.in_ju[kju, l]; if (i == 0) continue;

for (int m = 0; m <= 1; m++) //цикл по первым двум столбцам { j = GV.in_ju[kju, m]; if (j == 0) continue; g = (5 - 2 * l) * (1 - 2 * m); a = GV.A[i, j]; z = g * ys; if (a != 0)

{ GV.WZ[a] = (Complex)GV. WZ [a] + z;

}

else

{ GV.WZ.Add(z); GV.A[i, j] = (short)(GV.WZ.Count - 1);

}

}

}

}

public void form_eu() { Complex ms = new Complex(0, 0); int i, j, g, a=0;

Complex z = new Complex(0, 0);

for (int keu = 1; keu <= GV.neu; keu++) //цикл по всем строкам { ms = GV.z_eu[keu, 0] * (1 + GV.s * GV.z_eu[keu, 1]) / (1 + GV.s * GV.z_eu[keu, 2]); //m(s)=m0*(1+s*T1)/(1+s*T2)

i = GV.n + keu; //число узлов+текущий номер строки for (int m = 0; m <= 3; m++) //цикл по всем столбцам { j = GV.in_eu[keu, m]; if (j == 0) continue;

if (m < 2) //если нулевой или первый столбец { g = 1 - 2 * m; //1 если нулевой столбец и -1 если первый a = GV.A[i, j];

z = g * ms; //запись в матрицу m(s) или -m(s) if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ[a] + z;

}

else

{ GV.WZ.Add(z); GV.A[i, j] = (short)(GV.WZ.Count - 1);

}

}

else //если второй или третий столбец { g = 5 - 2 * m; //1 если второй столбец и -1 если третий a = GV.A[i, j];

z = new Complex (g, 0); //запись в матрицу 1 или -1 if (a != 0)

{GV.WZ[a] = (Complex)GV. WZ[a] - z;

}

else

{ GV.WZ.Add(z); GV.A[i, j] = (short)(GV.WZ.Count - 1);

}

a = GV.A[j, i];

z = new Complex(g, 0); //запись в матрицу -1 или 1 if (a != 0)

{ GV.WZ[a] = (Complex)GV. WZ [a] + z;

}

else

{ GV.WZ.Add(z); GV.A[j, i] = (short)(GV.WZ.Count - 1);

}

}

}

}

GV.n += GV.neu; //изменение размерности

}

public void form_ji() { int i, j, g, a=0; Complex bs = new Complex(0, 0); Complex z = new Complex(0, 0);

for (int kji = 1; kji <= GV.nji; kji++) //цикл по всем строкам {bs = GV.z_ji[kji, 0] * (1 + GV.s * GV.z_ji[kji, 1]) / (1 + GV.s * GV.z_ji[kji, 2]); //b(s)=b0*(1+s*T1)/(1+s*T2)

j = GV.n + kji; //число узлов+текущий номер строки

for (int l = 0; l <= 3; l++) //цикл по всем столбцам { i = GV.in_ji[kji, l]; if (i == 0) continue;

if (l < 2) //если нулевой или первый столбец { g = 1 - 2 * l; //1 если нулевой столбец и -1 если первый a = GV.A[i, j];

z = new Complex (-g, 0); //запись в матрицу 1 или -1 if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ[a] + z;

}

else

{ GV.WZ.Add(z); GV.A[i, j] = (short)(GV.WZ.Count - 1);

}

a = GV.A[j, i];

z = new Complex (g, 0); //запись в матрицу -1 или 1 if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ[a] + z;

}

else

{ GV.WZ.Add(z); GV.A[j, i] = (short)(GV.WZ.Count - 1);

}

}

else //если второй или третий столбец { g = 5 - 2 * l; //1 если второй столбец и -1 если третий a = GV.A[i, j];

z = g * bs; //запись в матрицу b(s) или -b(s) if (a != 0)

{ GV.WZ[a] = (Complex)GV. WZ [a] + z;

}

else

{ GV.WZ.Add(z); GV.A[i, j] = (short)(GV.WZ.Count - 1);

}

}

}

}

GV.n += GV.nji; //изменение размерности

}

public void form_ei() { int i1, i2, j, g, a=0; Complex z = new Complex(0, 0); Complex zs = new Complex(0, 0);

for (int kei = 1; kei <= GV.nei; kei++) //цикл по всем строкам { zs = GV.z_ei[kei, 0] * (1 + GV.s * GV.z_ei[kei, 1]) / (1 + GV.s * GV.z_ei[kei, 2]); //b(s)=b0*(1+s*T1)/(1+s*T2)

11 = GV.n + kei; //число узлов+текущий номер строки

12 = i1 + GV.nei; //число узлов+текущий номер строки+число ИНУТ a = GV.A[i2, i1];

z = zs; if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ [a] + z; }

else

{ GV.WZ.Add(z); GV.A[i2, i1] = (short)(GV.WZ.Count - 1);

}

for (int m = 0; m <= 3; m++) //цикл по всем столбцам { j = GV.in_ei[kei, m];

if (j == 0) continue;

if (m < 2) //если нулевой или первый столбец { g = 1 - 2 * m; //1 если нулевой столбец и -1 если первый a = GV.A[i1, j];

z = new Complex (g, 0); //запись в матрицу -1 или 1

if (a != 0) {

GV.WZ[a] = (Complex)GV. WZ[a] - z;

}

else

{ GV.WZ.Add(z); GV.A[i1, j] = (short)(GV.WZ.Count - 1);

}

a = GV.A[j, i1];

z = new Complex (g, 0); //запись в матрицу 1 или -1 if (a != 0)

{ GV.WZ[a] = (Complex)GV. WZ [a] + z;

}

else

{ GV.WZ.Add(z); GV.A[j, i1] = (short)(GV.WZ.Count - 1);

}

}

else //если второй или третий столбец { g = 5 - 2 * m; //1 если второй столбец и -1 если третий a = GV.A[i2, j];

z = new Complex (g, 0); //запись в матрицу -1 или 1 if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ[a] - z;

}

else {

GV.WZ.Add(z);

GV.A[i2, j] = (short)(GV.WZ.Count - 1);

}

a = GV.A[j, i2];

z = new Complex (g, 0); //запись в матрицу 1 или -1 if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ[a] + z;

}

else

{ GV.WZ.Add(z); GV.A[j, i2] = (short)(GV.WZ.Count - 1);

}

}

}

}

GV.n += 2 * GV.nei; //изменение размерности

}

public void form_tri() { int i, j, g, a=0; Complex z = new Complex(0, 0);

for (int ktri = 1; ktri <= GV.ntri; ktri++) //цикл по всем строкам { i = GV.n + ktri; //число узлов+текущий номер строки for (int m = 0; m <= 3; m++) //цикл по всем столбцам { j = GV.in_tri[ktri, m]; if (j == 0) continue;

if (m < 2) //если нулевой или первый столбец { g = 1 - 2 * m; //1 если нулевой столбец и -1 если первый a = GV.A[i, j];

z = new Complex (g * GV.z_tri[ktri], 0);

if (a != 0)

{ GV.WZ[a] = (Complex)GV. WZ [a] + z;

}

else

{ GV.WZ.Add(z); GV.A[i, j] = (short)(GV.WZ.Count - 1);

}

a = GV.A[j, i];

z = new Complex (g * GV.z_tri[ktri], 0 if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ[a] - z;

}

else

{ GV.WZ.Add(z); GV.A[j, i] = (short)(GV.WZ.Count - 1);

}

}

else //если второй или третий столбец { g = 5 - 2 * m; //1 если второй столбец и -1 если третий a = GV.A[i, j];

z = new Complex (g, 0); //запись в матрицу 1 или -1 if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ[a] - z;

}

else

{ GV.WZ.Add(z); GV.A[i, j] = (short)(GV.WZ.Count - 1);

}

a = GV.A[j, i];

z = new Complex (g, 0); //запись в матрицу -1 или 1

if (a != 0)

{ GV.WZ[a] = (Complex)GV. WZ [a] + z;

}

else

{ GV.WZ.Add(z); GV.A[j, i] = (short)(GV.WZ.Count - 1);

}

}

}

}

GV.n += GV.ntri; //изменение размерности

}

public void form_tb()

{ Complex n = new Complex(0, 0); //создание комплексного числа 0+0i Complex[,] y = new Complex[5, 5]; //матрица комплексных чисел int i, j, ii, jj, g, l, m, a=0; Complex z = new Complex(0, 0);

int[,] in_d = new int[5, 2] { { 4, 3 }, { 1, 4 }, { 4, 2 }, { 1, 4 }, { 4, 2 } }; int[] in_ju = new int[4] { 4, 1, 2, 4 } for (int ktb = 1; ktb <= GV.ntb; ktb++) //цикл по всем строкам { for (i = 1; i <= 4; i++) //цикл по всем строкам for (j = 1; j <= 4; j++) //цикл по всем столбцам y[i, j] = n; //обнуление матрицы for (int k = 0; k <= 4; k++) //цикл по всем строкам

for (l = 0; l <= 1; l++) //цикл по нулевому и первому столбцам { i = in_d[k, l]; for (m = 0; m <= 1; m++) {

j = in_d[k, m]; g = (1 - 2 * l) * (1 - 2 * m); if (k < 3) //если столбцы 0-2

y[i, j] += g / GV.z_tb[ktb, k]; else //если столбцы 3-5 y[i, j] += g * GV.s * GV.z_tb[ktb, k]; }

}

for (l = 2; l <= 3; l++) //цикл по всем элементам вектора inju {

i = in_ju[l];

for (m = 0; m <= 1; m++) //цикл по нулевому и первому элементам {

j = in_ju[m]; g = (5 - 2 * l) * (1 - 2 * m

y[i, j] += g * GV.z_tb[ktb, 5] / (1 + GV.z_tb[ktb, 5]) / GV.z_tb[ktb, 1]; }

for (i = 3; i >= 1; i--) for (j = 3; j >= 1; j--)

y[i, j] -= y[i, 4] * y[4, j] / y[4, 4]; for (i = 1; i <= 3; i++) {

ii = GV.in_tb[ktb, i]; if (ii == 0) continue;

for (j = 1; j <= 3; j++) //цикл по всем столбцам { jj = GV.in_tb[ktb, j]; if (jj == 0) continue; a = GV.A[ii, jj];

z = y[i, j]; //запись в матрицу значений из матрицы y if (a != 0)

{ GV.WZ[a] = (Complex)GV. WZ [a] + z;

}

else

{ GV.WZ.Add(z); GV.A[ii, jj] = (short)(GV.WZ.Count - 1);

}

}

}

}

public void form_tu()

{ Complex n = new Complex(0, 0); //создание комплексного числа 0+0i Complex[,] y = new Complex[4, 4]; //матрица комплексных чисел int[,] in_d = new int[4, 2] { { 2, 3 }, { 1, 3 }, { 1, 2 }, { 2, 3 } }; int[] in_ju = new int[4] { 1, 3, 2, 3 }; int i, j, ii, jj, l, m, g, a=0; Complex z = new Complex(0, 0);

for (int ktu = 1; ktu <= GV.ntu; ktu++) //цикл по всем строкам { for (i = 1; i <= 3; i++) //цикл по всем строкам for (j = 1; j <= 3; j++) //цикл по всем столбцам y[i, j] = n; //обнуление массива for (int k = 0; k <= 3; k++) //цикл по всем строкам

for (l = 0; l <= 1; l++) //цикл по нулевому и первому столбцам { i = in_d[k, l]; for (m = 0; m <= 1; m++) {

j = in_d[k, m]; g = (1 - 2 * l) * (1 - 2 * m); if (k == 0) //если Rs

y[i, j] += g / GV.z_tu[ktu, k]; else //если Czi, Czs, Csi

y[i, j] += g * GV.s * GV.z_tu[ktu, k]; }

}

for (l = 2; l <= 3; l++) //цикл по всем элементам вектора { i = in_ju[l];

for (m = 0; m <= 1; m++) //для нулевого и первого элемента

{ j = in_ju[m];

g = (5 - 2 * l) * (1 - 2 * m);

y[i, j] += g * GV.z_tu[ktu, 4]; запись в массив S или -S

}

}

for (i = 1; i <= 3; i++) //цикл по всем строкам {

ii = GV.in_tu[ktu, i]; if (ii == 0) continue;

for (j = 1; j <= 3; j++) //цикл по всем столбцам { jj = GV.in_tu[ktu, j]; if (jj == 0) continue; a = GV.A[ii, jj];

z = y[i, j]; //запись в матрицу значений из матрицы y if (a != 0)

{ GV.WZ[a] = (Complex)GV.WZ[a] + z;

}

else

{ GV.WZ.Add(z); GV.A[ii, jj] = (short)(GV.WZ.Count - 1);

}

}

}

}

}

public void form_s() { if (GV.lp != 0)

{ GV.SZ.Add(new Complex(-1, 0)); GV.A[GV.lp, 0] = (short)(GV.SZ.Count-1);

}

if (GV.lm != 0)

{ GV.SZ.Add(new Complex(1, 0)); GV.A[GV.lm, 0] = (short)(GV.SZ.Count-1);

}

}

}

}

//Функции решения уравнений

namespace FRQVS {

public partial class FrqvsDlg { //Решение уравнений

public void gauss_c() {

int i, j, k, l, m; short t;

Complex cn = new Complex(0, 0); GV.X = new Complex[GV.n + 1]; for (i = 0; i < GV.n + 1; i++)

GV.X[i] = new Complex(0, 0); Complex c = new Complex(0, 0); Complex d = new Complex(0, 0); Complex tc = new Complex(0, 0); Complex z = new Complex(0, 0); Complex z1 = new Complex(0, 0); Complex z0 = new Complex(0, 0);

for (k = 1; k < GV.n; k++) {

l = k;

for (i = k + 1; i <= GV.n; i++)

//if (GV.w[i, k].abs > GV.w[l, k].abs)

{

z = (Complex)GV.WZ[GV.A[i, k]]; zl = (Complex)GV.WZ[GV.A[l, k]]; if (z.abs > zl.abs) l = i;

I

if (l != k) for (j = О; j <= GV.n; j++)

if (j == О II j >= k)

{

//t = GV.w[k, j]; //GV.w[k, j] = GV.w[l, j]; //GV.w[l, j] = t; t = GV.A[l, j]; GV.A[l, j] = GV.A[k, j]; GV.A[k, j] = t;

I

d = 1.О / (Complex)GV.WZ[GV.A[k, k]];

for (i = k + 1; i <= GV.n; i++) {

//if (GV.w[i, k] == cn) if (GV.A[i, k] == О)

continue; //c = GV.w[i, k] * d; c = (Complex)GV.WZ[GV.A[i, k]] * d; for (j = k + 1; j <= GV.n; j++) //if (GV.w[k, j] != cn) if (GV.A[k, j] != О) //GV.w[i, j] = GV.w[i, j] - c * GV.w[k, j];

if (GV.A[i, j] != 0) GV.WZ[GV.A[i, j]] = (Complex)GV.WZ[GV.A[i, j]] - c * (Complex)GV.WZ[GV.A[k, j]];

else {

GV.WZ.Add(new Complex(0, 0)); GV.A[i, j] = (short)(GV.WZ.Count - 1); GV.WZ[GV.A[i, j]] = (Complex)GV.WZ[GV.A[i, j]] - c *

(Complex)GV.WZ[GV.A[k, j]]; }

//if (GV.w[k, 0] != cn) if (GV.A[k, 0] != 0) //GV.w[i, 0] = GV.w[i, 0] - c * GV.w[k, 0]; if (GV.A[i, 0] != 0)

GV.SZ[GV.A[i, 0]] = (Complex)GV.SZ[GV.A[i, 0]] - c * (Complex)GV.SZ[GV.A[k, 0]];

else {

GV.SZ.Add(new Complex(0, 0)); GV.A[i, 0] = (short)(GV.SZ.Count - 1); GV.SZ[GV.A[i, 0]] = (Complex)GV.SZ[GV.A[i, 0]] - c *

(Complex)GV.SZ[GV.A[k, 0]]; }

}//end i }//end k

Обратите внимание, представленные выше научные тексты размещены для ознакомления и получены посредством распознавания оригинальных текстов диссертаций (OCR). В связи с чем, в них могут содержаться ошибки, связанные с несовершенством алгоритмов распознавания. В PDF файлах диссертаций и авторефератов, которые мы доставляем, подобных ошибок нет.