В этом примере показано, как использовать ode23t
для решения жесткого дифференциального алгебраического уравнения (ДАУ), которое описывает электрическую схему [1]. Задача однотранзисторного усилителя, закодированная в файле amp1dae.m, может быть переписана в полуявном виде, но этот пример решает его в исходном виде . Задача включает постоянную, сингулярную большую матрицу .
Схема транзисторного усилителя содержит шесть резисторов, три конденсатора и транзистор.
Начальный сигнал напряжения .
Рабочее напряжение .
Напряжения в узлах заданы как .
Значения резисторов являются постоянными, и ток через каждый резистор удовлетворяет .
Значения конденсаторов являются постоянными, и ток через каждый конденсатор удовлетворяет .
Цель состоит в том, чтобы решить для выходного напряжения через узел 5, .
Чтобы решить это уравнение в MATLAB ®, необходимо кодировать уравнения, кодировать большую матрицу и задать начальные условия и интервал интегрирования перед вызовом решателя ode23t
. Можно либо включить необходимые функции в качестве локальных функций в конец файла (как это сделано здесь), либо сохранить их как отдельные именованные файлы в директории по пути MATLAB.
Используя закон Кирхгофа, чтобы выровнять ток через каждый узел (1-5), можно получить систему из пяти уравнений, описывающих схему:
Большая матрица этой системы, найденная путем сбора производных в левой части уравнений, имеет вид
где для .
Создайте большую матрицу с соответствующими константами , а затем используйте odeset
функция для задания большой матрицы. Несмотря на то, что очевидно, что большая матрица сингулярна, оставьте 'MassSingular'
опция на значение по умолчанию 'maybe'
чтобы протестировать автоматическое обнаружение задачи ДАУ решателем.
c = 1e-6 * (1:3);
M = zeros(5,5);
M(1,1) = -c(1);
M(1,2) = c(1);
M(2,1) = c(1);
M(2,2) = -c(1);
M(3,3) = -c(2);
M(4,4) = -c(3);
M(4,5) = c(3);
M(5,4) = c(3);
M(5,5) = -c(3);
opts = odeset('Mass',M);
Функция transampdae
содержит систему уравнений для этого примера. Функция задает значения для всех напряжений и постоянных параметров. Производные, собранные с левой стороны уравнений, кодируются в большой матрице и transampdae
кодирует правую сторону уравнений.
function dudt = transampdae(t,u) % Define voltages and parameters Ue = @(t) 0.4*sin(200*pi*t); Ub = 6; R0 = 1000; R15 = 9000; alpha = 0.99; beta = 1e-6; Uf = 0.026; % Define system of equations f23 = beta*(exp((u(2) - u(3))/Uf) - 1); dudt = [ -(Ue(t) - u(1))/R0 -(Ub/R15 - u(2)*2/R15 - (1-alpha)*f23) -(f23 - u(3)/R15) -((Ub - u(4))/R15 - alpha*f23) (u(5)/R15) ]; end
Примечание. Эта функция включена в качестве локальной функции в конце примера.
Установите начальные условия. Этот пример использует согласованные начальные условия для тока через каждый узел, вычисленные в [1].
Ub = 6; u0(1) = 0; u0(2) = Ub/2; u0(3) = Ub/2; u0(4) = Ub; u0(5) = 0;
Решить систему ДАУ за временной интервал [0 0.05]
использование ode23t
.
tspan = [0 0.05]; [t,u] = ode23t(@transampdae,tspan,u0,opts);
Постройте график начального напряжения и выходное напряжение .
Ue = @(t) 0.4*sin(200*pi*t); plot(t,Ue(t),'o',t,u(:,5),'.') axis([0 0.05 -3 2]); legend('Input Voltage U_e(t)','Output Voltage U_5(t)','Location','NorthWest'); title('One Transistor Amplifier DAE Problem Solved by ODE23T'); xlabel('t');
[1] Волосы, Э. и Герхард Ваннер. Решение обыкновенных дифференциальных уравнений II: жесткие и дифференциально-алгебраические задачи. Спрингер Берлин Гейдельберг, 1991, с. 377.
Здесь перечислена локальная вспомогательная функция, которую решатель ODE ode23t
вызывается для вычисления решения. Также можно сохранить эту функцию как свой файл в директории по пути MATLAB.
function dudt = transampdae(t,u) % Define voltages and parameters Ue = @(t) 0.4*sin(200*pi*t); Ub = 6; R0 = 1000; R15 = 9000; alpha = 0.99; beta = 1e-6; Uf = 0.026; % Define system of equations f23 = beta*(exp((u(2) - u(3))/Uf) - 1); dudt = [ -(Ue(t) - u(1))/R0 -(Ub/R15 - u(2)*2/R15 - (1-alpha)*f23) -(f23 - u(3)/R15) -((Ub - u(4))/R15 - alpha*f23) (u(5)/R15) ]; end