我正在使用 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 增益?
我希望我说得够清楚。
谢谢