我是靠谱客的博主 热情云朵,最近开发中收集的这篇文章主要介绍传递函数的离散化0. 在matlab中的概括1.离散化方法12. 离散化理论推导3. 离散化代码4. 例子,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 0. 在matlab中的概括
  • 1.离散化方法[^1]
  • 2. 离散化理论推导
  • 3. 离散化代码
    • 3.1 最简单的离散化:c2d(T)[^2]
    • 3.2 z离散化:c2d( 'z')[^3]
    • 3.3 PID离散化:c2d('tustin')[^1]
    • 3.4 PR离散化:c2d('tustin')[^1]
    • 3.5 进行传递函数的计算:以陷波器为例[^4]
  • 4. 例子

0. 在matlab中的概括

形式模块建模类型求解器类型
block模块连续连续
s s s函数:Transfer Fcn模块连续连续
z z z函数:Discrete Transfer Fcn模块离散离散
m语言:MATLAB Function模块离散连续

1.离散化方法1

离散方法s到z的替代关系
Zero-order hold X ( z ) = ( 1 − z − 1 ) z { L − 1 { X ( s ) s } } X(z)=(1-z^{-1})z left { L^{-1}left {frac{X(s)}{s}right }right } X(z)=(1z1)z{L1{sX(s)}}
Firs-order hold X ( z ) = ( z − 1 ) 2 z T s z { L − 1 { X ( s ) s } } X(z)=frac{(z-1)^2}{zT_s}z left { L^{-1}left {frac{X(s)}{s}right }right } X(z)=zTs(z1)2z{L1{sX(s)}}
Forward Euler s = z − 1 T s s=frac{z-1}{T_s} s=Tsz1
Backward Euler s = z − 1 z T s s=frac{z-1}{zT_s} s=zTsz1
Trapezoid(Tustin) s = 2 T s z − 1 z + 1 s=frac{2}{T_s} frac{z-1}{z+1} s=Ts2z+1z1
Tustin with pre-warping s = ω 0 t a n ( ω 0 Ω s=frac{ omega_{0}}{tan(omega_0 Omega} s=tan(ω0Ωω0 未完待续

在这里插入图片描述
其中离散化的方法又有很多:前向差分;后向差分;tustin;零极点匹配;脉冲响应;阶跃响应;

https://blog.csdn.net/weixin_35131453/article/details/115993833 (离散分类)
Matlab-Simulink_离散模块:https://blog.csdn.net/qq_41955225/article/details/122828438

z到s的变换:
command使用方式是:
sysc = d2c(sysd,method)
默认方式是zoh;

H = tf([1 -1],[1 1 0.3],0.1);
Hc = d2c(H)

输出:
在这里插入图片描述
需要注意 :离散的步长、simulink中仿真的步长、离散正弦波的步长、以及powergui的离散步长,这三种步长有什么区别???

2. 离散化理论推导

  • 如何将连续域的控制器进行离散化实现:(使用的欧拉法和塔斯汀法)https://zhuanlan.zhihu.com/p/20927674
  • 【计算机控制|Python|Matlab】传递函数离散化:(使用欧拉法推导)https://zhuanlan.zhihu.com/p/366422414

积分的离散:
积 分 值 + = 采 样 值 ∗ d T 积分值+=采样值∗dT +=dT
https://blog.csdn.net/weixin_43455581/article/details/109220419

3. 离散化代码

从某个连续传递函数得到在特定采样周期下的离散函数

3.1 最简单的离散化:c2d(T)2

num = 0.6321;           % 分子多项式的系数
den = [1, -0.3679];     % 分母多项式的系数
T   = 1;                % 采样周期(1s)
Gz = tf(num, den, T)    % 离散传递函数
Gs = d2c(Gz)            % 连续传递函数

3.2 z离散化:c2d( ‘z’)3

% transfor function
sys = tf([1 -1], [1 4 5]);
% discretize
ts = 0.1; % 采样周期
dsys = c2d(sys, ts, 'z'); % 转化为差分方程
% extract
[num, den] = tfdata(dsys,'v'); % 提取差分方程系数

在这里插入图片描述

3.3 PID离散化:c2d(‘tustin’)1

 Kp=1;Ki=2;Kd=3;Ts=1e-3;
PID=tf([Kd,Kp,Ki],[1,0])
c2d(PID,1e-3,'tustin')

可得到:
在这里插入图片描述
和计算结果一致。
同时Matlab的c2d()函数总共支持五种离散方法。

 
    SYSD = C2D(SYSC,TS,METHOD) computes a discrete-time model SYSD with 
    sampling time TS that approximates the continuous-time model SYSC.
    The string METHOD selects the discretization method among the following:
       'zoh'       Zero-order hold on the inputs
       'foh'       Linear interpolation of inputs
       'impulse'   Impulse-invariant discretization
       'tustin'    Bilinear (Tustin) approximation.
       'matched'   Matched pole-zero method (for SISO systems only).
    The default is 'zoh' when METHOD is omitted.

3.4 PR离散化:c2d(‘tustin’)1

Kp=1;
Kr=10;
wc=2*pi*5;
wo=2*pi*50;
PRs=Kp+tf([2*Kr*wc,0],[1,2*wc,wo^2])
PRz = c2d(PRs,1e-3,'tustin')

命令行输出:
在这里插入图片描述
可得到,离散化后,数字实现的C语言为:
y_k - 1.847y_k1 + 0.9405y_k2 = 1.297u_k - 1.847u_k1 +0.643*u_k2;

y_k = 1.297*u_k - 1.847*u_k1 +0.643*u_k2 + 1.847*y_k1 - 0.9405*y_k2 ;

https://blog.csdn.net/xstx1996/article/details/92723025

3.5 进行传递函数的计算:以陷波器为例4

首先,陷波器的传递函数是:
在这里插入图片描述
利用matlab对其进行离散化,tustin变换:

syms w0  s Ts z xi   % 定义符号变量
G1 =(s^2+w0^2)/(s^2+2*w0*xi*s+w0^2)         %传递函数
sys_s2c = 2*(z-1)/Ts/(z+1)
G2 = subs(G1,s,sys_s2c)    %离散化  tustin变换
G3 = collect(G2,z)  % 将表达式G2中的以z为变量合并相同次幂;

参考文献里还有陷波器的离散化、系数计算等等

https://blog.csdn.net/arris1992/article/details/81013519
https://blog.csdn.net/qq_34473360/article/details/103172281
死磕陷波器:https://blog.csdn.net/xklzw/article/details/113181680
MATLAB function的使用方法:https://blog.csdn.net/xklzw/article/details/113181680

C语言的形式:

VARIABLE 2ND ORDER NOTCH IIR FILTER: https://www.dsprelated.com/showcode/173.php
https://dsp.stackexchange.com/questions/11290/linear-phase-notch-filter-band-reject-filter-implementation-in-c
http://dspguide.com/ch19/3.htm

另外一个例子:5

syms wr w0 Kp Kr s Ts z % 定义符号变量
G1 =2*Kr*wi*s/(s^2+2*wi*s+w0^2) %R控制
G2 = subs(G1,s,2*(z-1)/Ts/(z+1)) %离散化 tustin变换
G3 = collect(G2,z) % 将表达式G2中的以z为变量合并相同次幂;

转换出来就是:
在这里插入图片描述
和之前师兄发的一致。
在这里插入图片描述

4. 例子

2022年9月29日
1、https://zhuanlan.zhihu.com/p/340449640(C语言如何实现积分和微分,以及3个步长的关系)
2、https://blog.csdn.net/wanrenqi/article/details/111566934(专栏的3篇文章)
s函数:下图,注意延迟90°在simulink里是弧度的。
solver选择为定步长:1e-6
传递函数为:
G s ( s ) = 1.013 ∗ 1 0 − 5 s 2 + 3.183 ∗ 1 0 − 06 s + 1 1.013 ∗ 1 0 − 05 s 2 + 0.003183 s + 1 G_s(s)=frac{ 1.013*10^{-5}s^2 + 3.183*10^{-06} s + 1}{1.013*10^{-05} s^2 + 0.003183 s + 1} Gs(s)=1.0131005s2+0.003183s+11.013105s2+3.1831006s+1

clc
clear

wc=2*pi*50;
m1=5e-4;
m2=0.5;

num=[1/(wc^2) 2*m1/wc 1];
den=[1/(wc^2) 2*m2/wc 1];
sys=tf(num,den);

Ts=1e-3;
dsys=c2d(sys,Ts,'tustin') %下一步离散为z的时候使用

在这里插入图片描述
z函数:

  • 首先是离散的,因此solver需要设置为离散的,仿真步长可以设置为变步长;
  • sine wave的模块采样时间需要和s函数替换到z函数时的离散周期一致,否则最后结果将是错误的。
    Z函数为:
    Y ( z ) U ( z ) = 0.8672 z 2 − 1.651 z + 0.8669 z 2 − 1.651 z + 0.7342 frac{Y(z)}{U(z)}=frac{0.8672 z^2 - 1.651 z + 0.8669}{z^2 - 1.651 z + 0.7342} U(z)Y(z)=z21.651z+0.73420.8672z21.651z+0.8669
    Ts=1e-3
    错误的图和正确的图分别为:
    错误的图
    在这里插入图片描述
    仿真图为:(此处不需要powergui,powergui是需要电气模块时才需要的。)

https://blog.csdn.net/weixin_44162637/article/details/122147328

在这里插入图片描述
z变换=>差分方程

  • 首先知道 Z Z Z变换 F ( Z ) = Z [ f ( t ) ] F(Z)=Z[f(t)] F(Z)=Z[f(t)]
  • 以及实数位移定理中的迟后定理 Z [ x ( t − k T 0 ) ] = Z − k X ( z ) Z[x(t−kT_0 )]=Z^{−k} X(z) Z[x(tkT0)]=ZkX(z)

https://www.cxymm.net/article/qq_32515081/117095744#Z函数
https://blog.csdn.net/weixin_36815313/article/details/114822577
https://bbs.huaweicloud.com/blogs/353400

Y ( z ) U ( z ) = 0.8672 z 2 − 1.651 z + 0.8669 z 2 − 1.651 z + 0.7342 frac{Y(z)}{U(z)}=frac{0.8672 z^2 - 1.651 z + 0.8669}{z^2 - 1.651 z + 0.7342} U(z)Y(z)=z21.651z+0.73420.8672z21.651z+0.8669
因此有:
Y ( z ) ∗ ( z 2 − 1.651 z + 0.7342 ) = U ( z ) ∗ ( 0.8672 z 2 − 1.651 z + 0.8669 ) Y(z)*(z^2 - 1.651 z + 0.7342)={U(z)}*(0.8672 z^2 - 1.651 z + 0.8669) Y(z)(z21.651z+0.7342)=U(z)(0.8672z21.651z+0.8669)
根据z变换,有:
y ( k + 2 ) − 1.651 y ( k + 1 ) + 0.7342 y ( k ) = 0.8672 x ( k + 2 ) − 1.651 x ( k + 1 ) + 0.8669 x ( k ) y_{(k+2)}-1.651y_{(k+1)}+ 0.7342y_{(k)}=0.8672x_{(k+2)}- 1.651x_{(k+1)} + 0.8669x_{(k)} y(k+2)1.651y(k+1)+0.7342y(k)=0.8672x(k+2)1.651x(k+1)+0.8669x(k)
经过变换得:
y ( k + 2 ) = 1.651 y ( k + 1 ) − 0.7342 y ( k ) + 0.8672 x ( k + 2 ) − 1.651 x ( k + 1 ) + 0.8669 x ( k ) y_{(k+2)}=1.651y_{(k+1)}-0.7342y_{(k)}+0.8672x_{(k+2)}- 1.651x_{(k+1)} + 0.8669x_{(k)} y(k+2)=1.651y(k+1)0.7342y(k)+0.8672x(k+2)1.651x(k+1)+0.8669x(k)
也就是:
y ( k ) = 1.651 y ( k − 1 ) − 0.7342 y ( k − 2 ) + 0.8672 x ( k ) − 1.651 x ( k − 1 ) + 0.8669 x ( k − 2 ) y_{(k)}=1.651y_{(k-1)}-0.7342y_{(k-2)}+0.8672x_{(k)}- 1.651x_{(k-1)} + 0.8669x_{(k-2)} y(k)=1.651y(k1)0.7342y(k2)+0.8672x(k)1.651x(k1)+0.8669x(k2)

https://blog.csdn.net/wanrenqi/article/details/111566934

仿真图:
在这里插入图片描述
在这里插入图片描述

C语言代码:

function y = fcn(u)

persistent yl;  %定义一个静态变量
if isempty(yl)  %给静态变量赋初值
   yl=0;
end
persistent yll;  %定义一个静态变量
if isempty(yll)  %给静态变量赋初值
   yll=0;
end
persistent ul;
if isempty(ul)
    ul=0;
end
persistent ull;
if isempty(ull)
    ull=0;
end

y=1.651*yl-0.7342*yll+0.8672*u-1.651*ul+0.8669*ull;

yll=yl;
yl=y;
ull=ul;
ul=u;

结果图:
在这里插入图片描述
在这里插入图片描述


  1. https://blog.csdn.net/qq_27158179/article/details/82739641 ↩︎ ↩︎ ↩︎

  2. https://blog.csdn.net/xstx1996/article/details/92723025:里面有很多内容,传递函数化简等等 ↩︎

  3. https://blog.csdn.net/ocean_ele/article/details/53442812 ↩︎

  4. https://blog.csdn.net/qq_34473360/article/details/103172281 ↩︎

  5. https://blog.csdn.net/weixin_35131453/article/details/115993833 ↩︎

最后

以上就是热情云朵为你收集整理的传递函数的离散化0. 在matlab中的概括1.离散化方法12. 离散化理论推导3. 离散化代码4. 例子的全部内容,希望文章能够帮你解决传递函数的离散化0. 在matlab中的概括1.离散化方法12. 离散化理论推导3. 离散化代码4. 例子所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部