Matlab - найти доминирующие полюсы программно
У меня есть система SISO (в форме tf) с 48 собственными значениями, и я хочу найти доминирующие полюсы (скажем, уменьшить ее до 1-го или 2-го порядка). Мне нужно знать их, чтобы приблизительно рассчитать демпфирование и пропускную способность моей системы. Я не хотел бы полагаться на идентификацию по временным ответам, и я не хочу смотреть pzmap (так как мне приходится делать это много раз). У кого-нибудь есть идея решить это? Заранее спасибо за помощь.
1 ответ
Если вы уже получили передаточную функцию, то вы можете проанализировать полюсы и отсортировать их по их реальным значениям. Полюс или комплексная пара полюсов, которая является стабильной (то есть на левой стороне комплексной плоскости) и ближайшей к мнимой оси, будет наиболее доминирующими полюсами, которые вы выберете.
Нечто подобное приходит на ум, учитывая, что ваша передаточная функция хранится в TF
объект, который мы назовем T
:
%// Get numerator and denominator data
[num,den] = tfdata(T, 'v');
%// Get the poles
pl = roots(den);
%// Get the stable poles only
pl_stable = pl(real(pl) < 0);
%// Determine the closest real location to the imaginary axis
[~,ind] = min(abs(real(pl_stable)));
%// Find all poles that share this same real location
tol = 1e-10;
ind_final = find(abs(real(pl_stable - pl_stable(ind))) <= tol);
final_poles = pl_stable(ind_final);
Первая часть этого кода находит числовые и знаменательные коэффициенты вашей передаточной функции и сохраняет их в num
а также den
соответственно. После этого мы получим полюсы передаточной функции, найдя корни знаменателя. После этого мы выделяем только стабильные полюсы путем поиска всех полюсов, чья действительная компонента отрицательна.
Как только мы изолируем эти полюса, мы определяем ближайший полюс к воображаемому доступу, используя min
и используя второй выход, чтобы определить местоположение этого минимума.
После этого мы хотим найти все полюсы, которые имеют один и тот же наименьший вещественный компонент, путем поиска всех полюсов, которые находятся в пределах небольшого допуска от этого наименьшего действительного значения. Я установил эту терпимость к 1e-10
, Как только мы находим эти местоположения, мы индексируем в массив стабильных полюсов и извлекаем то, что нам нужно.
Вот небольшой пример:
>> T = tf([1 1], [1 3 2 1])
T =
s + 1
---------------------
s^3 + 3 s^2 + 2 s + 1
Continuous-time transfer function.
Проверяя столбы, мы получаем:
>> pl
pl =
-2.3247 + 0.0000i
-0.3376 + 0.5623i
-0.3376 - 0.5623i
Как вы можете видеть, есть пара доминирующих полюсов, чей реальный компонент -0.3376
в то время как есть еще один настоящий полюс, который находится дальше -2.3247
, Пара полюсов в s = -0.3376 +/- 0.5623i
это то, что нам нужно извлечь.
Запустив код выше, мы получим:
>> final_poles
final_poles =
-0.3376 + 0.5623i
-0.3376 - 0.5623i