matlab如何使得函数反折,现控计控中基于留数法Z变换与Z反变换的MATLAB实现

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)

0527fe35ea49e14b169f27d96acacf9e.png

留数法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

运行结果

5199fcbfbd7850a9181e4555f3e5fbca.png

总结

留数法虽然计算复杂度上比起其他变换方法要复杂很多,但是更利于计算机实现,编程较为容易,但程序可能没有考虑到一些个别情况,但对于常规模型可以给出准确答案。

本文同步分享在 博客“ZYunfeii”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值