【问题标题】:Minimizing an array-returning function using "fminunc"使用“fminunc”最小化数组返回函数
【发布时间】: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 methodRelay method 是两种流行的 PID 调整方案。
  • @tvo,是的,这就是我正在做的事情。我的系统是 MIMO,有 3 个输入命令和 3 个从 PID 控制器输出的控制努力。

标签: arrays matlab optimization pid-controller


【解决方案1】:

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

【讨论】:

  • 在 MATLAB 中使用 lsqnonlin 怎么样?它不适用于我的情况,特别是它适用于返回数组的函数。
  • 是的,它会自动为您形成目标(平方和)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2017-08-18
  • 2017-07-23
  • 2018-01-30
  • 2015-02-18
  • 2020-10-06
相关资源
最近更新 更多