#include <stdio.h>

// Параметры регулятора
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;
}


