用模糊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控制器的工作控制系统。 事先并不知道对照对象的模型,而是根据实验数据通过鉴定获得的。