1、专家系统
定义:一类包含知识和推理的智能计算机程序,其内容包含某领域专家水平的知识和经验,具有解决专门问题的能力
1.1 专家系统的建立
(1)知识库
- 基于专家经验的判断性规则
- 用于推理、问题求解的控制性规则
- 用于说明问题的状态、事实和概率及当前的条件和常识等的数据
(2)推理机
- 正向推理
- 反向推理
- 双向推理
(3)知识的表示
产生式规则的表达方式为:
2、专家控制
2.1 结构
3、专家PID控制
基于受控对象和控制规律的各种知识,无需知道被控对象的精确模型,利用专家经验来设置PID参数,专家PID控制是一种直接型专家控制器。
3.1 利用Python实现专家PID控制
求二阶传递函数阶跃响应的
G
p
(
s
)
=
133
s
2
+
25
s
G_p(s) = \frac{133}{s^2 + 25s}
Gp(s)=s2+25s133
取采样时间为1ms进行离散化。
(1)离散化,T为采样周期
s
=
Z
−
1
−
1
T
s = \frac{Z^{-1}-1}{T}
s=TZ−1−1
(2)代入上式得到
Y
(
Z
)
+
23
Y
(
Z
)
Z
−
1
−
24
Y
(
Z
)
Z
−
2
=
133
U
(
Z
)
Z
−
2
Y(Z)+23Y(Z)Z^{-1}-24Y(Z)Z^{-2}=133U(Z)Z^{-2}
Y(Z)+23Y(Z)Z−1−24Y(Z)Z−2=133U(Z)Z−2
进一步化简得到:
Y
(
Z
)
=
(
2
−
25
T
)
Z
−
1
+
(
25
T
−
1
)
Z
−
2
+
133
T
2
U
(
Z
)
Z
−
2
Y(Z)=(2-25T)Z^{-1}+(25T-1)Z^{-2}+133T^2U(Z)Z^{-2}
Y(Z)=(2−25T)Z−1+(25T−1)Z−2+133T2U(Z)Z−2
于是得到:
y
(
k
)
=
(
2
−
25
T
)
y
(
k
−
1
)
+
(
25
T
−
1
)
y
(
k
−
2
)
+
133
T
2
u
(
k
−
2
)
y(k)=(2-25T)y(k-1)+(25T-1)y(k-2)+133 T^2 u(k-2)
y(k)=(2−25T)y(k−1)+(25T−1)y(k−2)+133T2u(k−2)
Python源码(该源码参考《智能控制》一书):
主要是在程序中,构建5个专家规则库,用于限制输出。
kp = 0.7
ki = 0.02
kd = 0.1
ts = 0.001
y_1 = 0
y_2 = 0
u_1 =0
u_2 =0
size = 2000
error=[0 for i in range(size)]
y =[0 for i in range(size)]
error_1 = 0
x2_1 =0
x=[0,0,0]
times=np.linspace(0,2,size)
r = [1.0 for i in range(size)]
u = [0 for i in range(size)]
for k in range(size):
u[k] = kp*x[0]+kd*x[1]+ki*x[2]
#规则1
if abs(x[0])>0.8:
u[k] = 0.45
elif abs(x[0])>0.4:
u[k] = 0.4
elif abs(x[0])>0.2:
u[k] = 0.12
elif abs(x[0])>0.01:
u[k] = 0.10
#规则2
if x[0]*x[1] >0 or (x[1]==0):
if abs(x[0])>=0.05:
u[k] = u_1 + 2*kp*x[0]
else:
u[k] = u_1 + 0.4*kp*x[0]
#规则3
if (x[0]*x[1]<0 and x[1] *x2_1>0) or x[0] == 0:
u[k]=u[k]
#规则4
if x[0]*x[1]<0 and x[1] *x2_1<0:
if abs(x[0])>=0.05:
u[k] = u_1 + 2*kp*error_1
else:
u[k] = u_1 + 0.6*kp*error_1
#规则5
if abs(x[0])<=0.001:
u[k] = 0.5*x[0]+0.01*x[2]
if u[k] >=10:
u[k] = 10
if u[k] <=-10:
u[k] = -10
y[k]=1.975*y_1 -0.975*y_2+0.000133*u_2
error[k]=r[k]-y[k]
u_2=u_1
u_1=u[k]
y_3 =y_2
y_2 =y_1
y_1 =y[k]
x[0] = error[k]
x2_1 = x[1]
x[1] =(error[k]-error_1)/ts
x[2] =x[2] + error[k]*ts
error_1 = error[k]
plt.plot(times,y)
plt.plot(times,error)
plt.show()
运行结果