Министерство образования Республики Беларусь Учреждение образования Брестский государственный технический университет Кафедра ИИТ Лабораторная работа № 8 Выполнила: студентка 3 курса, ФЭИС группы АС-28 Слюсарева М. А. Проверил: Войцехович Г.Ю. Брест 2011 Задание: Алгоритм работы ПИД-регулятора может быть представлен в следующем виде: На C++ реализовать программу, моделирующую рассмотренный выше ПИД-регулятор. Решение #include <iostream> #include <math.h> using namespace std; class Regulator { public: Regulator(); //Конструктор void linear(double, double); //по линейному закону void nonlinear(double, double); //по нелинейному закону }; Regulator::Regulator() { int incomHeat=0; int currTem=incomHeat; int maxTem=50; }; void Regulator::linear(double y, double w) //y-начальная температура; w-желаемое значение температуры { double k=1; //K-коэффициент передачи double ti=1; //Ti-постоянная интегрирования double td=1; //Td-постоянная дифференцирования double t0=1; //To-шаг по времени double e=0; //e(t)-отклонение выходной переменной от желаемого значения в момент времени t double e1=0; //e(t-1)-отклонение выходной переменной от желаемого значения в момент времени t-1 double e2=0; //e(t-2)-отклонение выходной переменной от желаемого значения в момент времени t-2 double du=0; //delta u-управляющее воздействие double u1=0; //u(k-1)-управляющее воздействие в момент времени t-1 double u=0; //u(k)-управляющее воздействие на данном этапе double q0, q1, q2; //q0, q1, q2-параметры регулятора cout<<"linear: "<<"K="<<k<<" T="<<ti<<" Td="<<td<<" To="<<t0<<" y="<<y<<" W="<<w<<endl; q0=k*(1+td/t0); //вичисляем параметры регулятора q1=-k*(1+2*td/t0-t0/ti); q2=k*td/t0; int i; for (i=0; i<=290; i++) { cout<<y<<"\t"; //Вывод температуры du=q0*e+q1*e1+q2*e2; u=u1+du; y=0.988*y+0.232*u; //Вычисление температуры u1=u; e2=e1; e1=e; e=w-y; } cout<<endl; } void Regulator::nonlinear(double y, double w) //y-начальная температура; w-желаемое значение температуры { double k=0.01; //K-коэффициент передачи double ti=1; //Ti-постоянная интегрирования double td=1; //Td-постоянная дифференцирования double t0=1; //To-шаг по времени double e=0; //e(t)-отклонение выходной переменной от желаемого значения в момент времени t double e1=0; //e(t-1)-отклонение выходной переменной от желаемого значения в момент времени t-1 double e2=0; //e(t-2)-отклонение выходной переменной от желаемого значения в момент времени t-2 double q0, q1, q2; //q0, q1, q2-параметры регулятора double du=0; //delta u-управляющее воздействие double u=1; //u(k)-управляющее воздействие в момент времени t double u1=1; //u(k-1)-управляющее воздействие в момент времени t-1 double u2=0; //u(k-2)-управляющее воздействие в момент времени t-2 double y1=0; //y(k-1)-температура в момент времени t-1 double y2=0; //y(k-2)-температура в момент времени t-2 cout<<"nonlinear: "<<"K="<<k<<" T="<<ti<<" Td="<<td<<" To="<<t0<<" y="<<y<<" W="<<w<<endl; q0=k*(1+td/t0); //вичисляем параметры регулятора q1=-k*(1+2*td/t0-t0/ti); q2=k*td/t0; int i; for (i=0; i<=280; i++) { cout<<y<<"\t"; //Вывод температуры du=q0*e+q1*e1+q2*e2; u=u1+du; y=0.9*y1-0.001*pow(y2,2)+u+sin(u2); //Вычисление температуры u2=u1; u1=u; y2=y1; y1=y; e2=e1; e1=e; e=w-y; } } void main() { Regulator Regulator1; double y1=0; //Начальная температура double w=6; //Какую температуру поддерживать Regulator1.linear(y1,w); //Включение чайника по линейному закону Regulator1.nonlinear(y1,w); //Включение чайника по нелинейному закону cin.get(); } График изменения температуры Регулирование температуры с помощью ПИД-регулятора в нелинейной модели происходит более быстро и с меньшими колебаниями, чем у линейной модели.