我有一个SISO系统(以tf形式),有48个特征值,我想找到主导极点(假设将它减少到1阶或2阶)。我需要知道它们来近似计算我的系统的阻尼和带宽。我不想依赖时间响应的识别,我不想看pzmap(因为我必须多次这样做)。有没有人有想法解决它?在此先感谢您的帮助。
答案 0 :(得分:0)
如果您已经获得传递功能,您可以做的是分析极点并根据它们的实际值进行排序。 稳定的极点或复极点(即复平面的左侧)和虚轴的最接近的将是您选择的最主要的极点
考虑到您的传输函数存储在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