Skip to content

Instantly share code, notes, and snippets.

@0xff07
Last active October 26, 2016 18:33
Show Gist options
  • Save 0xff07/df64dd6654987106444ace4e458e3428 to your computer and use it in GitHub Desktop.
Save 0xff07/df64dd6654987106444ace4e458e3428 to your computer and use it in GitHub Desktop.
syms s;
syms K;
para_k = [0.7 3 6];
Ga = K / (s + 7);
Gd = 12.2 / (s * (s + 2.2));
Gc = Ga * Gd;
T = Gc / (1 + Gc);
T = simplify(expand(T))
for i = 1:3
figure(i);
k = para_k(i);
T_origin = tf([61 * k], [5, 46, 77, 61*k]);
step(T_origin);
info = stepinfo(T_origin);
disp('before:');
fprintf('overshoot = %f,\n peaktime = %f\n', info.Peak, info.PeakTime);
hold;
poles = roots([5 46 77 61*k])
%挑出最左邊的pole,也就是實部最小的pole
ignore = 1;
for j = 1:3
if real(poles(j)) < real(poles(ignore))
ignore = j;
end
end
compensate = poles(ignore);
%把那個pole省略掉
poles(ignore) = [];
T_ignored = zpk([], poles, -61*k/compensate/5);
step(T_ignored);
info = stepinfo(T_ignored)
disp('after:');
fprintf('Overshoot = %f, \n Peak Time = %f\n', info.Peak, info.PeakTime)
legend('before', 'after');
fprintf('------------------------------');
end
k0 = 7;
T_origin = tf([61 * k0], [5, 46, 77, 61*k0]);
info = stepinfo(T_origin);
iter = 200;
L = 0;
R = 7;
M = 0;
while iter > 0
M = (L + R) / 2;
T_origin = tf([61 * M], [5, 46, 77, 61*M]);
info = stepinfo(T_origin);
if(info.Overshoot < 16) L = M;
else R = M;
end
iter = iter - 1;
end
M
figure(4);
step(T_origin);
stepinfo(T_origin)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment