จูน PID ด้วย Twiddle: อีกทางเลือกที่ไม่ใช่ Ziegler–Nichols
การจูนค่าพารามิเตอร์สำหรับคอนโทรลเลอร์ PID (Proportional-Integral-Derivative) คือหัวใจสำคัญในงานของวิศวกรรมควบคุมอุตสาหกรรม ความสำคัญของการจูน PID อยู่ที่ว่ามันสามารถทำให้ระบบควบคุมทำงานได้อย่างมีประสิทธิภาพ ลดเวลาตอบสนอง และความผันผวน หนึ่งในวิธีการจูนที่เป็นที่รู้จักกันดีตอนเรียนหนังสือคือวิธี Ziegler–Nichols โดยวิธีนี้เริ่มด้วยการตั้งค่าการเพิ่ม (gain) จนถึง (ultimate gain) จนถึงจุดที่ระบบเข้าสู่สภาพขอบเขตการสั่นพ้อง (oscillate) ที่ต้องระวังคือการทำเช่นนี้นำไปสู่การตั้งค่าที่ “แรง” เกินไปสำหรับระบบ โดยเฉพาะระบบที่มีความไวต่อความผิดพลาดจะนำไปสู่การเกินปรับ (overshoot) หากนำไปใช้ในระบบที่ต้องการความแม่นยำสูงหรือระบบที่มีความเสี่ยงสูงต่อชีวิตหรือสภาพแวดล้อมจะทำให้เกิดความเสียหายร้ายแรงได้
Twiddle: จูน PID อย่างไรไม่ให้พัง
Twiddle, หรือที่รู้จักในชื่อ “Coordinate Ascent,” เป็นอัลกอริธึมที่พัฒนาโดย Sebastian Thrun ในคอร์ส “Artificial Intelligence for Robotics” ที่ Udacity. อัลกอริธึมนี้มีจุดเด่นที่สามารถ “ค้นหา” ค่าที่เหมาะสมโดยอัตโนมัติสำหรับคอนโทรลเลอร์ PID โดยปรับเปลี่ยนค่าของ Kp, Ki และ Kd อย่างเป็นระบบจนกว่าจะได้ประสิทธิภาพที่ต้องการ
วิธีทำงานของ Twiddle:
เริ่มต้นค่าพารามิเตอร์: กำหนดค่าเริ่มต้นสำหรับ Kp, Ki และ Kd.
ทดลองและปรับปรุง: ใช้ชุดข้อมูลหรือระบบจริงเพื่อทดสอบประสิทธิภาพของคอนโทรลเลอร์.
ประเมินผล: คำนวณผลลัพธ์จากการทดลองเช่น ขนาดของ overshoot, ระยะเวลาตอบสนอง, หรือความผิดพลาดสะสม.
ปรับค่าพารามิเตอร์: ใช้กลไกของ Twiddle เพื่อปรับค่า Kp, Ki และ Kd ให้เหมาะสม.
Twiddle ทำการปรับปรุงค่าพารามิเตอร์โดยรอบ โดยหลังจากทดสอบสัญญาณแต่ละค่า จะมีการปรับค่าเพิ่มหรือลดตามเงื่อนไขที่กำหนดไว้ล่วงหน้า ซึ่งแตกต่างจาก Ziegler–Nichols ที่ใช้การทดสอบเพื่อกำหนดค่า PID จากการตอบสนองของระบบที่สั่นคลอน (oscillate) จนถึงจุดที่เสถียร
def calculate_error(parameters):
“””
Compute the error for the given parameters.
This function should be replaced with the actual error calculation logic,
which depends on the specific problem being solved.
:param parameters: List of parameters for which error needs to be calculated.
:return: The calculated error.
“””
return error_function(parameters) # Replace with the actual error calculation logic
def optimize_parameters(initial_parameters, step_sizes, error_threshold):
“””
Optimize the parameters to minimize the error using an iterative approach.
This function adjusts each parameter iteratively to find the combination
that minimizes the error. It uses an approach similar to coordinate descent,
where each parameter is varied while keeping others constant to find a
local minimum.
:param initial_parameters: List of initial values of the parameters.
:param step_sizes: List of step sizes for each parameter.
:param error_threshold: Threshold for the cumulative step size.
:return: Optimized parameters.
“””
parameters = initial_parameters.copy()
best_error = calculate_error(parameters)
# Continue until the sum of all step sizes is below the threshold
while sum(step_sizes) > error_threshold:
for i in range(len(parameters)):
# Try increasing the current parameter
parameters[i] += step_sizes[i]
error = calculate_error(parameters)
if error < best_error: # Improvement in error
best_error = error
step_sizes[i] *= 1.1 # Increase the step size
else:
# If no improvement, try decreasing the parameter
parameters[i] -= 2 * step_sizes[i]
error = calculate_error(parameters)
if error < best_error: # Improvement in error
best_error = error
step_sizes[i] *= 1.05 # Slightly increase the step size
else:
# If neither increasing nor decreasing improves error,
# revert to original parameter and reduce the step size
parameters[i] += step_sizes[i]
step_sizes[i] *= 0.95
return parameters
# Example of how to use the function
optimized_parameters = optimize_parameters([0, 0, 0], [1, 1, 1], 0.001)
สุดท้ายนี้, จะเลือกใช้วิธีใดในการจูน PID นั้นขึ้นอยู่กับเงื่อนไขและข้อจำกัดของระบบควบคุมที่คุณทำงานด้วย อย่าลืมทดลองใช้ Twiddle และดูว่ามันสามารถพิสูจน์ให้เห็นถึงความสามารถในการจูนที่ละเอียดและแม่นยำกว่า Ziegler–Nichols ได้หรือไม่