【发布时间】:2014-01-22 16:02:28
【问题描述】:
如何绘制三维传递函数的幅度(例如检查图上的极点和零点)? 假设这是我的传递函数:
我的代码:
b = [6 -10 2];
a = [1 -3 2];
[x, y] = meshgrid(-3:0.1:3);
z = x+y*j;
res = (polyval(b, z))./(polyval(a,z));
surf(x,y, abs(res));
正确吗?我也想知道是否可以在绘图上标记单位圆?
【问题讨论】:
如何绘制三维传递函数的幅度(例如检查图上的极点和零点)? 假设这是我的传递函数:
我的代码:
b = [6 -10 2];
a = [1 -3 2];
[x, y] = meshgrid(-3:0.1:3);
z = x+y*j;
res = (polyval(b, z))./(polyval(a,z));
surf(x,y, abs(res));
正确吗?我也想知道是否可以在绘图上标记单位圆?
【问题讨论】:
我认为这是正确的。但是,您计算的是 H(z^-1),而不是 H(z)。这是你想做的吗?对于 H(z),只需将 a 中的条目从左向右反转(使用 fliplr),并对 b 执行相同操作:
res = (polyval(fliplr(b), z))./(polyval(fliplr(a),z));
要绘制单位圆,您可以使用rectangle。说真的:-) 它有一个'Curvature' 属性,可以设置为生成一个圆圈。
最好使用imagesc 而不是surf 以使圆圈清晰可见。您将从上方看到一个视图,其中颜色代表高度(abs(H) 的值):
imagesc(-3:0.1:3,-3:0.1:3, abs(res));
hold on
rectangle('curvature', [1 1], 'position', [-1 -1 2 2], 'edgecolor', 'w');
axis equal
【讨论】:
我这辈子从来没有听说过 3D 传递函数,它没有意义。我认为您完全错误:z 不代表复数,而是您的传递函数是离散函数而不是连续函数这一事实(有关详细信息,请参阅Z transform)。
在 MATLAB 中执行此操作的正确方法是使用 tf 函数,该函数需要控制系统工具箱(注意我假设您的离散采样时间为 0.1 秒,根据需要进行调整):
>> b = [6 -10 2];
a = [1 -3 2];
>> sys = tf(b,a,0.1,'variable','z^-1')
sys =
6 - 10 z^-1 + 2 z^-2
--------------------
1 - 3 z^-1 + 2 z^-2
Sample time: 0.1 seconds
Discrete-time transfer function.
bode(sys)
【讨论】:
z 总是指频域中的 Z 变换。
z其实是一个复变量