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