用模糊PID控制器识别控制系统对象
在此示例中,一次解决两个任务。 首先,我们根据实验数据识别控制对象。 其次,我们正在实现PID控制器的模糊输出系统。
Pkg.add(["ControlSystemIdentification", "FuzzyLogic"])
using ControlSystemIdentification, FuzzyLogic
让我提醒你,识别工作流程看起来像这样:
- 
收集实验数据 
- 
选择模型结构 
- 
模型的识别 
- 
模型的验证 
理对象的标识
从管理设施收集实验数据
在工厂中提出了控制设施的实验安装的模拟。engee模型。 控制对象是一个具有一个输入和一个输出的离散系统。 噪声和轻微的延迟也被添加到模型中。
对象的识别将通过过渡过程进行,为此我们将在系统入口处提供一个步骤。
 
让我们记录识别数据。:
mode = 1; # Запись данных для идентификации
if "Plant" in [m.name for m in engee.get_all_models()]
    m = engee.open( "Plant" ) # загрузка модели
else
    m = engee.load( "Plant.engee" )
end
results = engee.run(m, verbose=true)
dataout = collect(results["out"]);
datain = collect(results["in"]);
# Частота дискретизации системы из вектора времени
Ts = dataout.time[2] - dataout.time[1]
ident_data = iddata(dataout.value, datain.value, Ts)
plot(ident_data)
让我们记录模型验证的数据。:
mode = 0; # Запись данных для валидации
if "Plant" in [m.name for m in engee.get_all_models()]
    m = engee.open( "Plant" ) # загрузка модели
else
    m = engee.load( "Plant.engee" )
end
results = engee.run(m, verbose=true)
dataout = collect(results["out"]);
datain = collect(results["in"]);
# Частота дискретизации системы из вектора времени
Ts = dataout.time[2] - dataout.time[1]
val_data = iddata(dataout.value, datain.value, Ts)
plot(val_data)
模型结构选择与识别
我们将在状态空间中识别线性静止系统。 让我们选择系统等于3的顺序。
为了识别,我们将选择pem(预测-误差方法)预测误差方法。 这是一种简单而有效的算法,用于以状态空间的形式识别具有离散时间的线性静止系统。 该方法还允许您获取系统的初始状态。
nx = 3; # порядок системы
sys, x0 = newpem(ident_data,nx)
模型的验证
让我们在用于识别的相同数据上检查识别。
simplot(ident_data, sys)
我们将在一个特殊的验证数据集上检查它。
simplot(val_data, sys)
该方法显示出良好的鉴定结果。
模糊PID控制器控制系统
让我们回到使用模糊控制器对控制系统进行建模。 我们从实验数据中获得了控制对象的模型。
 
识别结果将在离散状态空间块中用于对控制对象进行建模。
 
它仍然是将控制器添加到控制系统电路中。 此示例使用以下模糊逻辑控制器结构:
 
在模糊输出系统的输入端接收归一化误差值 和派生的错误 . 使用缩放因子对输入值进行归一化。 和 使它们在[-1,1]范围内。
模糊输出系统输出范围为[-1,1]的结果,该结果按系数缩放 和 .
CE = 10;
CD = 4.9829;
C0 = 2.5179;
C1 = 1.8103;
模糊推理系统表示为查找表的块。 形成该表的响应表面的过程如下所示:
fis = @sugfis function FCtrl(E, delE)::U
    E := begin
        domain = -10.0:10.0
        N = GaussianMF(-10.0, 7.0)
        P = GaussianMF(10.0, 7.0)
    end
    delE := begin
        domain = -10.0:10.0
        N = GaussianMF(-10.0, 7.0)
        P = GaussianMF(10.0, 7.0)
    end    
    U := begin
        domain = -20.0:20.0
        Min = -20.0
        Zero = 0.0
        Max  = 20.0
    end
   # Работающие правила
   E == N  && delE == N  -->  U == Min
   E == N  && delE == P  -->  U == Zero
   E == P  && delE == N  -->  U == Zero
   E == P  && delE == P  -->  U == Max
end;
plot(fis, :E, ylabel="Функция принадлежности", w = 2)
plot(fis, :delE, ylabel="Функция принадлежности", w = 2)
让我们创建一个响应表面,以便将其放置在查找表块中。
errBrkpts = -10.0:0.5:10.0 
rateBrkpts = -10.0:0.5:10.0
LookUpTableData = zeros(length(errBrkpts), length(rateBrkpts))
i = 0;
for e in errBrkpts
    i = i+1
    j = 0;
    for de in rateBrkpts
        j = j+1
        LookUpTableData[i, j] = fis([e, de])[:U]
    end
end
surface(errBrkpts, rateBrkpts, LookUpTableData, xlabel="ΔE", ylabel="E", zlabel="U", title="Поверхность отклика", camera=(30, 30))
让我们运行控制系统模型并检查调节器的运行情况。
if "Fuzzycontroller" in [m.name for m in engee.get_all_models()]
    m = engee.open( "Fuzzycontroller" ) # загрузка модели
else
    m = engee.load( "Fuzzycontroller.engee" )
end
fuzzyresults = engee.run(m, verbose=true)
fuzzydataout = collect(fuzzyresults["out"]);
fuzzydatain = collect(fuzzyresults["in"]);
在图表中,我们看到控制系统对逐步影响的响应。
plot(fuzzydataout.time, fuzzydataout.value, titel = "Система управления с нечетким ПИД-регулятором", label="выход")
plot!(fuzzydatain.time, fuzzydatain.value, label="вход")
结论
结果,我们得到了一个具有模糊PID控制器的工作控制系统。 事先并不知道对照对象的模型,而是根据实验数据通过鉴定获得的。