【发布时间】:2016-09-08 10:41:21
【问题描述】:
我正在使用 MATLAB 构建一个代码来自动调整三个 PID 控制器增益。我的想法是最小化系统的误差(期望状态与获得状态之间的差异),为此,我编写了一个函数,该函数接受 PID 增益作为输入参数并返回计算出的误差,即:
errors_vector = closedLoopSimulation(pidGains)
因为我有三个设定点(输入命令),所以输出errors_vector 的维度是 3*N,其中 N 是我拥有的时间样本数(在我的情况下为 1000)。这就是我想要最小化的功能,为此,我尝试使用fminunc 命令,即:
pidGains_ini = [2.4 0.1 0.4];
func = @closedLoopSimulation;
[pid, fval] = fminunc(func, pidGains_ini)
但是,当我运行最后一段代码时,我得到了这个错误:
User supplied objective function must return a scalar value.
这显然是因为errors_vector 是一个 3*1000 数组而不是标量。
我的问题是,从编程的角度来看,有没有一种方法可以使 fminunc 最小化返回数组的函数?
另一方面,从控制理论的角度来看,是否有另一种方法可以自动优化 PID 增益?
我希望我说得够清楚了。
谢谢
【问题讨论】:
-
你能更好地解释errors_vector吗?明明每个时间步都有误差,但为什么每个时间步有3个呢?您是否同时控制三个输出?
-
Ziegler-Nichols method 和 Relay method 是两种流行的 PID 调整方案。
-
@tvo,是的,这就是我正在做的事情。我的系统是 MIMO,有 3 个输入命令和 3 个从 PID 控制器输出的控制努力。
标签: arrays matlab optimization pid-controller