智能控制(一)专家系统(基于Python仿真)

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=TZ11
(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)Z124Y(Z)Z2=133U(Z)Z2
进一步化简得到:
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)=(225T)Z1+(25T1)Z2+133T2U(Z)Z2
于是得到:
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)=(225T)y(k1)+(25T1)y(k2)+133T2u(k2)

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()        

运行结果
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值