Перейти к содержимому

Как создать матрицу в maxima

  • автор:

Математика за компьютером

где стр1 — стрN — списки элементов каждой из строк. В wxMaxima также можно воспользоваться меню «Алгебра» — «Enter matrix«, затем указать имя, размер, тип матрицы и заполнить её элементы. Кстати, элементами могут быть не только числа, но и символьные переменные. Получить элемент (i,j) матрицы M можно с помощью выражений M[i,j] или M[i][j]. При этом индексация начинается с 1, т.е. M[1,1] — левый верхний угол.

Вектор можно задать либо как однострочную матрицу с последующим транспонированием, либо воспользоваться функцией covect(стр), но для этого придётся предварительно загрузить пакет «eigen» функцией load().

n-ную строку матрицы M возвращает функция row(M,n), столбец — col(M,n). Добавить строки можно с помощью addrow(M, элт1, элт2, . ), столбцы — addcol(M, элт1, элт2, . ), где элт1, элт2, . — список элементов (матриц или списков), которые должны быть присоединены. Сформировать подматрицу позволяет функция submatrix(i1,i2. in,M,j1,j2. jk), где слева от имени матрицы M перечисляются удаляемые строки, справа — столбцы). Квадратную единичную матрицу размера n можно получить с помощью функции ident(n), нулевую матрицу m x nzeromatrix(m,n).

Операции над матрицами, записанные с помощью знаков +, , *, /, ^, выполняются поэлементно. Матричное произведение обозначается точкой «.«, а чтобы возвести в степень именно матрицу, используйте японский смайлик «^^«.

Математическая система Maxima

Система выполняет операции с комплексными числами. Они записываются в алгебраической форме с мнимой единицей, которая обозначается i (учитывается регистр, то есть используется именно маленькая буква); то есть в виде a+b*i, где а и b — соответственно действительная и мнимая части числа. Например:


Структурированные типы данных

Для создания массивов используется функция matrix.

[Имя матрицы:]matrix([значение элементов в строке, отделяющиеся друг от друга запятой] [,значение элементов в строке, отделяющиеся друг от друга запятой]. )

Значения строк также отделяются запятой.

Следовательно, для создания вектора-строки следует применить функцию так:

Пример создания матрицы:

Работу с матрицами обеспечивают также команды пункта главного меню Алгебра и несколько инструментов панели «Statistics».

Например, создание массива с помощью команд пункта главного меню Алгебра осуществляется так:

  1. Выполнить команду Алгебра > Enter Matrix (Ввести матрицу). Появится окно «Матрица».
  2. Определить размерность матрицы, а при необходимости и ее тип, например «диагональная».
  3. В поле «Name» (Имя) ввести имя матрицы.
  4. Появится окно с матрицей заданной размерности, в котором вводятся элементы матрицы.
  5. Щелкнуть «ОК».
Операции с массивами
Операция Примечание
М1+М2 Добавление Массивы должны быть одинаковой размерности
М1-М2 Вычитание
М1.М2 Умножение массивов Массивы должны быть соответствующей размерности: количество столбцов в левой матрице М1 должно равняться количеству строк в правой матрице М2. Результатом будет новая матрица, которая будет иметь такое же количество строк, как и в матрицы М1, и такое же количество столбцов, как и в матрице М2
М1*М2 Поэлементное умножение массивов или умножение массива на скаляр Массивы должны быть одинаковой размерности. Векторы должны иметь одинаковую структуру, то есть быть оба или столбцами или строками. При выполнении действия умножения двух массивов результатом будет массив такой же размерности, каждый элемент которого является произведением элементов массивов с одинаковыми порядковыми номерами

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

  1. Увеличение количества столбцов. Используется функция addcol, имеющая два аргумента: имя массива и новые элементы в виде списка или матрицы. Список элементов записывается в квадратных скобках; при этом каждый элемент отделяется друг от друга запятой. Следует не забывать применить перед этим оператором действие присвоения для массива, для которого происходит увеличение количества элементов. Например, если нужно прибавить к массиву V1 два элемента (9 и 10), то функция будет иметь вид:
    V1: addcol(V1,[9,10]);
  2. Увеличение количества строк. Используется функция addrow, имеющая два аргумента: имя массива и новые элементы в виде списка или матрицы. Например, если нужно прибавить к массиву V1 еще одну строку с элементами 1,2,3,4,5, то функция будет иметь вид:
    V1: addrow(V1,[1,2,3,4,5]);
  3. Уменьшение количества столбцов. Используется функция submatrix, имеющая синтаксис:
    submatrix(Имя матрицы; начальный номер удаляемого столбца; конечный номер удаляемого столбца).
    Например, если нужно удалить из матрицы V1 6-й и 7-й столбец, то функция будет иметь вид:
    V1: submatrix(V1, 6,7);
  4. Уменьшение количества строк. Используется функция submatrix, имеющая синтаксис:
    submatrix(начальный номер удаляемой строки, конечный номер удаляемой строки; Имя матрицы;)

Для обращения к конкретному элементу массива М используется выражение M[j, i], где М — имя массива, j — номер строки и i — номер столбца. При этом такая запись распространяется и на вектор (одномерный массив), и на матрицу (двумерный массив). Для одномерных массивов просто добавляется еще один элемент: для вектора-столбца это будет номер строки, а для вектора-строки — номер строки. Понятно, что в обоих случаях этот номер всегда равен «1».

Например, если нужно сложить значение второго элемента вектора-строки V0 и четвертого элемента вектора-столбца V1, то это осуществляется так:

Все значения элементов массива могут быть одновременно изменены на одно и то же значение. Для этого необходимо после имени массива добавить знак математической операции и число, на которое нужно изменить все элементы массива. Например, нужно создать новую матрицу, все элементы которой будут равняться «1». Это может быть осуществлено путем создания матрицы, например, с именем М7, все элементы которой равняются «0», а потом использованием оператора:

Специальные функции для создания матриц
zeromatrix(m, n) Создание матрицы размерностью m*n, все элементы которой равняются «0»
ident(n) Создание единичной квадратной матрицы размерностью n*n (все ее элементы равняются нулю, кроме элементов главной диагонали, значение которых равняется «1»)
diagmatrix(n, x) Создание диагональной квадратной матрицы размерностью n*n, элементами главной диагонали которой являются значения переменной x; а все другие ее элементы равняются «0»

Матрицу также можно создать автоматически по определенному алгоритму. Для этого следует выполнить команду Алгебра > Generate Matrix from Expression (Генерировать матрицу из выражения), после чего появится окно «Создать матрицу». В поле «matrix[i, j]» вводится математическое выражение, согласно которого и формируются элементы матрицы. Если в текущей сессии предусматривается использовать матрицу несколько раз, то в окне «Создать матрицу» целесообразно также задать имя матрицы. Такой вариант создания матрицы эквивалентен использованию циклов в языках программирования.


Построение графиков

Графические возможности системы достаточно скромны, но все же она позволяет строить графики трех форматов:

  1. Gnuplot graph. Используется при применении встроенных функций построения графиков. Имеет собственную систему команд, может работать интерактивно (в режиме командной строки) и выполнять скрипты.
  2. Встроенный. По умолчанию предлагается во время выбора инструмента построения графиков на панели «General Math» или по команде Plot > Plot 2d.
  3. Openmath. Система разметки математической семантики, которая назначена дополнить MathML. MathML (от англ. Mathematical Markup Language — язык математической разметки) — это дополнение XML, которое используется для представления математических символов и формул в документах WWW.
Функциональные возможности графиков
Gnuplot graph Встроенный Openmath
Копирование в буфер обмена и вставка из него в другие документы + +
Изменение размеров графика +
Изменение цвета фона +
Форматирование масштабных ординат, легенды +
Изменение цвета, типа и толщины линий + *
Сохранение в форматах JPG, BMP, PNG PS
* Возможно конфигурированием, после чего заданные параметры применяются для всех новых создаваемых графиков.

Формат построенного графика можно изменить. Для этого следует выделить команду для построения графика, выполнить команду Plot > Plot Format и ввести название другого формата графика в поле «Введите новый формат графиков» в окне «Формат графика».


Двумерная (2D) графика

Двумерные графики строятся с помощью функции plot2d.

plot2d(y(x), [x, xmin, xmax])

где y(x) — функция от x, значения которой изменяются на интервале от xmin до xmax.

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

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

Еще проще строить функции при помощи инструментов «График 2D» и «График 3D» панели «General Math» или по команде Plot > Plot 2d. (Plot 3d). Использование этих команд инициирует появление окна «График 2D» или «График 3D». В этом окне пользователь имеет возможность определить ряд параметров, в частности:

  1. Начальное и конечное значение изменений для переменных x и y.
  2. «Число точек» указывает, сколько опорных точек используется для построения графика.
  3. Опции. Это дополнительные действия, которые можно применить к графику. Их определение начинается с ключевого слова «set». Например, «set grid» задает в графике вывод линий масштабной сетки, а «set size ratio 1» выравнивает масштабы по осям координат: это будет полезно, когда строится круг и нужно, чтобы график строился действительно как круг, а не как овал. Следует заметить, что построение круга в виде овала связано с тем, что разрешающая способность монитора по горизонтали и вертикали является разной, поскольку пиксель не является «круглым».

После формирования график появляется в специальном окне, а автоматически сгенерированная команда построения графика, которая имеет синтаксис wxplot2d — в рабочем документе.

Каждая функция plot инициирует построение графика (или графиков) в новом окне.


Редактирование графика

Нажатие мышью на пиктограмме окна в его заголовке для графиков формата gnuplot открывает меню, пункт «Option» которого содержит команды для форматирования графика: изменение цвета фона, стиля линий, шрифта и т.п.

Последней командой пункта «Option» является «Update \..\wgnuplot.ini». Все изменения, осуществленные во время форматирования графика, являются временными и касаются только графика, для которого осуществляется форматирование. Выполнение пункта «Update \..\wgnuplot.ini» приводит к тому, что изменения запоминаются в файле параметров, применяемых для графиков автоматически, и для всех последующих графиков эти изменения будут применяться по умолчанию.

Для изменения параметров уже построенного графика любого типа следует установить курсор на имени функции для построения графика и щелкнуть «График 2D» на панели «General Math». Это приведет к появлению окна «Графики 2D», в котором, как отмечалось ранее, можно изменить ряд параметров.


Построение графика в полярных координатах

Для этого сначала следует загрузить пакет расширенных графических возможностей, который осуществляется по команде load(draw). В ответ система должна ответить, что она осуществила доступ к нужному файлу:

Для построения графика в полярных координатах применяется функция draw2d со следующими аргументами:

  • user_preamble = «set grid polar», // построение в полярных координатах
  • nticks = n, // n — число точек
  • xrange = [dx1, dx2], // диапазон изменения x
  • yrange = [dy1, dy2], // диапазон изменения y
  • color = red, // цвет
  • line_width = k, // ширина линии, которой строится график
  • title = «общее название графика»,
  • polar(функция, переменная, нижняя_граница _переменной, верхняя_граница _переменной) // функция построения графика

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

В свою очередь, аргумент polar также имеет несколько аргументов:

  • Функция для графика. В математике в ее роли принято использовать греческие буквы. Эти буквы изменяются на имена-эквиваленты, например theta.
  • Аргумент функции (угловая координата).
  • Начальное значение угла.
  • Конечное значение угла.
draw2d(user_preamble = "set grid polar" nticks = 200 xrange = [- 1000,1000], yrange = [- 100,100], color = red line_width = 3 title = "Hyperbolic Spiral" polar(theta*theta, theta, 1,10*%pi) )$


Трехмерная (3D) графика

Для построения изображений трехмерных объектов используется функция plot3d.

plot3d(z(x, y), [x, xmin, xmax], [y, ymin, ymax], дополнительные опции)

где z(x,y) — функция от x, y, значения которой изменяются от xmin до xmax и от ymin до ymax.

plot3d(((x — 10)/5)*((y — 10)/5),[x, 0,20],[y, 0,20]);

На одной координатной плоскости можно одновременно построить до трех функций. В этом случае перечень функций записывается в квадратных скобках: plot3d ([функция1, функция2, функция3], [переменная 1, нижний предел переменной, верхний предел переменной], [переменная 2, нижний предел переменной, верхний предел переменной], дополнительные опции).

Редактирование трехмерного графика осуществляется так же, как и двумерного.

Трехмерная поверхность может быть заменена градиентным переходом цветов. Для этого следует применить опцию «set view map».

Валерий ФЕТИСОВ

Maxima: матрицы VS массивы

1) В чем принципиальная разница массивов и матриц в Максиме? Записываются они одиннаково, на сколько я понял..

2) Как можно создать матрицу внутри функции, где — размер матрицы — это параметр функции — а ячейки задавать циклом по n,m?

(%i28) func(n,m):=for i:1 thru n do for j:1 thru m do A[i,j]:i+j$

(%i29) A; (%o29) A (%i30) A[1,2]; (%o30) 3

Что такое A в данном случае — матрица или массив? Почему по A не выводится вся матрица?

anonymous
23.12.07 15:58:48 MSK

Re: Maxima: матрицы VS массивы

Форматирование, сорри. 1) В чем принципиальная разница массивов и матриц в Максиме? Записываются они одиннаково, на сколько я понял.. 2) Как можно создать матрицу внутри функции, где -- размер матрицы - это параметр функции -- а ячейки задавать циклом по n,m? (%i28) func(n,m):=for i:1 thru n do for j:1 thru m do A[i,j]:i+j$ (%i29) A; (%o29) A (%i30) A[1,2]; (%o30) 3 Что такое A в данном случае - матрица или массив? Почему по A не выводится вся матрица?

anonymous
( 23.12.07 16:00:39 MSK )
Ответ на: Re: Maxima: матрицы VS массивы от anonymous 23.12.07 16:00:39 MSK

Re: Maxima: матрицы VS массивы

Feel da power of Lambda! © (%i1) genmatrix(lambda([i, j], i+j), 5, 5); [ 2 3 4 5 6 ] [ ] [ 3 4 5 6 7 ] [ ] (%o1) [ 4 5 6 7 8 ] [ ] [ 5 6 7 8 9 ] [ ] [ 6 7 8 9 10 ]

Sphinx ★★☆☆
( 23.12.07 18:31:30 MSK )
Ответ на: Re: Maxima: матрицы VS массивы от anonymous 23.12.07 16:00:39 MSK

Re: Maxima: матрицы VS массивы

`A` — не матрица и не массив вообще, символ `A` даже не был определён. В циклах были определены лишь символы с именами вида `A[]`. Максима и не знает, что ты хотел `A` сделать матрицей.

Sphinx ★★☆☆
( 23.12.07 18:33:10 MSK )
Ответ на: Re: Maxima: матрицы VS массивы от Sphinx 23.12.07 18:31:30 MSK

Re: Maxima: матрицы VS массивы

Да, Лямбда — это круто:)

А все-таки можно так: в цикле подсчитал значение и всунул его в матрицу в нужное место? Дело в том, что у меня не простая зависимость от i,j, а «накопительная» (т.е. от цикла никуда не деться).

anonymous
( 23.12.07 20:02:42 MSK )
Ответ на: Re: Maxima: матрицы VS массивы от anonymous 23.12.07 20:02:42 MSK

Re: Maxima: матрицы VS массивы

Для примера, в каждый элемент [i,j] вставить сумму элементов минора [i,j] — как?

anonymous
( 23.12.07 20:08:56 MSK )
Ответ на: Re: Maxima: матрицы VS массивы от anonymous 23.12.07 20:08:56 MSK

Re: Maxima: матрицы VS массивы

тьфу, че-то не то спорол.

Реализовать обычное умножение матриц. (Я знаю про «точку», это для примера).

anonymous
( 23.12.07 20:22:48 MSK )
Ответ на: Re: Maxima: матрицы VS массивы от anonymous 23.12.07 20:22:48 MSK

Re: Maxima: матрицы VS массивы

(%i1) multmatrix(A, B) := block([B: transpose(B)], genmatrix(lambda([i, j], apply("+", map("*", A[i], B[j]))), length(A), length(B))); (%o1) multmatrix(A, B) := block([B : transpose(B)], genmatrix(lambda([i, j], apply("+", map("*", A , B ))), length(A), length(B))) i j (%i2) (%i2) M: matrix([1, 2], [3, 4], [5, 6], [7, 8]); [ 1 2 ] [ ] [ 3 4 ] (%o2) [ ] [ 5 6 ] [ ] [ 7 8 ] (%i3) N: matrix([-2, 4, 5, 9], [10, 12, 13.2, -14]); [ - 2 4 5 9 ] (%o3) [ ] [ 10 12 13.2 - 14 ] (%i4) M.N; [ 18 28 31.4 - 19 ] [ ] [ 34 60 67.8 - 29 ] (%o4) [ ] [ 50 92 104.2 - 39 ] [ ] [ 66 124 140.6 - 49 ] (%i5) multmatrix(M, N); [ 18 28 31.4 - 19 ] [ ] [ 34 60 67.8 - 29 ] (%o5) [ ] [ 50 92 104.2 - 39 ] [ ] [ 66 124 140.6 - 49 ]

Sphinx ★★☆☆
( 23.12.07 21:20:25 MSK )
Ответ на: Re: Maxima: матрицы VS массивы от Sphinx 23.12.07 21:20:25 MSK

Re: Maxima: матрицы VS массивы

И заметь — полный набор кошерностей: lambda, map, apply и скобочки.

Sphinx ★★☆☆
( 23.12.07 21:29:52 MSK )
Ответ на: Re: Maxima: матрицы VS массивы от Sphinx 23.12.07 21:29:52 MSK

Re: Maxima: матрицы VS массивы

Я, конечно, дико извиняюсь, но не мог-бы русским языком объяснить, что они конкретно делают. А то с полчаса уже смотрю и описание и примеры — въехать не могу.

anonymous
( 23.12.07 21:59:39 MSK )
Ответ на: Re: Maxima: матрицы VS массивы от anonymous 23.12.07 21:59:39 MSK

Re: Maxima: матрицы VS массивы

`map()` применяет свой первый аргумент к остальным поэлементно. Например, `map(«*», [1, 2, 3], [4, 5, 6])` — это то же самое, что и `[1*4, 2*5, 3*6]`. Рассматривай `»*»` как обозначение для функции умножения.

`apply()` просто применяет свой первый аргумент к значениям, перечисленных списком во втором аргументе. Например, `apply(«+», [1, 2, 3])` — то же самое, что и `1+2+3`.

`lambda([i, j], )` *возвращает* функцию двух аргументов `i, j`.

Можно видеть, что вышеприведённое определение `multmatrix` почти точно выражает математическое определение операции перемножения матриц в терминах Maxima без всяких ипацких циклов:

В `multmatrix` покомпонентное умножение выражено в `map(«*», …`, а сложение ∑ — при помощи `apply(«+», …`

Как создать матрицу в maxima

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

Ссылки для скачивания размещены в конце статьи: ссылки на документы для скачивания.

Оглавление
Универсальный решатель умножителей

Решатель умножителей. Постановка задачи
Метод решения задачи
Комментарии к решению задачи в Maxima

Введение

Анализировать умножители можно с использованием предлагаемого здесь документа для Maxima с набором необходимых для этого функций ( m_solver_core.wxmx ). Для использования, необходимо открыть документ, выполнить команду меню для вычисления всех ячеек ([Cell], [Evaluate All Cells]), после чего можно будет анализировать умножители с использованием предоставленных функций, добавляя в документ свои команды. Документ содержит некоторое количество комментариев, поясняющих назначение функций.

Файл-документ дублируется пакетным файлом m_solver_core.mac , имеющим аналогичное содержимое и который можно загрузить в свой документ командой
batchload(«m_solver_core.mac»);
что избавляет от необходимости загромождать свой документ текстом используемых библиотечных функций. Если файл, использующий m_solver_core.mac и сам пакетный файл находятся в разных каталогах, потребуется указать полное имя файла (включающее путь к файлу), либо добавить каталог с данным пакетным файлом в список каталогов по умолчанию для поиска файлов.

Пакетный файл является обычным текстовым файлом и с его содержимым можно ознакомиться даже в отсутствие установленной системы Maxima.

Основы работы

solve_multiplier(circuit, nd, xc, a, F, IL)
Самая главная функция, собственно она и выполняет анализ умножителя. Функция имеет следующие аргументы:
circuit — сокращённая матрица соединений, описывающая структуру анализируемого умножителя; может быть задана непосредственно или сгенерирована с помощью функций create_circuitA, create_circuitB, create_circuitZ, создающих матрицы для предопределённых типов умножителей (подробнее о матрице соединений — далее);
nd — количество диодов в умножителе (которое равно коэффициенту умножения);
xc — список, содержащий значения ёмкостей конденсаторов, элемент с индексом j должен содержать ёмкость конденсатора Cj; количество элементов в списке должно быть равно количеству конденсаторов в схеме;
a — амплитуда питающего источника;
F — частота колебаний питающего источника;
IL — ток нагрузки.
Возвращаемое значение — список из трёх элементов:
1-й элемент — выходное напряжение (напряжение на нагрузке) при заданном токе нагрузки в установившемся режиме в начальной точке рассматриваемого цикла, т.е. пиковое значение;
2-й элемент — размах пульсаций выходного напряжения;
3-й элемент сам является списком и содержит напряжения на всех рассматриваемых ветвях цепи в характерных точках рабочего цикла (элементы 1..nb — напряжения u[1]..u[nb]; элементы nb+1..2*nb — напряжения ux[1]..ux[nb] и т.д.; напряжения u2[j] не включены в список); всего данный список содержит 4*nb элементов, где nb=nc+2, а nc — количество конденсаторов.

Рассмотрим подробнее сокращённую матрицу соединений circuit, которая описывает структуру умножителя. Вообще под матрицей соединений здесь мы понимаем матрицу размера nb*2 (nb строк, 2 столбца; nb — количество ветвей в цепи), каждая строка которой соответствует определённому элементу цепи и определяет, к каким узлам подключён этот элемент. То есть, circuit[j, 1] содержит номер узла, к которому подключён первый вывод ветви с номером j, а элемент матрицы circuit[j, 2] содержит номер узла, к которому подключён вывод 2 ветви с номером j.

Так как любой умножитель содержит определённые обязательные элементы, а его структура отвечает ряду обязательных требований, то у нас появляется возможность исключить из матрицы соединений избыточную информацию. Так, любой умножитель содержит диодную цепь, поэтому нет необходимости включать её описание в матрицу. Её наличие можно учесть, указав количество диодов в умножителе и используя определённое соглашение о нумерации узлов в диодной цепи. А именно, будем использовать последовательную нумерацию от 1 до nd+1, где nd — количество диодов (рис. %img:d_cir). Естественно, нумеровать диоды в диодной цепи также будем по порядку.

Нумерация узлов диодной цепи.

Рис. %img:d_cir

Нагрузка всегда подключается между выходом (узел с номером nd+1) и общим узлом, поэтому нагрузку также не будем указывать явным образом.

Таким образом, для того чтобы полностью описать структуру умножителя, достаточно указать способ подключения всех конденсаторов и источника питания. Получившаяся сокращённая матрица будет содержать nc+1 строк, где nc — количество конденсаторов. Договоримся, что первые nc строк матрицы (1..nc) соответствуют конденсаторам С1..Cnc, а последняя строка — источнику.

Нумераций узлов в умножителе с чётным коэффициентом умножения.

Рис. %img:en_even

Нумераций узлов в умножителе с нечётным коэффициентом умножения.

Рис. %img:en_odd

И последний момент. Договоримся узлам, к которым подключён питающий источник, присваивать номера 1 и максимальный номер. При такой нумерации, в узловой матрице этим узлам будут соответствовать первая и последняя строки. Так как строки, соответствующие этим узлам мы должны будем вычеркнуть при составлении уравнений по первому правилу Кирхгофа, то фиксированное их расположение немного упрощает задачу. Следствием этого соглашения является то, что общий узел будет обязательно иметь номер либо 1, либо максимальный номер. Если коэффициент умножения напряжения чётный, то начало диодной цепи должно быть подключено к общему проводу (общему узлу), но первый узел диодной цепи, как мы договорились, всегда имеет номер 1, поэтому и общий узел получит этот номер (рис. %img:en_even). Если коэффициент нечётный, к началу диодной цепи подключается первый вывод питающего источника, тогда второй узел подключается к общему проводу. Но источник подключается между узлом 1 и узлом с максимальным номером, значит, в данном случае общий узел будет иметь максимальный номер (рис. %img:en_odd).

Пример составления сокращённой матрицы соединений для умножителя.

Рис. %img:x3_matr

Рассмотрим пример, показывающий, каким образом по схеме умножителя может быть составлена сокращённая матрица соединений (рис. %img:x3_matr). Умножитель выбрали очень простой — Z-типа с коэффициентом 3. На рисунке показана нумерация узлов, отвечающая принятым ранее соглашениям. Тогда сокращённая матрица соединений может быть задана следующим образом:

circuit:matrix( [2, 5], /* C1 */ [3, 1], /* C2 */ [4, 5], /* C3 */ [1, 5] /* V-source */ );

Комментарии здесь поясняют, каким элементам соответствует каждая строка матрицы.

create_circuitA(nd)
create_circuitB(nd)
create_circuitZ(nd)
Функции возвращают сокращённую матрицу соединений для умножителя типа A, B, Z соответственно, содержащего nd диодов. Полученную матрицу можно использовать при вызове функции solve_multiplier(circuit, nd, xc, a, F, IL) в качестве аргумента circuit.

test_solve_multiplier(iterations) Функция предназначена для тестирования функции solve_multiplier путём применения её для анализа некоторых умножителей с заведомо известными характеристиками и проверки полученных результатов. В тестовый набор умножителей включаются несколько фиксированных вариантов, а также умножители типов A, B и Z с коэффициентами умножения от 1 до iterations включительно.

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

Простейший пример использования

Приведём пример, показывающий как использовать описанные инструменты на практике. Будем анализировать умножитель на 4 типа A (рис. %img:x4_exmpl); ёмкости всех конденсаторов мы предполагаем одинаковыми и равными C, амплитуду питающего источника считаем равной a, частоту равной F, а ток нагрузки считаем равным IL.

Умножитель на 4 типа A.

Рис. %img:x4_exmpl

В этом случае можно использовать следующую последовательность команд.

/* Предполагается, что данная последовательность команд дописана в конце основного документа m_solver_core.wxmx Либо в начале нового документа выполнен вызов batchload("m_solver_core.mac"); */ nd:4; circuit:create_circuitA(nd); xc:makelist(C, length(circuit)-1); solve_multiplier(circuit, nd, xc, a, F, IL);

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

Для создания сокращённой матрицы соединений circuit используется функция create_circuitA , с помощью которой можно получить матрицу для умножителя типа A с любым коэффициентом умножения:
circuit:create_circuitA(nd);

В нашем случае все конденсаторы имеют одинаковую ёмкость C, поэтому сформировать список ёмкостей очень просто:
xc:makelist(C, length(circuit)-1);
эта команда создаёт список размером length(circuit)-1 , каждый элемент которого равен C. Здесь length(circuit) — это количество строк в матрице circuit , которое, как мы знаем, на 1 больше количества конденсаторов. Мы не указываем количество конденсаторов в явном виде, опять же для того, чтобы данный фрагмент был более универсальным и чтобы его было проще применить в других ситуациях.

После того, как все данные подготовлены, мы вызываем функцию для анализа умножителя:
solve_multiplier(circuit, nd, xc, a, F, IL);

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

\( \DeclareMathOperator \newcommand[1]<\mbox<$#1$>> \)

(%i1) batchload ( » m_solver_core . mac » ) ;

\[\tag\label D:\ensuremathPrj\ensuremathelectronics\ensuremathmultiplier\ensuremathm\_\,solver\_\,core.mac\]

(%i5) nd : 4 ;
circuit : create_circuitA ( nd ) ;
xc : makelist ( C , length ( circuit ) — 1 ) ;
solve_multiplier ( circuit , nd , xc , a , F , IL ) ;

\[\tag\label4\] \[\tag\label\begin2 & 6\\ 3 & 1\\ 4 & 2\\ 5 & 3\\ 6 & 1\end\] \[\tag\label[C,C,C,C]\mbox<>\] \[\tag\label [4a-\frac<13\mathit>,\frac<3\mathit>,[a-\frac<2\mathit>,2a-\frac<2\mathit>,2a-\frac<9\mathit>,2a-\frac<9\mathit>,\ldots \] Created with wxMaxima.

Как видим, в нашем умножителе выходное напряжение равно \(4a-\frac\), т.е. напряжение холостого хода составит 4*a, падение напряжения род нагрузкой равно \(13I_L/(2FC)\). Размах пульсаций составит \(3I_L/(FC)\). Также видим, что в режиме холостого хода напряжение на первом конденсаторе равно a, на последующих составляет 2*a. При необходимости, можем посмотреть напряжение в рассматриваемые моменты времени на любом конденсаторе при наличии нагрузки.

Полученные результаты совпадают с тем, что нам было известно об умножителях типа A.

Полный список функций (в порядке объявления) и краткие комментарии к ним
set_row(A, i, r) set_col(A, j, c) create_circuitA(nd) create_circuitB(nd) create_circuitZ(nd) get_node_matrix(circuit, nd) exclude_orphan_branches(A) get_tree_matrix(A) get_closed_loop(A) get_independent_loops(A) switch_diodes(A, nd, k) get_switch_equations(A, nd, k, x1, x2, xc) solve_multiplier(circuit, nd, xc, a, F, IL) test_solve_multiplier(iterations) 

set_row(A, i, r)
Функция модифицирует в матрице A строку с индексом i, присваивая её элементам значения из списка r (в качестве r можно передать матрицу, тогда она будет преобразована в список). Следует обратить внимание, что модифицируется матрица-аргумент. Возвращаемое значение — изменённая матрица.

set_col(A, j, c)
Аналогична set_row, но изменяет столбец в матрице A, возвращаемое значение — изменённая матрица.

get_node_matrix(circuit, nd)
Функция возвращает узловую матрицу для умножителя, содержащего nd диодов, заданного сокращённой матрицей соединений circuit. При составлении узловой матрицы считается, что диоды закрыты (заменяются разрывами). Автоматически добавляется ветвь с номером nc+2 (нагрузка). Здесь nc — количество конденсаторов.

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

exclude_orphan_branches(A)
Функция возвращает узловую матрицу, полученную из узловой матрицы A путём исключения «висящих» ветвей. Висящей считаем ветвь, если хотя бы один из её выводов подключён к узлу, к которому не подключена никакая другая ветвь. Процесс исключения осуществляется итерационно: если на предыдущей итерации удалось исключить какую-либо ветвь, выполняется очередная итерация, так как исключение одной ветви может сделать «висящими» другие ветви. В результате оставляются только те ветви, которые входят в состав каких-либо замкнутых контуров. В связи с этим, функция является удобным инструментом для выделения контура в чистом виде.

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

В реализации данной функции используется довольно примитивный, но очень простой и очевидный алгоритм: начинаем с пустого графа (которому соответствует нулевая узловая матрица), затем поочерёдно добавляем каждую из ветвей исходной цепи. Если возник контур, ветвь убираем из строящегося дерева (добавляем её номер в список ветвей, не входящих в дерево), если контуров не появилось, оставляем ветвь в дереве. Наличие контура выявляем очень просто: применяем функцию удаления висящих ветвей exclude_orphan_branches(A) ; если в результате получилась нулевая матрица — контуров нет, а если ненулевая — хотя бы один контур есть.

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

get_closed_loop(A)
Функция возвращает строку для матрицы контуров, соответствующую контуру, найденному в узловой матрице A. Для нормальной работы функции, узловая матрица A должна содержать один контур (дополнительно допускаются висящие ветви, так как перед поиском контура функция автоматически их удаляет). Функция возвращает значение в виде списка, длина которого равна количеству ветвей в цепи. Элемент списка с индексом j равен +1 или -1, если ветвь с номером j входит в найденный контур (знак зависит от ориентации ветви относительно выбранного направления обхода контура) и элемент равен 0, если ветвь в контур не входит.

get_independent_loops(A)
Функция возвращает матрицу независимых контуров для цепи, заданной узловой матрицей A. Для получения матрицы контуров, сначала по узловой матрице A строится дерево для рассматриваемой цепи, после чего, поочерёдно добавляя не вошедшие в дерево ветви, выявляем все независимые контуры в цепи. Применяя функцию get_closed_loop(A) , построчно формируем матрицу-результат.

Матрица независимых контуров даёт возможность записать контурные уравнения (уравнения по второму правилу Кирхгофа) в компактной матричной форме B*u=O, где B — матрица независимых контуров, u — вектор-столбец напряжений на всех ветвях, O — нулевой вектор-столбец, размер которого равен количеству строк в матрице B.

switch_diodes(A, nd, k)
Функция возвращает узловую матрицу для цепи, получаемой из цепи с исходной узловой матрицей A при замыкании всех диодов с нечётными номерами (если k=1) или с чётными номерами (если k=2); общее количество диодов задаётся с помощью аргумента nd.

Замыкание каждого из диодов мы рассматриваем как объединение узлов, к которым диод подключён, в общий узел. Узловая матрица получаемой при этом цепи получается из исходной матрицы объединением строк, соответствующих объединяемым узлам: две строки заменяем одной, в которую переносим ненулевые элементы из исходных двух строк. Исходя из принципа работы умножителя, можно утверждать, что кроме диода, нет других элементов, подключаемых непосредственно между двумя объединяемыми узлами. Из этого следует, что в исходной узловой матрице в соответствующих строках элементы в одном столбце не могут быть одновременно ненулевыми. А значит, для объединения двух строк можно просто их сложить.

get_switch_equations(A, nd, k, x1, x2, xc)
Функция формирует список уравнений, составленных по первому и второму правилу Кирхгофа для одной из активных фаз рабочего цикла умножителя.
Функция имеет следующие аргументы:
A — исходная узловая матрица (для состояния цепи при разомкнутых диодах);
nd — общее количество диодов в умножителе;
k — параметр, определяющий, какие диоды в этой фазе переходят в открытое состояние; если k=1 открываются диоды с нечётными номерами; если k=2, то открываются диоды с чётными номерами;
x1 — список переменных — напряжений на ветвях цепи в начале фазы;
x2 — список переменных — напряжений на ветвях цепи в конце фазы;
xc — список ёмкостей конденсаторов умножителя.

solve_multiplier(circuit, nd, xc, a, F, IL)
Основная функция, выполняющая анализ умножителя. В данной функции выполняется построение системы линейных уравнений (из уравнений по первому и второму правилу Кирхгофа для каждой из четырёх фаз рабочего цикла; уравнений питающего источника; уравнений установившегося режима). Решая полученную систему, получаем искомый результат.

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

Как уже отмечалось ранее, получаемая система уравнений является полной и имеет единственное решение в том случае, если схема анализируемого умножителя не содержит «плавающих» узлов, т.е. таких узлов, к которым подключены только конденсаторы. Если «плавающие» узлы имеются, то не все уравнения в системе, получаемой в функции solve_multiplier , оказываются независимыми, а решение получается неоднозначным — для некоторых конденсаторов оно включает независимые параметры, которые могут принимать произвольные значения.

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

test_solve_multiplier(iterations)
Функция предназначена для тестирования результатов, возвращаемых функцией solve_multiplier для умножителей типов A, B, Z с коэффициентами умножения от 1 до iterations и нескольких других предопределённых умножителей с заранее известными характеристиками. Функция может быть полезна для проверки работоспособности библиотеки после внесения в неё изменений.

Список функций (в алфавитном порядке)
create_circuitA(nd) create_circuitB(nd) create_circuitZ(nd) exclude_orphan_branches(A) get_closed_loop(A) get_independent_loops(A) get_node_matrix(circuit, nd) get_switch_equations(A, nd, k, x1, x2, xc) get_tree_matrix(A) set_col(A, j, c) set_row(A, i, r) solve_multiplier(circuit, nd, xc, a, F, IL) switch_diodes(A, nd, k) test_solve_multiplier(iterations) 
Ссылки на документы для скачивания

m_solver_core.wxmx
Maxima-документ, содержащий функции для анализа умножителей.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *