Z变换
其实在控制领域,无论是拉氏变换还是z变换,它们最开始的目的都是为了简化问题分析。在对被控对象建模过程中会出现高阶微分方程,而要在时域直接求解它们是很难的,因此对于连续系统我们采用拉氏变换讲问题转换到S域,而对离散系统考虑将问题牵引到Z域,在做了这样的处理后,问题逐渐变为了代数问题,我们在这两个域做分析和设计,最后通过各自的反变换即可回到时域。但现在随着计算机的发展,直接在时域进行求解也成为了可能。
Z变换其实就是拉氏变换的衍生物:Z = e^(sT)。而这个T就是采样周期,于是乎我们对连续模型的拉氏变换进行Z变换首先是对其时域信号进行采样,之后通过级数求和的方式解得其闭合形式(工程上大部分信号Z变换有闭合形式,也就是无穷级数收敛)。
MATLAB Z变换函数
MATLAB有求取Z变换的现成函数ztrans,但是它给出的结果是不含T的,或者说是默认T=1s,如果说我们本来就是离散信号是没问题的,但是我们已有的连续信号,我们首先是对这个信号进行采样,这里面就存在T,因此我们考虑重新编写一段程序来弥补这个缺陷,另外无论是ztrans亦或是iztrans都不支持符号输入,也就是只能针对已知信号,失去了用来推导的作用。
留数法Z变换与Z反变换原理
这里面牵扯到复变函数的知识,包括什么是留数之类的,我们仅从 应用层面来看就是将原始信号乘上一项然后求所有极点的留数和,当然这里面可能有重极点。
留数法Z变换MATLAB
申明符号与z域象函数
syms z s T;
F = (s+1)/((s+3)*(s+2)); %z域象函数
求解极点
[n1,m] = numden(F);
root = solve(m==0,s)'; %符号型
root1 = double(root); %浮点型
G = simplify(F*z/(z-exp(s*T))); %这个simplify合并
Results = 0;
tabu = []; %计算过的极点就加入这个数组
主循环(遍历所有极点)
for i = 1:length(root)
R = root1(i);
if(sum(tabu==R)>0)
continue
end
n = sum(root1==R); %计算极点的重数
if n==1
H = G*(s-root(i));
H = subs(H,s,root(i));
end
if n>=2
H = G*(s-R)^n;
for j = 1:n-1
H = diff(H,s);
end
H = sym(1/(factorial(n-1)))*H;
H = subs(H,s,R);
end
Results = Results + H;
tabu = [tabu,R];
end
其中重极点的计算算法为:
if n>=2
H = G*(s-R)^n;
for j = 1:n-1
H = diff(H,s);
end
H = sym(1/(factorial(n-1)))*H;
H = subs(H,s,R);
end
单根计算方法为:
if n==1
H = G*(s-root(i));
H = subs(H,s,root(i));
end
结果显示
disp('z变化结果:')
Fz = simplify(Results)
留数法Z反变换MATLAB
Z反变换用留数法需要注意z域象函数的分子能不能提出z的因子,如果不能,则需要单独计算在t=0T时的信号值,因为存在k=0时象函数多了个极点(z^(k-1))。
多项式系数提取和判断需不需要计算0处
syms z k;
F = (2*z^2+1)/((z-1)*(z+2)); %z域象函数
[n1,m] = numden(F);
coff = sym2poly(n1); %多项式系数提取
if(coff(1,end)==0) %判断是否需要单独计算0处
key = 1;
else
key=0;
F0 = limit(F,z,inf);
end
求解极点
root = solve(m==0,z)'; %符号型
root1 = double(root); %浮点型
G = simplify(F*z^(k-1)); %这个simplify把k-1项合进F而不是单纯显示乘法,不这样后面可能报错
Results = 0;
tabu = []; %计算过的极点就加入这个数组
主循环
for i = 1:length(root)
R = root1(i);
if(sum(tabu==R)>0)
continue
end
n = sum(root1==R); %计算极点的重数
if n==1
H = G*(z-root(i));
H = subs(H,z,root(i));
end
if n>=2
H = G*(z-R)^n;
for j = 1:n-1
H = diff(H,z);
end
H = sym(1/(factorial(n-1)))*H;
H = subs(H,z,R);
end
Results = Results + H;
tabu = [tabu,R];
end
根据分子是否有z因子显示不同结果
if(key == 1)
Ft = simplify(Results)
else
disp('t=0T时:');
F0
disp('t>0T时');
Ft = simplify(Results)
en
运行结果
总结
留数法虽然计算复杂度上比起其他变换方法要复杂很多,但是更利于计算机实现,编程较为容易,但程序可能没有考虑到一些个别情况,但对于常规模型可以给出准确答案。
本文同步分享在 博客“ZYunfeii”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。