#include // Параметры регулятора double kp = 0.5; // Коэффициент пропорциональной составляющей double ki = 0.2; // Коэффициент интегральной составляющей double e_prev = 0; // Предыдущее значение ошибки double i_term = 0; // Интегральная составляющая // Функция, рассчитывающая управляющее воздействие double calculate_control_action(double setpoint, double process_variable) { double error = setpoint - process_variable; // Вычисляем ошибку // Вычисляем интегральную составляющую i_term += ki * error; // Адаптивный коэффициент пропорциональной составляющей double adaptive_kp = kp / (1 + (i_term * i_term)); // Вычисляем управляющее воздействие double control_action = adaptive_kp * error + i_term; // Сохраняем предыдущее значение ошибки e_prev = error; return control_action; } int main() { double setpoint = 25.0; // Заданное значение double process_variable = 20.0; // Измеренное значение // Печатаем управляющее воздействие printf("Control action: %f\n", calculate_control_action(setpoint, process_variable)); return 0; }