Matlab Построение корней (нули и полюса) Z-преобразования

Мне нужно построить корни на передаточной функции H (z), накладываясь на единичный круг, давая достаточно места, чтобы увидеть все точки. Я могу получить корни из H(z), когда оно задано в виде нулей = [z0 z1 z2...], полюсов = [p0 p1 p2]. Используя функцию корней Matlab, я могу получить полюс и нулевое местоположение. Мой код Matlab до сих пор

function zplot(b, a)

b_roots = roots(b);
a_roots = roots(a);

hold on
rectangle('Position',[-1 -1 2 2],'Curvature',[1 1]);
plot(b_roots,'x blue');
plot(a_roots,'o blue');
axis %need axis to be equal and +10percent of maximum value
hold off

end

Пока что я могу построить корни и единичный круг, но мне нужна помощь в настройке осей, чтобы они были 1) равны друг другу и 2) на 10% больше, чем наибольшее значение. Я не уверен, как сделать эту часть. Я попытался создать переменную lim_max = max(b_roots,a_roots), но в итоге она оказалась массивом и не работала в функции axis([-lim_max lim_max -lim_max lim_max]). Мне нужно, чтобы график масштабировался до + 10% с входными данными по мере их изменения.

Примечание (не обязательно): есть ли способ, чтобы он выглядел как круг, когда я рисую его, потому что сейчас он в конечном итоге выглядит как овал большую часть времени. Я могу перенастроить экран, и это нормально, но есть ли простой способ сделать это, я также хотел бы знать.


person MikaelCMiller    schedule 17.04.2015    source источник


Ответы (2)


Установите axis equal и рассчитайте мин./макс.:

function zplot(b, a)

b_roots = roots(b);
a_roots = roots(a);
xlimits = [min(min([real(a_roots);real(b_roots)])), max(max([real(a_roots);real(b_roots)]))];
ylimits = [min(min([imag(a_roots);imag(b_roots)])), max(max([imag(a_roots);imag(b_roots)]))];

hold on
rectangle('Position',[-1 -1 2 2],'Curvature',[1 1]);
plot(b_roots,'x black');
plot(a_roots,'o blue');
axis equal;
xlim(1.1*xlimits);
ylim(1.1*ylimits);
hold off

end
person m.s.    schedule 17.04.2015
comment
Это ведет меня в правильном направлении, но в целом не работает. Я думаю, что где-то перепутались лимиты. У меня получилось, благодаря вам. - person MikaelCMiller; 18.04.2015

Используйте следующий код. Это 1) найдет максимальные общие пределы осей x и y 2) установит эти пределы равными друг другу 3) нанесет эти пределы на +10%

b_roots = roots(b);
a_roots = roots(a);

x_min = min(min([real(a_roots);real(b_roots)]));
x_max = max(max([real(a_roots);real(b_roots)]));
y_min = min(min([imag(a_roots);imag(b_roots)]));
y_max = max(max([imag(a_roots);imag(b_roots)]));

%get the magnitude of the overall minimum value
min_lim = abs(min(x_min,y_min));
 %abs may not be necessary
max_lim = abs(max(x_max,y_max));

%set high and low limits equal to each other from negative to positive
eq_limit = [-max(min_lim,max_lim),max(min_lim,max_lim)];

hold on
rectangle('Position',[-1 -1 2 2],'Curvature',[1 1]);
plot(b_roots,'x black');
plot(a_roots,'o blue');
axis equal;
xlim(1.1*eq_limit);
ylim(1.1*eq_limit);
hold off

Спасибо @M.S. за их ответ и помощь.

person MikaelCMiller    schedule 17.04.2015