我试图使用一个经济的MPC城市交通(建模为一个状态空间系统),以控制交叉口的灯。我使用fmincon进行优化。当我模拟它时,我发现fmincon对每一个样本时间运行超过一次:对于第一个示例时间,fmincon运行32次,控制值发生变化,Matlab向我展示了以下信息:
初始点是满足约束条件的局部最小值。
优化完成是因为在初始点,目标函数在可行方向上不递减到最优公差的默认值以内,约束满足于约束公差的默认值。
停止准则细节
在此之后,fmincon运行2次,控制值与相同的matlab消息保持不变。我能限制这趟车的号码吗?
发布于 2020-01-25 10:37:27
好吧,你搞混了几个话题:
MPC,代表模型预测控制,这是一种控制技术,它解决了在一个确定的未来地平线上的每一个样本点上的优化问题(通过它可以隐式地确定控制律,因此您不需要在拉普拉斯空间中进行讨厌的极点配置)。
无论如何,您使用fmincon来解决这个优化问题。如果您选择运行时(如果它是一个真正的控制器而不仅仅是一个模拟),这是一个错误的选择,因为您只有一个(可能受到限制但)线性优化问题(如您所提到的状态空间表示)。请看一下如何选择理想的算法上的Matlab。对于实际的实现,我建议使用开源库NLopt,它提供了一个很好的Matlab接口,而且运行速度通常更快。
fmincon现在要问您的实际问题:可以限制fmincon中目标函数的调用吗?(请注意,您的术语"run“令人困惑,因为它指的是优化的开始.就像在MPC里一次又一次的。但你想说的是“目标函数的调用”,我猜)答案是肯定的。
opts = optimoptions('fmincon','MaxFunctionEvaluations',100);
[x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,opts)如果没有代码,就很难跟踪您的具体问题,但是消息(以及exitflag)告诉您,您的初始值或目标函数都很糟糕。fmincon在您的参数空间中找不到一个方向,在这个方向中,它可以逐步降低目标函数的值。当函数发出警告时,函数调用的次数取决于参数length(x0)的数量,因为算法首先需要在所有参数的各个方向上稍微摆动一下……
发布于 2020-01-27 14:47:24
非常感谢您的帮助和所有这些建议和信息。在控制器方面,使用了Matlab实时仿真软件。
关于MPC,我使用了一个非线性模型,您可以在这里找到描述:https://www.sciencedirect.com/science/article/pii/S0968090X12000150
你说的“目标函数的调用”是对的,它不是“运行”。
我测试您建议的选项,仿真是相同的(相同的消息,相同的情况)--我认为问题与每个样本时间的“目标函数调用”的次数有关,而不是所有模拟中使用fmincon的次数。
在我为fmincon使用的函数下面可以找到
函数u=解题(Np,x0,u0,Nu,q,ii)
u0 = [0];
Cycletime= 20/3600;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
lbx = [];
ubx = [];
lbu = [];
ubu = [];
lx = 0;
ux = 386;
lu = 0;
uu = Cycletime;
lbx = [lbx, lx];
ubx = [ubx, ux];
lbu = [lbu lu];
ubu = [ubu uu];
lb = [lbu ;lbx];
ub = [ubu ;ubx];
% Solve optimization problem
u = fmincon(@(u)costfunction1(x0,u,Nu,Np,q,ii), u0, A, b, Aeq, beq, lb,ub) ;结束
https://stackoverflow.com/questions/59908312
复制相似问题