替代 rlocfind 在 Matlab 中找到恒定阻尼比线与根轨迹的交点
Alternative to rlocfind to find intersection of line of constant damping ratio with root locus in Matlab
要找到根轨迹与一条恒定阻尼比线相交点的增益,可以使用rlocfind函数,但用户必须手动select一个点,Matlab找到最近的点在 select 离子的根轨迹上。有没有一种方法可以找到确切的交点而无需手动制作 selection?
h = tf([2 5 1],[1 2 3]);
rlocus(h)
z = 0.707; sgrid(z,0)
k = rlocfind(h)
如果正确的增益值大于1,不使用rlocfind是否可以找到增益值?例如,对于以下传递函数,增益值应为 23.4。
h = tf(1,poly([-2 -4 -6]))
minfun = @(k) (0.75 - tf2dampingratio(h, k))^2;
gain = fminbnd(minfun, 0, 1) % 0.1970
rlocus(h) % Root locus
ylim([-3 3])
z = 0.75; sgrid(z,0)
K = rlocfind(h)
function dampingratio = tf2dampingratio(h, k)
[num, den] = tfdata(h);
poles = roots(den{:} + k * num{:});
dampingratio = cos(pi - angle(poles(1)))
end
我不知道可以直接执行此操作的 MATLAB 函数。但是,我们可以编写一个小函数来为我们进行计算。我们知道,根轨迹是系统的极点在负反馈和一些增益下如何移动的曲线图(参见 MATLAB docs). And the damping ratio is the cosine of the angle the pole makes with the negative real axis (illustration from Wikipedia)。
h = tf([2 5 1],[1 2 3]);
minfun = @(k) (0.707 - tf2dampingratio(h, k))^2;
gain = fminbnd(minfun, 0, 1); % 0.1970
function dampingratio = tf2dampingratio(h, k)
[num, den] = tfdata(h);
poles = roots(den{:} + k * num{:});
dampingratio = cos(pi - angle(poles(1)));
end
要找到根轨迹与一条恒定阻尼比线相交点的增益,可以使用rlocfind函数,但用户必须手动select一个点,Matlab找到最近的点在 select 离子的根轨迹上。有没有一种方法可以找到确切的交点而无需手动制作 selection?
h = tf([2 5 1],[1 2 3]);
rlocus(h)
z = 0.707; sgrid(z,0)
k = rlocfind(h)
如果正确的增益值大于1,不使用rlocfind是否可以找到增益值?例如,对于以下传递函数,增益值应为 23.4。
h = tf(1,poly([-2 -4 -6]))
minfun = @(k) (0.75 - tf2dampingratio(h, k))^2;
gain = fminbnd(minfun, 0, 1) % 0.1970
rlocus(h) % Root locus
ylim([-3 3])
z = 0.75; sgrid(z,0)
K = rlocfind(h)
function dampingratio = tf2dampingratio(h, k)
[num, den] = tfdata(h);
poles = roots(den{:} + k * num{:});
dampingratio = cos(pi - angle(poles(1)))
end
我不知道可以直接执行此操作的 MATLAB 函数。但是,我们可以编写一个小函数来为我们进行计算。我们知道,根轨迹是系统的极点在负反馈和一些增益下如何移动的曲线图(参见 MATLAB docs). And the damping ratio is the cosine of the angle the pole makes with the negative real axis (illustration from Wikipedia)。
h = tf([2 5 1],[1 2 3]);
minfun = @(k) (0.707 - tf2dampingratio(h, k))^2;
gain = fminbnd(minfun, 0, 1); % 0.1970
function dampingratio = tf2dampingratio(h, k)
[num, den] = tfdata(h);
poles = roots(den{:} + k * num{:});
dampingratio = cos(pi - angle(poles(1)));
end