[Home]

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

Перейдём к самому интересному - рассмотрим несколько примеров анализа умножителей с использованием предлагаемого "решателя".

Оглавление
Базовые примеры
Файлы для скачивания

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



Базовые примеры

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

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

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

/* example 1 */
nd:4;
circuit:create_circuitA(nd);
xc:makelist(C, length(circuit)-1);
solve_multiplier(circuit, nd, xc, a, F, IL);

Для этого примера будет получен результат: \(U_{out}=4a-\frac{13I_L}{2FC}, h=3I_L/(FC)\).

Количество диодов, равное коэффициенту умножения напряжения в режиме холостого хода, должно быть задано явно в виде положительного целого числа. Все остальные величины: ёмкости конденсаторов, амплитуда и частота источника, ток нагрузки - могут быть заданы как численно, так и в символьном виде. Здесь мы задали одинаковую ёмкость всех конденсаторов, равную C. Но можем задать различные значения, например, пусть ёмкости всех конденсаторов будут равны C, кроме первого, ёмкость которого равна 4*C:

/* example 2 */
nd:4;
circuit:create_circuitA(nd);
xc:makelist(C, length(circuit)-1);
xc[1]:4*C;
solve_multiplier(circuit, nd, xc, a, F, IL);

В результате получим \(U_{out}=4a-\frac{7I_L}{2FC}, h=3I_L/(FC)\). По сравнению с предыдущим примером, существенно, почти вдвое, уменьшилось падение напряжения под нагрузкой. Амплитуда пульсаций осталась такой же.

Обратите внимание! В следующих примерах вызывается функция subst_parallel. Для того чтобы она стала доступной, необходимо предварительно загрузить библиотеку to_poly_solve:

load(to_poly_solve)$

Теперь найдём результат в численном виде. Вернёмся к первому примеру (все конденсаторы имеют одинаковую ёмкость) и предположим, что C=10 мкФ, a=100 В, F=50 Гц, IL=1 мА. Для расчёта выходного напряжения выполняем:

/* example 3 */
nd:4;
circuit:create_circuitA(nd);
xc:makelist(C, length(circuit)-1);
[Uout, h, uc]:solve_multiplier(circuit, nd, xc, a, F, IL)$
subst_parallel([C=10e-6, a=100, F=50, IL=0.001], Uout);

Получаем результат: Uout=387.0. Можем вычислить сразу несколько величин, для этого удобно их передать в функцию subst_parallel в виде списка:

/* example 4 */
nd:4;
circuit:create_circuitA(nd);
xc:makelist(C, length(circuit)-1);
[Uout, h, uc]:solve_multiplier(circuit, nd, xc, a, F, IL)$
subst_parallel([C=10e-6, a=100, F=50, IL=0.001], [Uout, h]);

В этом случае получим: Uout=387.0, h=6.0.

Попробуем выполнить расчёт умножителя с какой-нибудь нестандартной структурой (рис. %img:x6_nstd).

Пример умножителя на 6 с нестандартной структурой. Рис. %img:x6_nstd

/* example 5 */
nd:6;
circuit:matrix(
    [6, 8],
    [4, 2],
    [6, 2],
    [3, 1],
    [5, 3],
    [5, 1],
    [7, 5],
    [7, 1],
    [8, 1]);
xc:makelist(C, length(circuit)-1);
[Uout, h, uc]:solve_multiplier(circuit, nd, xc, a, F, IL)$
Uout; h;

Получаем результат: \( Uout=6a-\frac{253 IL}{16 C F}, h=\frac{IL}{C F}\).

Как мы отмечали, при наличии в умножителе узлов с "плавающими" потенциалами, составленная по предлагаемому алгоритму система уравнений будет содержать зависимые уравнения. И если в систему не включить дополнительные уравнения, определяющие начальные условия для таких узлов, решение системы получается не единственным - напряжения на некоторых конденсаторах определяются с точностью до произвольного параметра. Однако выходное напряжение и размах пульсации определяются однозначно. Подробнее об этом смотрите: "Метод решения задачи: Независимость уравнений". Там же приводился простой пример умножителя, имеющего плавающий узел (рис. %img:float_node).

Пример умножителя, содержащего плавающий узел. Рис. %img:float_node

Выполним анализ этого умножителя.

/* example 6 */
nd:3;
circuit:matrix(
    [2, 5],
    [3, 1],
    [4, 5],
    [5, 6],
    [1, 6]);
xc:makelist(C, length(circuit)-1);
[Uout, h, uc]:solve_multiplier(circuit, nd, xc, a, F, IL);

В процессе вычислений выводится сообщение:
solve: dependent equations eliminated: (4)
Результат вычислений: \( Uout=3a-\frac{7 IL}{2 C F}, h=\frac{3 IL}{C F}\); напряжения на ветвях цепи $$ \left[ \frac{IL}{CF}+\%r1, 2a-\frac{7 IL}{2CF},2a-\frac{5 IL}{2CF}+\%r1,a-\frac{IL}{CF}-\%r1, \ldots \right] $$ Итак, за счёт наличия одного "плавающего" узла, решение системы уравнений оказывается зависящим от одного параметра, который, в данном случае, имеет имя %r1. Но выходные характеристики при этом не зависят от параметра.

Как видим, в целом неплохо. Несколько строк с командами - и получен результат. Но это ещё не всё, используя данные инструменты, можно решать гораздо более сложные задачи.

Файлы для скачивания

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

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

Скачать examples.wxmx
Maxima-документ с рассмотренными здесь примерами.

author: hamper; date: 2019-03-13
  @Mail.ru