В этом примере показано, как использовать ode23t
решить жесткое дифференциальное алгебраическое уравнение (DAE), которое описывает электрическую схему [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] Hairer, E. и Герхард Ваннер. Решение Обыкновенных дифференциальных уравнений II: Жесткие и Дифференциально-алгебраические проблемы. Спрингер Берлин Гейдельберг, 1991, p. 377. Открыть WorldCat, https://public.ebookcentral.proquest.com/choice/publicfullrecord.aspx? p=3099070
Перечисленный здесь локальная функция помощника что решатель ОДУ 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