[Home] | [Donate!] [Контакты] |
Перейдём к самому интересному - рассмотрим несколько примеров анализа умножителей с использованием предлагаемого "решателя".
Оглавление
Во всех следующих далее примерах предполагается, что уже выполнена загрузка пакетного файла 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).
/* 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).
Выполним анализ этого умножителя.
/* 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-документ с рассмотренными здесь примерами.