#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;
}