MATLAB离散时间模型问题:如何生成含z负次幂的传递函数?
我来帮你搞定这个问题!你现在遇到的情况是MATLAB的tf函数默认会把传递函数表示为z的正次幂形式,而你需要的是带z负次幂的表达式(或者更准确地说,是分子分母系数反转后的负次幂形式)。下面分步骤帮你解决:
问题原因分析
你的代码里,Nd和Dd是按z的最高次到最低次排列的系数(比如Nd=[-8 5 4 0 -1 -3 2]对应多项式 -8z^6 +5z^5 +4z^4 +0z^3 -1z^2 -3z +2)。MATLAB的tf函数会自动把分子分母的首项(最高次项)系数转为正数,所以你看到的结果是原分子分母都乘以-1后的正次幂形式。
而你期望的表达式,本质是将原分子分母的系数反转(从最低次到最高次排列),再整理为z的负次幂形式(相当于把原多项式中的z替换为z⁻¹)。
解决方案
方案1:得到与原传递函数等价的z负次幂形式
如果你只是想把原传递函数用z的负次幂表示(数学上和原传递函数完全等价),可以先将分子分母都除以z的最高次幂(这里是z⁶),再调整符号让分母的常数项为1。对应的MATLAB代码如下:
Nd = [-8 5 4 0 -1 -3 2]; Dd = [-0.0648 -0.1134 0.6184 -1.436 1.7 -1.6 1]; % 获取原分母的常数项(z^0项系数) b0 = Dd(end); % 分子分母都除以常数项,确保后续分母的常数项为1 num_scaled = Nd / b0; den_scaled = Dd / b0; % 反转系数,得到z负次幂的系数(从z^0到z^-6) num_neg_eq = flip(num_scaled); den_neg_eq = flip(den_scaled); % 创建传递函数并以友好格式显示 H_eq = tf(num_neg_eq, den_neg_eq, 0.1); pretty(H_eq)
运行后,pretty(H_eq)会输出等价的负次幂形式:
8 - 5 z^(-1) - 4 z^(-2) + z^(-4) + 3 z^(-5) - 2 z^(-6) ------------------------------------------------------- 0.0648 + 0.1134 z^(-1) - 0.6184 z^(-2) + 1.436 z^(-3) - 1.7 z^(-4) + 1.6 z^(-5) - z^(-6)
如果想要调整符号,只需给分子分母都乘以-1:
num_neg_eq = -num_neg_eq; den_neg_eq = -den_neg_eq; H_eq_sign = tf(num_neg_eq, den_neg_eq, 0.1); pretty(H_eq_sign)
方案2:得到你期望的反转系数后的传递函数
如果你确实需要你给出的那个特定负次幂表达式,直接使用反转后的系数创建传递函数即可:
Nd = [-8 5 4 0 -1 -3 2]; Dd = [-0.0648 -0.1134 0.6184 -1.436 1.7 -1.6 1]; % 反转分子分母的系数 num_desired = flip(Nd); den_desired = flip(Dd); % 创建传递函数并显示 H_desired = tf(num_desired, den_desired, 0.1); pretty(H_desired)
运行这段代码后,pretty(H_desired)会输出你期望的结果:
2 - 3 z^(-1) - z^(-2) + 4 z^(-4) + 5 z^(-5) - 8 z^(-6) ------------------------------------------------------- 1 - 1.6 z^(-1) + 1.7 z^(-2) - 1.436 z^(-3) + 0.6184 z^(-4) - 0.1134 z^(-5) - 0.0648 z^(-6)
⚠️ 注意:这个传递函数和你原来的传递函数不是等价的,它相当于把原传递函数中的z替换成了z⁻¹(即H(z⁻¹))。如果你的需求是原传递函数的负次幂表示,建议使用方案1;如果确实需要反转后的形式,就用方案2。
补充说明
MATLAB的tf函数默认用正次幂显示,但pretty()函数会自动将低次项(对应z的负次幂)放在前面,能帮你得到更直观的负次幂格式。
内容的提问来源于stack exchange,提问作者Automatics_student

