0

我正在使用 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 增益?

我希望我说得够清楚。

谢谢

4

1 回答 1

1

最小化向量的定义不是很好(有一种叫做多目标或多标准优化的东西,但它有点专业)。“正常”优化方法只能最小化(或最大化)标量目标。我怀疑在您的情况下,您可以通过求平方误差的总和并将其最小化来形成这样的目标。完整地说:这是标准操作程序,通常被称为“最小二乘法”。

于 2016-05-12T17:15:40.090 回答