В этом примере показано, как использовать оценку частотной характеристики, чтобы выполнить анализ функции описания синусоидального входа для модели с нелинейностью насыщения.
Анализ функции описания является методом для изучения частотной характеристики нелинейных систем. Это - расширение линейного анализа частотной характеристики. В линейных системах передаточные функции зависят только от частоты входного сигнала. В нелинейных системах, когда определенный класс входного сигнала, такого как синусоида, применяется к нелинейному элементу, можно представлять нелинейный элемент с помощью функции описания. Функция описания зависит не только от входной частоты, но также и от входной амплитуды. Анализ функции описания имеет широкую область приложений от анализа частотной характеристики до предсказания предельных циклов.
Чтобы использовать анализ функции описания синусоидального входа, который является наиболее распространенным типом анализа функции описания, ваша модель должна удовлетворить следующим условиям.
Нелинейность независима от времени.
Нелинейность не генерирует субгармоник в ответ на входную синусоиду.
Система отфильтровывает любые супергармоники, сгенерированные нелинейностью (это условие часто упоминается как гипотеза фильтрации).
В этом примере вы выполняете анализ функции описания модели с нелинейностью насыщения, которая удовлетворяет этим условиям.
Откройте модель Simulink®.
mdl = 'scdsaturationDF';
open_system(mdl)
Нелинейность насыщения имеет следующую синусоидальную входную функцию описания.
Здесь, для насыщения верхним и нижними пределами 0,5 и-0.5, соответственно, и A амплитуда синусоидального входного сигнала.
Вычислите и постройте функцию описания для амплитуд, варьирующихся между 0,1 и 2.1. Функция описания реализована в saturationDF.m
.
A = linspace(0.1,2.1,21); N_A = saturationDF(0.5./A); plot(A, N_A) xlabel('Amplitude') ylabel('N_A(A)') title('Describing Function for Saturation')
Можно вычислить функцию описания для нелинейности насыщения с помощью frestimate
по тому же набору амплитуд для фиксированной частоты 5 рад/с. Поскольку функция описания для насыщения не зависит от частоты, достаточно запустить анализ на одной частоте.
Задайте ввод и вывод линейные аналитические точки.
io(1) = linio('scdsaturationDF/In1',1,'input'); io(2) = linio('scdsaturationDF/Saturation',1,'output');
Для каждой амплитуды создайте вход sinestream с фиксированной частотой на 5 рад/с и данной амплитудой. Затем запуск frestimate
использование этого входного сигнала.
w = 5; N_A_withfrest = zeros(size(N_A)); for ct = 1:numel(A) in = frest.Sinestream('Frequency',w,'Amplitude',A(ct)); sysest = frestimate(mdl,in,io); N_A_withfrest(ct) = real(sysest.resp); end
Постройте результат оценки частотной характеристики наряду с функцией описания.
plot(A,N_A,A,N_A_withfrest,'r*') xlabel('Amplitude') ylabel('N_A(A)') title('Describing Function for Saturation Using frestimate') legend('Describing function','Frequency response estimate')
Закройте модель.
bdclose(mdl)
Можно также запустить анализ функции описания с обратной связью по частотному диапазону. Откройте модель для этого анализа.
mdl = 'scdsaturationDFcl';
open_system(mdl)
Чтобы начаться, аналитически вычислите частотную характеристику от ссылки до выхода с помощью функций описания. Для этого сначала вычислите амплитуду входного сигнала к нелинейности, учитывая ссылочную амплитуду и частоту. Входная амплитуда для нелинейности не обязательно равна ссылочной амплитуде.
L = zpk([],[0 -1 -10],1); w = logspace(-2,2,50); A_DF = zeros(numel(A),numel(w)); for ct_amp = 1:numel(A) for ct_freq = 1:numel(w) % Compute the input amplitude to the nonlinearity by solving the % analytical equation. opt = optimset('Display','off'); A_DF(ct_amp,ct_freq) = ... fzero(@(A_DF) solveForSatAmp(A_DF,L,w(ct_freq),A(ct_amp)),... A(ct_amp),opt); end end
Затем для каждой амплитуды, вычислите аналитическую частотную характеристику системы с обратной связью от ссылки до выхода с помощью функции описания. Сохраните результаты в массиве frd
объекты.
L_w = freqresp(L,w); for ct = 1:numel(A) N_A = saturationDF(0.5./A_DF(ct,:)); cl_resp = N_A(:).*L_w(:)./(1+N_A(:).*L_w(:)); cl(1,1,ct) = frd(cl_resp,w); end
Получите частотную характеристику для системы с обратной связью с помощью frestimate
способом, похожим на анализ функции описания насыщения.
io(1) = linio('scdsaturationDFcl/r',1,'input'); io(2) = linio('scdsaturationDFcl/Linear',1,'output'); for ct = 1:numel(A) in = frest.Sinestream('Frequency',w,'Amplitude',A(ct),... 'NumPeriods',10,'SettlingPeriods',7); cl_withfrest(1,1,ct) = frestimate(mdl,in,io); end
Постройте аналитически расчетную величину с обратной связью наряду с результатом frestimate
. Как ожидалось, соответствие результатов. Стрелка указывает на направление увеличения амплитуды.
h = figure; bodemag(cl,'b',cl_withfrest,'r') annotation(h,'textarrow',[0.64 0.58],[0.64 0.58],'String','Increasing A'); legend('Analytical result','Frequency response estimate',... 'Location','southwest')
Закройте модель.
bdclose(mdl)