Настройка ПИД-регулятора - PullRequest
0 голосов
/ 28 марта 2019

В настоящее время я оптимизирую ПИД-регулятор на основе коэффициента усиления (Kc), интегральной постоянной времени (tauI), производной постоянной времени (tauD) и производной фильтра постоянной времени (tauC).Запрашиваемая проблема состоит в том, чтобы оптимизировать контроллер так, чтобы ошибка была близка к нулю (average_error = 0).

Наименьшая ошибка, которую я могу получить, составляет около 15 (базовые значения), хотя я знаю, что я смогу получить значение ниже 1. Параметры, используемые для этого, - это когда Kc = 1, tauI = 1, tauD = 1 иtauC = 1. Это найдено с помощью итераций, виджетов, проб и ошибок.Я действительно в растерянности относительно того, как я должен кодировать это, чтобы получить наименьшие возможные параметры.Кажется, что любое изменение параметров вызывает существенное изменение ошибки при этом минимальном значении.Любая помощь очень ценится.

import sys
import control
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Pull data from CSV

file = 'profiledata.csv'
data = pd.read_csv(file,sep=',')
T_i = data.values

# Universal Variables

time_array = np.linspace(0,59,60)
perf = np.linspace(1,1,100)
average_perf = np.linspace(1,1,100)
Kc = 1
tI = 1
tD = 1
tC = 1

# Functions

for i in range(len(perf)):

  s = control.tf([1,0],[0,1])
  Gp = 1/(s**2 + s + 1)
  Gd = (s+1)/(s**2+s+1)
  Gc = Kc*(1+1/(tI*s) + tD*s/(tC*s + 1))              
  sys_D = Gd/(1+Gp*Gc)
  _,T,_ = control.forced_response(sys_D, time_array, T_i[:,i]) 

  # Compute output based on disturbance closed loop TF sys_D

  _,Q,_ = control.forced_response(-Gc, time_array, T) # Compute input

  perf[i] = sum(abs(T) + (0.2)*abs(Q))

# Calculate the average error from the parameters    

average_perf = sum(perf)/100

print(average_perf)

Ожидаемый результат - то, когда average_perf = 0. Чтение файла данных - это профили возмущения со 100 столбцами и 60 строками.Есть ли способ проверить оптимальные параметры, удерживать этот параметр, а затем протестировать другие параметры с этим параметром, полностью оптимизированным для наименьшей ошибки?Или я просто смотрю на это совершенно неправильно.Также плохо знаком с кодированием, поэтому я не уверен, как эффективно это сделать.Передаточные функции вводятся в цикл for.

...