num=4*conv([1 2],[1 6 6]) >>den=conv([1 0],conv([1 1],conv([1 1],… conv([1 1],[1 3 2 5]))))解释
时间: 2024-01-03 16:04:13 浏览: 20
这个问题是关于 MATLAB 代码的,其中 `conv` 函数表示两个多项式的卷积。下面是代码的解释:
* `num=4*conv([1 2],[1 6 6])`: 首先,`[1 2]` 和 `[1 6 6]` 是两个多项式,它们的卷积可以表示为 `[1*1, 2*1+1*6, 2*6]`,即 `[1, 8, 12]`。这个结果再乘以 4,得到 `[4, 32, 48]`。因此,`num` 的值为 `[4, 32, 48]`。
* `den=conv([1 0],conv([1 1],conv([1 1],… conv([1 1],[1 3 2 5]))))`: 首先,`[1 3 2 5]` 是一个多项式,它可以表示为 `(1+s)(2+s)`。因此,`conv([1 1],[1 3 2 5])` 表示多项式 `(1+s)(1+2s+s^2)`,即 `[1, 4, 7, 7, 5]`。同理,`conv([1 1],conv([1 1],[1 3 2 5]))` 表示多项式 `(1+s)(1+s)(1+2s+s^2)`,即 `[1, 6, 12, 14, 10]`。以此类推,最终得到的 `den` 的值为 `[1, 6, 18, 34, 57, 71, 65]`。
因此,这段代码的作用是计算两个多项式的卷积,并将其中一个多项式乘以 4,最终得到两个多项式的系数。
相关问题
%继电式自整定调节器 clear; clc; %% 初值 Ts=0.001; L=300; yp=0; d=1; %% 传递函数离散化 Gs=tf(1,conv(conv([10,1],[5,1]),[2,1])); dsys =c2d(Gs,Ts,'tustin '); [num,den]=tfdata(dsys,'v'); len=length(den); %% 等幅振荡 for t=1:len-1 y(t)=0; u(t)=0; e(t)=yp-y(t); time(t)=t*Ts; end for t=len:L/Ts if e(t-1)>0 u(t)=d; else u(t)=-d; end y(t)=-den(2)*y(t-1)-den(3)*y(t-2)-den(4)*y(t-3)+num(1)*u(t)+num(2)*u(t-1)+num(3)*u(t-2)+num(4)*u(t-3); e(t)=yp-y(t); time(t)=t*Ts; end figure(1) plot(time,y,'DisplayName','y'); xlabel('时间t/s'); ylabel('输出值'); title('继电器控制下被控对象输出值'); %% 周期计算 i=1; for t=2:L/Ts if y(t)>y(t-1) t1(i)=t; i=i+1; end end i=1; for t=2:length(t1) if (t1(t)-t1(t-1))>1 t2(i)=t1(t); i=i+1; end end sum=0; for t=ceil((1/2)*length(t2))+1:length(t2) sum=sum+(t2(t)-t2(t-1)); end %% PID整定参数 Ku=4*d/(pi*max(y)); Tu=Ts*sum/(length(t2)-ceil((1/2)*length(t2))); %P控制 %Kc=0.5*Ku;Ti=0;Td=0; %Kp=Kc; Ki=0; Kd=0; %PI控制 %Kc=0.4*Ku;Ti=0.8*Tu;Td=0; %PID控制 Kc=0.6*Ku; Ti=0.5*Tu; Td=0.12*Tu; Kp=Kc; Ki=Kp*Ts/Ti; Kd=Kp*Td/Ts; %% PID控制 for t=1:len y(t)=0; u(t)=0; e(t)=yp-y(t); time(t)=t*Ts; end yp=1; for t=len:L/Ts det_u=Kp*(e(t-1)-e(t-2))+Ki*e(t-1)+Kd*(e(t-1)-2*e(t-2)+e(t-3)); u(t)=u(t-1)+det_u; y(t)=(1/den(1))*(-den(2)*y(t-1)-den(3)*y(t-2)-den(4)*y(t-3)+num(1)*u(t)+num(2)*u(t-1)+num(3)*u(t-2)+num(4)*u(t-3)); e(t)=yp-y(t); time(t)=t*Ts; end figure(2) plot(time,y,'DisplayName','y'); xlabel('时间t/s'); ylabel('输出值'); title('P控制下被控对象输出值');转成python语言
以下是将MATLAB代码转换为Python代码的结果:
```python
import numpy as np
from scipy.signal import convolve, cont2discrete
import matplotlib.pyplot as plt
# 初值
Ts = 0.001
L = 300
yp = 0
d = 1
# 传递函数离散化
Gs = np.poly1d([1], r=False) / np.poly1d([10, 1], r=False) / np.poly1d([5, 1], r=False) / np.poly1d([2, 1], r=False)
dsys = cont2discrete((Gs.num, Gs.den), Ts, method='tustin')
num, den = dsys.num[0], dsys.den[0]
len_den = len(den)
# 等幅振荡
y = np.zeros(L)
u = np.zeros(L)
e = np.zeros(L)
time = np.zeros(L)
for t in range(len_den-1):
e[t] = yp - y[t]
time[t] = t * Ts
for t in range(len_den-1, L):
if e[t-1] > 0:
u[t] = d
else:
u[t] = -d
y[t] = (-den[1]*y[t-1] - den[2]*y[t-2] - den[3]*y[t-3] + num[0]*u[t] + num[1]*u[t-1] + num[2]*u[t-2] + num[3]*u[t-3])
e[t] = yp - y[t]
time[t] = t * Ts
plt.figure(1)
plt.plot(time, y, label='y')
plt.xlabel('时间t/s')
plt.ylabel('输出值')
plt.title('继电器控制下被控对象输出值')
# 周期计算
t1 = []
for t in range(1, L):
if y[t] > y[t-1]:
t1.append(t)
t2 = []
for t in range(1, len(t1)):
if t1[t] - t1[t-1] > 1:
t2.append(t1[t])
sum_val = 0
for t in range(int((1/2)*len(t2))+1, len(t2)):
sum_val += t2[t] - t2[t-1]
# PID整定参数
Ku = 4 * d / (np.pi * np.max(y))
Tu = Ts * sum_val / (len(t2) - int((1/2)*len(t2)))
Kc = 0.6 * Ku
Ti = 0.5 * Tu
Td = 0.12 * Tu
Kp = Kc
Ki = Kp * Ts / Ti
Kd = Kp * Td / Ts
# PID控制
y = np.zeros(L)
u = np.zeros(L)
e = np.zeros(L)
time = np.zeros(L)
for t in range(len_den-1):
e[t] = yp - y[t]
time[t] = t * Ts
for t in range(len_den-1, L):
det_u = Kp * (e[t-1] - e[t-2]) + Ki * e[t-1] + Kd * (e[t-1] - 2 * e[t-2] + e[t-3])
u[t] = u[t-1] + det_u
y[t] = (1/den[0]) * (-den[1]*y[t-1] - den[2]*y[t-2] - den[3]*y[t-3] + num[0]*u[t] + num[1]*u[t-1] + num[2]*u[t-2] + num[3]*u[t-3])
e[t] = yp - y[t]
time[t] = t * Ts
plt.figure(2)
plt.plot(time, y, label='y')
plt.xlabel('时间t/s')
plt.ylabel('输出值')
plt.title('P控制下被控对象输出值')
plt.show()
```
需要注意的是,Python中的绘图需要使用`matplotlib`库。
numo=1700*[0.1 1]; deno=conv([1 0],conv([25 1],[0.00021^2 2*0.00021 1])); [num,den]=cloop(numo,deno); t=0:0.0001:0.5; step(num,den,t); %求校正后系统的稳态误差 numo=1700*[0.1 1]; deno=conv([1 0],conv([25 1],[0.00021^2 2*0.00021 1])); num3=deno; den3=deno+[0 0 0 0 0 numo]; num4=25/3;den4=[1 0]; [nume,dene]=series(num3,den3,num4,den4); ess=dcgain(nume,dene)
这段代码实现了对一个系统的校正和稳态误差的计算。具体来说,代码中定义了一个开环系统的传递函数 numo/deno,其中 numo 和 deno 分别为系统的分子和分母多项式系数。接着,使用 cloop 函数将开环系统转化为闭环系统,并使用 step 函数绘制了系统的单位阶跃响应曲线。
接下来,代码计算了校正后系统的稳态误差。首先复制了开环系统的分母 deno,表示在系统中加入一个单位阶跃输入后的响应曲线。然后将分子 numo 在分母 deno 后面补上 0,以得到校正后系统的传递函数 num3/den3。接着,定义了一个理想的单位阶跃响应曲线 num4/den4,其中 num4=25/3,den4=[1 0]。最后使用 series 函数将校正后系统与理想响应曲线串联起来,并使用 dcgain 函数计算系统的稳态误差 ess。
需要注意的是,代码中使用了一些 MATLAB 工具箱中的函数,如 cloop、step、series 和 dcgain,需要有 MATLAB 环境才能执行。