Замечания по разработке ПИД-регулятора № 12: Реализация нечеткого ПИД-регулятора [легко понять]
Замечания по разработке ПИД-регулятора № 12: Реализация нечеткого ПИД-регулятора [легко понять]

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

В реальном управлении управляемая система не является линейной и не зависящей от времени, и ей часто требуется динамическая настройка параметров ПИД-регулятора. Нечеткое управление может удовлетворить это требование, поэтому в следующем разделе мы обсудим нечеткий ПИД-регулятор. сопутствующие вопросы. Нечеткий ПИД-регулятор — это алгоритм управления, который сочетает в себе нечеткий алгоритм с самонастройкой параметров ПИД-регулирования. Можно сказать, что это применение нечеткого алгоритма при настройке параметров ПИД.

1. Принцип нечеткого алгоритма

Нечеткий алгоритм — это алгоритм, основанный на интеллектуальном рассуждении. Хотя он и называется нечетким алгоритмом, на самом деле это идея постепенного усовершенствования. Нечеткий контроллер в основном состоит из трех функциональных модулей: фаззификации, механизма нечеткого вывода и точности, а также базы знаний (включая базу данных и базу правил). Здесь мы обсудим несколько основных вопросов нечеткого управления.

1.1. Количественное определение объема ввода.

Все входные данные точны, и для реализации нечеткого алгоритма их необходимо оценить количественно. Так называемое квантование заключается в проецировании входной величины на определенный числовой уровень с помощью функции квантования, которая обычно представляет собой числовой интервал, симметричный относительно 0. Конкретный прогнозируемый интервал зависит от реальной ситуации, поскольку это напрямую влияет на точность расчета.

1.2. Фаззификация

Фаззификация — очень важный шаг в нечетком алгоритме. Сначала определяется нечеткое подмножество, соответствующее каждой лингвистической переменной. Затем на основе результатов количественного определения мы можем определить набор, к которому принадлежат входные данные, и вычислить соответствующую степень членства. Существует множество методов расчета принадлежности. Наиболее часто используемый метод — использование треугольной функции принадлежности или трапециевидной функции принадлежности.

1.3. База правил

База правил основана на фаззификации управляющих величин и является основой для нечетких рассуждений, которые в значительной степени опираются на опыт. База правил может быть выражена во многих формах, а конкретная форма реализации зависит от удобства нашей реализации.

1.4. Механизм вывода

Рассуждение и принятие решений являются основой нечеткого управления. Он использует информацию из базы знаний и методы нечетких вычислений для моделирования мышления людей, методов рассуждения и принятия решений, а также активирует соответствующие правила управления при определенных входных условиях, чтобы обеспечить соответствующее нечеткое управление. выход.

1.5. Точность

Путем нечетких рассуждений мы получаем серию нечетких выражений, и нам нужно выполнить операции дефаззификации, чтобы получить дефицитные данные. Обычно используемые методы дефаззификации включают в себя:

  • Метод максимального членства – простой расчет, подходящий для случаев с низкими требованиями к контролю.
  • Метод центра тяжести – выход более плавный, но расчет сложен
  • Средневзвешенный метод – обычно наиболее широко используемый в промышленности.

1.6. Инженерная количественная оценка

Выходные данные управления системой представляют собой точное число, но это не физическая величина, которую можно напрямую использовать для управления объектом, поэтому в конечном итоге ее необходимо преобразовать в соответствии с нашими потребностями. Например, параметры, соответствующие ПИД-регулятору, можно при необходимости преобразовать и скорректировать перед выводом на ПИД-регулятор.

2. Разработка нечеткого ПИД-алгоритма.

Основные принципы нечеткого алгоритма были кратко описаны выше. Далее мы обсудим, как его применить к ПИД-управлению. Так называемое нечеткое ПИД-регулирование принимает отклонение e и изменение отклонения ec в качестве входных данных и использует правила нечеткого управления для настройки параметров ПИД в режиме онлайн для удовлетворения различных требований различного отклонения e и приращения отклонения ec. параметры ПИД. Его структурная схема выглядит следующим образом:

2.1. Фаззификация входных значений.

Фаззификация входного значения заключается в сопоставлении входных данных, используемых для расчета, со стандартизированным числовым интервалом и получении степени принадлежности входных данных к подмножеству на основе результата квантования и подмножества фаззификации. Когда мы используем отклонение e и приращение отклонения ec в качестве входных данных для настройки параметров управления, нам необходимо фаззифицировать e и ec.

Сначала мы определяем нечеткие подмножества e и ec. Для ПИД-регулирования мы выбираем: отрицательное большое [NB], отрицательное среднее [NM], отрицательное маленькое [NS], ноль [ZO], положительное маленькое [PS], положительное среднее. [PM], Zhengda [PB] и другие семь лингвистических переменных могут с достаточной точностью выразить свое нечеткое подмножество. Поэтому мы определяем нечеткие подмножества e и ec как {NB, NM, NS, ZO, PS, PM, PB}.

После определения нечеткого подмножества, как нам сопоставить конкретные значения e и ec нечеткому множеству? Нам нужно ввести функцию квантования. Чтобы определить функцию квантования, мы сначала вводим вселенную дискурса, соответствующую нечетким множествам e и ec, определяемым как {-6, -5, -4, -3, -2, -1, 0, 1, 2, 3. , 4, 5 ,6}. Для любого сигнала измерения физической величины существует диапазон, который мы записываем как Vmax и Vmin, который, естественно, должен быть таким же, как диапазон заданного значения во время регулировки ПИД, поэтому диапазон отклонения e представляет собой диапазон от От Vmin-Vmax до Vmax-Vmin Диапазон приращения отклонения вдвое больше. Здесь мы используем линейную количественную оценку, и функциональная зависимость такова:

Используя приведенную выше функцию квантования, e и ec можно квантовать, и мы можем получить определенное нечеткое подмножество, используя такие методы, как округление. Однако, учитывая, что изменения e и ec являются непрерывными изменениями, округление от 4 до 5 может повлиять на точность управления, поэтому для реализации этого процесса мы вводим степень принадлежности.

Наконец, мы определяем степени принадлежности e и ec нечеткому подмножеству. Степень членства — это значение от 0 до 1, используемое для описания степени принадлежности входных данных определенному нечеткому «я». Обычно мы описываем ее как функцию принадлежности. Здесь можно использовать линейную функцию принадлежности или треугольную функцию принадлежности. Ее функциональная связь следующая:

Если наш количественный результат равен 1, то степень членства, принадлежащая ZO, равна 0,5, а степень принадлежности, также принадлежащая PS, равна 0,5. На этом этапе фаззификация завершена.

2.2. Создайте таблицу нечетких правил.

Ранее мы кратко описали фаззификацию входных данных, но нечеткое рассуждение является основой нечеткого управления. Чтобы реализовать нечеткие рассуждения, нам сначала нужно создать базу правил или базу знаний для нечетких рассуждений, а затем построить машину вывода для рассуждений.

Во-первых, давайте создадим базу нечетких правил. Здесь нам нужно настроить три параметра Kp, Ki и Kd, поэтому нам нужно создать базу нечетких правил для этих трех переменных.

2.2.1. Построение нечетких правил КП.

В ПИД-регуляторе выбор значения Kp зависит от скорости реакции системы. Увеличение Kp может улучшить скорость реакции и уменьшить установившееся отклонение, однако, если значение Kp слишком велико, это приведет к большому перерегулированию и даже сделает систему нестабильной. Уменьшение Kp может уменьшить перерегулирование и улучшить стабильность. Значение Kp слишком мало, это замедлит скорость отклика и продлит время регулировки. Поэтому на ранней стадии регулировки следует выбрать большее значение Kp, чтобы улучшить скорость реакции. На средней стадии регулировки Kp следует установить на меньшее значение, чтобы система имела меньшее перерегулирование и обеспечивала определенное значение. скорость реакции, а на более позднем этапе процесса регулировки следует установить меньшее значение Kp. Затем отрегулируйте значение Kp до большего значения, чтобы уменьшить статическую разницу и повысить точность управления. Основываясь на приведенном выше описании, мы определяем нечеткие правила Kp следующим образом:

2.2.2. Разработка нечетких правил Ки.

В управлении системой интегральное управление в основном используется для устранения установившегося отклонения системы. По некоторым причинам (например, нелинейность насыщения и т. д.) процесс интегрирования может привести к насыщению интеграла на ранней стадии процесса настройки, что приводит к большому перерегулированию в процессе настройки. Следовательно, на ранней стадии процесса корректировки, чтобы предотвратить интегральное насыщение, ее интегральный эффект должен быть слабее или даже нулевым, на средней стадии корректировки, чтобы не влиять на стабильность, его интегральный эффект должен быть умеренным; и, наконец, на более позднем этапе процесса необходимо усилить интегральный эффект, чтобы уменьшить ошибку статической регулировки. На основе приведенного выше анализа мы сформулировали следующие нечеткие правила Ки:

2.2.3. Разработка нечетких правил Kd.

Регулировка дифференциального звена в основном вводится для больших инерционных процессов, а функция коэффициента дифференциального звена заключается в изменении динамических характеристик системы. Коэффициент дифференциальной связи системы может отражать тенденцию изменения сигнала и может вводить в систему эффективный сигнал ранней коррекции до того, как сигнал отклонения изменится слишком сильно, тем самым ускоряя скорость реакции, сокращая время регулировки и устраняя колебания. В конечном итоге изменение динамических характеристик системы. Поэтому выбор значения Kd оказывает большое влияние на динамические характеристики регулировки. Если значение Kd слишком велико, процесс торможения будет опережать процесс регулировки, в результате чего время регулировки будет слишком длинным. Если значение Kd слишком мало, процесс торможения будет отставать, что приведет к увеличению перерегулирования; Согласно реальному опыту процесса, на ранней стадии регулировки дифференциальный эффект следует увеличить, чтобы получить меньшее или даже избежать перерегулирования в среднесрочной перспективе, поскольку характеристики регулировки более чувствительны к изменениям значения Kd; , значение Kd должно быть соответственно меньше и должно оставаться фиксированным, тогда на более позднем этапе регулировки значение Kd должно быть уменьшено, чтобы уменьшить эффект торможения контролируемого процесса, тем самым компенсируя вызванное удлинение времени процесса регулировки; большим значением Kd на ранней стадии процесса корректировки. На основе приведенного выше анализа сформулируем нечеткие правила для Kd следующим образом:

Затем нечеткие подмножества, соответствующие ΔKp, ΔKi и ΔKd, выводятся на основе результатов фаззификации отклонения E и приращения отклонения EC и базы правил. Поскольку ранее мы разработали функцию принадлежности для определения степени принадлежности входных и выходных величин нечеткому подмножеству, полученные нечеткие подмножества ΔKp, ΔKi и ΔKd обычно представляют собой матрицу, состоящую из нечетких переменных. Входные величины E и EC представляют собой вектор, состоящий из нечетких переменных.

Наконец, нам необходимо уточнить количественные данные, соответствующие различным нечетким переменным. Соответствие этих количественных данных физическим величинам совершенно различно в зависимости от конкретных объектов.

2.3. Удаление размытия

Для полученного целевого объекта нам также необходимо его фаззить, чтобы он соответствовал конкретной физической величине. В нечетком PID-посредничестве нам нужны Kp, Ki и Kd, поэтому нам нужно получить нужные нам значения Kp, Ki и Kd на основе результатов нечеткого вывода.

Ранее мы разработали треугольную функцию принадлежности и использовали ту же цель количественной оценки, то есть область дискурса {-6, 6}, поэтому в определенный момент степени принадлежности нечетких переменных, в которых расположены входные и выходные данные, равны То же самое. Основываясь на этом, мы используем метод центра тяжести для расчета количественного значения каждой выходной величины. Формула выглядит следующим образом:

Фактически, из-за особенностей используемой нами функции принадлежности сумма вычисленных степеней принадлежности в любом направлении равна 1, поэтому знаменатель можно опустить. Таким образом, расчет каждого объекта на самом деле является матричной операцией, а формула выглядит следующим образом:

Если используется количественное значение, его необходимо преобразовать в фактическое значение. В этом случае не проблема напрямую использовать физическое значение. Как с ним обращаться, определяется в соответствии с фактическими потребностями. После получения приращения мы также можем ввести коэффициенты для усиления и уменьшения изменений Kp, Ki и Kd. Конкретная формула реализации выглядит следующим образом:

, где ΔK — рассчитанное нами значение, а α — коэффициент, задающий влияние приращения на конечный результат.

3. Реализация нечеткого ПИД-алгоритма.

Ранее мы описали весь процесс работы алгоритма, а затем написали код для его реализации. Во-первых, нам все еще нужно определить объект структуры нечеткого ПИД-регулятора.

Язык кода:javascript
копировать
/*Определение структур и государственных органов*/
typedef struct
{
  float setpoint;               /*значение настройки*/
  float kp;                     /*Коэффициент пропорциональности*/
  float ki;                     /*Интегральный коэффициент*/
  float kd;                     /*дифференциальный коэффициент*/
  float lasterror;              /*Отклонение предыдущего выстрела*/
  float preerror;               /*Отклонение в первых двух долях*/
  float deadband;               /*мертвая зона*/
  float output;                 /*выходное значение*/
  float result;                 /*Выходное значение физической величины*/
  float maximum;                /*Верхний предел выходного значения*/
  float minimum;                /*Нижний предел выходного значения*/

  float maxdKp;                 /*Максимальный предел приращения Kp*/
  float mindKp;                 /*Минимальный предел приращения Kp*/
  float qKp;                    /*Коэффициент влияния приращения Kp*/
  float maxdKi;                 /*Максимальный предел приращения Ki*/
  float mindKi;                 /*Минимальный предел приращения Ki*/
  float qKi;                    /*Коэффициент влияния приращения Ki*/
  float maxdKd;                 /*Максимальный предел приращения Kd*/
  float mindKd;                 /*Минимальный предел приращения Kd*/
  float qKd;                    /*Коэффициент влияния приращения Kd*/
}FUZZYPID;

Затем фаззифицируйте входное значение. Ранее мы разработали использование функций линейного квантования и треугольных функций принадлежности, поэтому реализация проста.

Язык кода:javascript
копировать
/*Операционная функция линейного квантования, область {-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6}*/
статическая пустота LinearQuantization(FUZZYPID *vPID,float pv,float *qValue)
{
  float thisError;
  float deltaError;

  thisError=vPID->setpoint-pv;                  //Рассчитываем значение отклонения
  deltaError=thisError-vPID->lasterror;         //Рассчитываем шаг отклонения

  qValue[0]=6.0*thisError/(vPID->maximum-vPID->minimum);
  qValue[1]=3.0*deltaError/(vPID->maximum-vPID->minimum);
}

Для количественной функции на самом деле можно использовать различные функции в зависимости от потребностей, такие как функция кривой падения, функция нормального распределения и другие унарные функции и т. д., но для нашей цели достаточно использования линейной функции. Существует также много вариантов функции принадлежности. Здесь мы используем треугольную функцию принадлежности с небольшим объемом вычислений:

Язык кода:javascript
копировать
/*Функция расчета членства*/
static void CalcMembership(float *ms,float qv,int * index)
{
  if((qv>=-NB)&&(qv<-NM))
  {
    index[0]=0;
    index[1]=1;
    ms[0]=-0.5*qv-2.0;  //y=-0.5x-2.0
    ms[1]=0.5*qv+3.0;   //y=0.5x+3.0
  }
  else if((qv>=-NM)&&(qv<-NS))
  {
    index[0]=1;
    index[1]=2;
    ms[0]=-0.5*qv-1.0;  //y=-0.5x-1.0
    ms[1]=0.5*qv+2.0;   //y=0.5x+2.0
  }
  else if((qv>=-NS)&&(qv<ZO))
  {
    index[0]=2;
    index[1]=3;
    ms[0]=-0.5*qv;      //y=-0.5x
    ms[1]=0.5*qv+1.0;   //y=0.5x+1.0
  }
  else if((qv>=ZO)&&(qv<PS))
  {
    index[0]=3;
    index[1]=4;
    ms[0]=-0.5*qv+1.0;  //y=-0.5x+1.0
    ms[1]=0.5*qv;       //y=0.5x
  }
  else if((qv>=PS)&&(qv<PM))
  {
    index[0]=4;
    index[1]=5;
    ms[0]=-0.5*qv+2.0;  //y=-0.5x+2.0
    ms[1]=0.5*qv-1.0;   //y=0.5x-1.0
  }
  else if((qv>=PM)&&(qv<=PB))
  {
    index[0]=5;
    index[1]=6;
    ms[0]=-0.5*qv+3.0;  //y=-0.5x+3.0
    ms[1]=0.5*qv-2.0;   //y=0.5x-2.0
  }
}

Далее мы реализуем функцию нечеткого вывода. С учетом предыдущей основы и библиотеки нечетких правил функция нечетких вычислений на самом деле проста.

Язык кода:javascript
копировать
/*Операция дефаззификации,Корректировка в соответствии с конкретной функцией количественного определения и функцией принадлежности*/
статическая пустота FuzzyComputation (FUZZYPID *vPID,float pv,float *deltaK)
{
  float qValue[2]={0,0};        //Количественное значение отклонения и его приращение
  int indexE[2]={0,0};          //Индекс принадлежности отклонения
  float msE[2]={0,0};           //Степень принадлежности отклонения
  int indexEC[2]={0,0};         //Индекс членства приращения отклонения
  float msEC[2]={0,0};          //Степень принадлежности приращения отклонения
  float qValueK[3];

  LinearQuantization(vPID,pv,qValue);

  CalcMembership(msE,qValue[0],indexE);
  CalcMembership(msEC,qValue[1],indexEC);

  qValueK[0]=msE[0]*(msEC[0]*ruleKp[indexE[0]][indexEC[0]]+msEC[1]*ruleKp[indexE[0]][indexEC[1]])
            +msE[1]*(msEC[0]*ruleKp[indexE[1]][indexEC[0]]+msEC[1]*ruleKp[indexE[1]][indexEC[1]]);
  qValueK[1]=msE[0]*(msEC[0]*ruleKi[indexE[0]][indexEC[0]]+msEC[1]*ruleKi[indexE[0]][indexEC[1]])
            +msE[1]*(msEC[0]*ruleKi[indexE[1]][indexEC[0]]+msEC[1]*ruleKi[indexE[1]][indexEC[1]]);
  qValueK[2]=msE[0]*(msEC[0]*ruleKd[indexE[0]][indexEC[0]]+msEC[1]*ruleKd[indexE[0]][indexEC[1]])
            +msE[1]*(msEC[0]*ruleKd[indexE[1]][indexEC[0]]+msEC[1]*ruleKd[indexE[1]][indexEC[1]]);

  deltaK[0]=LinearRealization(vPID->maxdKp,vPID->mindKp,qValueK[0]);
  deltaK[1]=LinearRealization(vPID->maxdKi,vPID->mindKi,qValueK[1]);
  deltaK[2]=LinearRealization(vPID->maxdKd,vPID->mindKd,qValueK[2]);
}

На этом этапе приращения Kp, Ki и Kd получены. Осталось только скорректировать три параметра и использовать их для реализации ПИД-регулирования. Они ничем не отличаются от обычного приращения ПИД-регулятора и не будут описываться снова.

4. Резюме

Алгоритм нечеткого ПИД — это применение нечеткого алгоритма при настройке параметров ПИД, которое отличается от чистого алгоритма нечеткого управления. Обычные нечеткие регуляторы подходят для прямого расчета выходных сигналов регулятора, в то время как нечеткие ПИД-алгоритмы используют нечеткие алгоритмы для изменения параметров ПИД, а окончательный выходной сигнал регулятора по-прежнему реализуется ПИД-регулятором.

Само по себе нечеткое управление очень сложно и имеет множество специфических методов применения. Большинство из них являются профессиональными контроллерами для конкретных объектов и вышли из категории универсальных контроллеров типа ПИД. Кроме того, более популярный нечеткий многопараметрический регулятор относится к категории усовершенствованных систем управления (APC), о которых мы еще поговорим, когда у нас будет такая возможность.

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/134973.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose