From 99b05654d0689aa0394930831c388397234e944f Mon Sep 17 00:00:00 2001 From: Goga Coder Date: Wed, 2 Apr 2025 12:45:52 +0700 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?/=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pid_graphics.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 pid_graphics.py diff --git a/pid_graphics.py b/pid_graphics.py new file mode 100644 index 0000000..78715d1 --- /dev/null +++ b/pid_graphics.py @@ -0,0 +1,56 @@ +import matplotlib.pyplot as plt +import time + +# Параметры PID-регулятора +kp = 0.5 # пропорциональный коэффициент +ki = 0.1 # интегральный коэффициент +kd = 0.2 # дифференциальный коэффициент (НОВОЕ!) + +# Инициализация переменных +setpoint = 50.0 # заданное значение +input_val = 0.0 # текущее значение (с датчика) +I = 0.0 # интегральная составляющая +prev_error = 0.0 # предыдущая ошибка (для D-составляющей) +dt = 0.1 # временной шаг + +# Списки для хранения данных для графика +time_points = [] +setpoint_points = [] +input_points = [] +out_points = [] + +# Симуляция работы PID-регулятора +for t in range(100): + # Обновляем входное значение (имитация системы) + error = setpoint - input_val + input_val += error * 0.1 * (1 + 0.1 * t) # имитация изменения системы + + # Расчет управляющего сигнала (PID) + P = error # пропорциональная составляющая + I += error * dt # интегральная составляющая + D = (error - prev_error) / dt # дифференциальная составляющая (НОВОЕ!) + out = P * kp + I * ki + D * kd # общий управляющий сигнал + + # Сохраняем предыдущую ошибку для D-составляющей + prev_error = error + + # Сохраняем данные для графика + time_points.append(t * dt) + setpoint_points.append(setpoint) + input_points.append(input_val) + out_points.append(out) + + time.sleep(dt) # задержка для имитации реального времени + +# Построение графика +plt.figure(figsize=(10, 6)) +plt.plot(time_points, setpoint_points, label='Setpoint', linewidth=2) +plt.plot(time_points, input_points, label='Input', linewidth=2) +plt.plot(time_points, out_points, label='Output (PID)', linewidth=2) + +plt.title('PID Controller Performance (with D-term)') +plt.xlabel('Time (s)') +plt.ylabel('Value') +plt.legend() +plt.grid(True) +plt.show() \ No newline at end of file