Модуль 4. Лекция 12 - Школа системного моделирования
作者
贡献者
Школа системного моделирования
Нечеткий ПИД-регулятор
import Pkg; Pkg.add("FuzzyLogic")
In [ ]:
using FuzzyLogic
Структура контроллера с нечёткой логикой:
На вход системы нечеткого вывода поступают нормализованные значения ошибки и производной ошибки . Входные значения нормализуются с помощью коэффициентов масштабирования и так, чтобы они находились в диапазоне [-10,10].
Система нечеткого вывода выдает результат в диапазоне [-10, 10], который масштабируется коэффициентами и .
Расчет коэффициентов масштабирования Ce, Cd, C0 и C1 на основе Kp, Ki и Kd:
Kp = C0 * |Cd| + C1 * |Ce|
Ki = C0 * |Ce|
Kd = C1 * |Cd|
In [ ]:
Kp = 0.10935012267222428
Ki = 0.5347135408282753
Kd = 0.0
Out[0]:
In [ ]:
CE = 10;
CD = CE*(Kp-sqrt(Kp^2-4*Ki*Kd))/2/Ki;
C0 = Ki/CE;
C1 = (Kp-C0*CD)/CE;
In [ ]:
fis = @sugfis function FCtrl(E, delE)::U
# Входные переменные
E := begin
domain = -10.0:10.0
Negative = TriangularMF(-20.0, -10.0, 0.0)
Zero = TriangularMF(-10.0, 0.0, 10.0)
Positive = TriangularMF( 0.0, 10.0, 20.0)
end
delE := begin
domain = -10.0:10.0
Negative = TriangularMF(-20.0, -10.0, 0.0)
Zero = TriangularMF(-10.0, 0.0, 10.0)
Positive = TriangularMF( 0.0, 10.0, 20.0)
end
# Выходная переменная
U := begin
domain = -20.0:20.0
LargeNegative = -20.0
SmallNegative = -10.0
Zero = 0.0
SmallPositive = 10.0
LargePositive = 20.0
end
# Правила
E == Negative && delE == Negative --> U == LargeNegative
E == Negative && delE == Zero --> U == SmallNegative
E == Negative && delE == Positive --> U == Zero
E == Zero && delE == Negative --> U == SmallNegative
E == Zero && delE == Zero --> U == Zero
E == Zero && delE == Positive --> U == SmallPositive
E == Positive && delE == Negative --> U == Zero
E == Positive && delE == Zero --> U == SmallPositive
E == Positive && delE == Positive --> U == LargePositive
end
Out[0]:
In [ ]:
plot(fis, :E, ylabel="Функция принадлежности", w = 2)
Out[0]:
In [ ]:
plot(fis, :delE, ylabel="Функция принадлежности", w = 2)
Out[0]:
In [ ]:
gensurf(fis)
Out[0]:
Таблица для поверхности отклика
In [ ]:
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