Correct Axis Not Used

1 回表示 (過去 30 日間)
Samantha Boger
Samantha Boger 2020 年 10 月 22 日
回答済み: dpb 2020 年 10 月 22 日
I wrote a script that is supposed to plot a graph with definded axis limits. For most of the functions I have input, it has worked correctly, but for this following one, it doesn't have any regard for the axis limits.
This is the incorrect output graph:
This is the code:
close all
clearvars
clc
j = sqrt(-1);
w = 0.001:0.001:100;
s = j.*w;
GH = (5.*s+1)./(s.^2.*(4.*s+1));
makeNyquist(GH, w, 3, 'example.png')
makeNyquist Function:
function makeNyquist(GH, w, ylimit, plotFilename)
fig = figure;
ylabel('Im(GH)')
grid on
xlim([-ylimit,ylimit])
ylim([-ylimit,ylimit])
axis equal
xlabel('Re(GH)')
hold on
% plot axes
line([0 0], ylim, 'color', 'k'); % y-axis
hold on
line(xlim, [0 0], 'color', 'k'); % x-axis
hold on
% plot unit circle
y = -1:0.001:1;
plot(sqrt(1-y.^2), y, '-k')
hold on
plot(-sqrt(1-y.^2), y, '-k')
hold on
% plot (-1, j0) point
plot(-1, 0, 'ok')
hold on
% plot nyquist locust
rgh = real(GH);
igh = imag(GH);
plot(rgh, igh, '-r')
hold on
% plot mirrored image (dotted)
plot(rgh, -igh, '--r')
hold on
% calculate gain margin and phase crossover freq
for i = 2:length(igh)
if (igh(i)<0 && igh(i-1)>=0) || (igh(i)>0 && igh(i-1)<=0)
igh_xover_idx = i;
phz_xover_freq = w(igh_xover_idx);
reInt = rgh(igh_xover_idx);
GM = -20 * log10(abs(reInt));
sprintf('real axis intersect at Re = %.1f', reInt)
sprintf('gain margin (dB) = %.3f', GM)
plot(rgh(i), igh(i), '*b')
hold on
sprintf('phase crossover freq = %.3f', phz_xover_freq)
break
end
end
% calculate phase margin and gain crossover freq
for j = 2:length(igh)
if (sqrt((rgh(j)).^2 + (igh(j)).^2)) <= 1
x = rgh(j);
y = igh(j);
plot(rgh(j), igh(j), '*b')
hold on
gain_xover_freq = w(j);
sprintf('gain crossover freq = %.3f', gain_xover_freq)
sprintf('unit circle intersect at (%.1f, %.1f)', x, y)
u = [x y];
v = [-1 0];
theta = acosd(dot(u,v) / (norm(u)*norm(v)));
if y > 0
theta = -theta;
elseif theta < 0
theta = theta + 180;
end
PM = theta;
sprintf('phase margin (deg) = %.3f', PM)
break
end
end
% save figure
saveas(fig, plotFilename)
end

回答 (1 件)

dpb
dpb 2020 年 10 月 22 日
Move the xlim, ylim calls to the end of the function makeNyquist
The plotting commands after the limits end up autoscaling again to the data range.
Also, once hold on is called; there's no need to call it again unless you explicitly take it of.
"ON" can't get any "ON-ER" by being repeated.

カテゴリ

Help Center および File ExchangeLine Plots についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by