Fmincon / Multistart:局部最小值,但一个非线性约束违反
8视图(30天)
显示旧的评论
e_frog
2021年3月19日
你好,
我试图找到一个最佳点与multistart / fmincon。Matlab发现一个局部最小值,给出了以下消息的输出结构:
当地的最低发现满足约束。
优化完成,因为目标函数中引入可行的方向,
来在最优值的宽容,约束是满意的价值
约束宽容。<停止标准细节>
优化完成:相对一阶最优性措施7.337955 e-07
是不到选项。OptimalityTolerance = 1.000000 e-06,相对最大constraintviolation7.082693 e-07
是不到选项。ConstraintTolerance = 1.000000 e-06。
我有13个非线性约束,其中一个是违反了。
这是约束:
量表(10)= (l1 - l2 - L_3) - 0.001;
我想实现:
abs (l1 - l2 - L_3) < = 0.001;
如果我用手检查这个约束,我得到的
abs (l1 - l2 - L_3) = 0.0011;
超过所需的值0.001是哪一个
约束公差在optimoptions默认设置为1 e-6。
这是怎样发生的呢?输出清晰的说,所有的约束条件都满足,但事实上不是。
6个评论
e_frog
2021年3月22日
你好,我很抱歉,但是我不能共享整个代码由于保密的原因,但我可以提供一个忽略版本的非线性约束的定义。我希望你能帮助我。我也可以为您提供进一步的信息:
- 它发生时exitflag 1和2
- 在fmincon输入:fmincon(目标,从[],[],[],[],磅,乌兰巴托,nlcon,选项)
我误解了fmincon的功能吗?我假设基于文档,fmincon可能违反中间迭代非线性约束,但不是最后一个迭代/解决方案。那是正确的吗?fmincon应该能够突破非线性约束的解决方案吗?
我的第二个假设是,约束违反出现,因为非线性约束的定义。我试着限制输出微分方程(X_ode),它为每个迭代计算向量x_opt使用优化。
函数测查[c] = nlcon (x_opt)
l1 = 500;
[X_ode] = solveODEs (x_opt%计算常微分方程的数值())
l2 = X_ode (1),
L_3 = X_ode(结束,3)
c (1) =…;
…
量表(1)= l1 - l2 - L_3;%这个约束违反
量表(2)=…;
…
结束
马特·J
2021年3月22日
我不确定发生了什么没有可以执行的代码,但是,正如一个的话,
fmincon
预计可微的约束,所以它可以更好的避免
腹肌
,
量表(10)= (l1 - l2 - L_3) - 0.001;
量表(11)= 0.001 (l1 - l2 - L_3);
接受的答案
马特·J
2021年3月22日
编辑:马特·J
2021年3月22日
如果退出消息说约束在公差都满意,那么这就是应该发生。然而,宽容
是相对fmincon算法除了“激活集”
。相对于什么,documentaiton似乎并没有说,但它可能是相对于初始点。这意味着,如果您的初始点违反约束之一说,8000年,然后0.0011将在1 e-6宽容,因为0.0011/8000 < 1 e-6。
一个简单的解决方案可能会减少ConstraintToleance说,1 e-12。或者,使用
有效集
算法,它适用于你的问题。
13个评论
e_frog
2021年3月22日
编辑:e_frog
2021年3月22日
谢谢你,我今天晚些时候将测试两个选项!
不过你的建议给了我一个想法第三个我的问题可能的解决方案:
也许我的测试方法在数学上是错误的。你愿意看看吗?
上述约束本身被定义为在我的评论(记住,我放弃了固定值为0.001):
函数测查[c] = nlcon (x_opt)
l1 = x_opt (1);
[X_ode] = solveODEs (x_opt%计算常微分方程的数值())
l2 = X_ode (1),
L_3 = X_ode(结束,3)
c (1) =…;
…
量表(1)= l1 - l2 - L_3;%这个约束违反
%我想实现:l1 = = (l2 - L_3) ConstraintTolerance = 1 e-6内是正确的
量表(2)=…;
…
结束
和测试后multistart完成与输出向量x_opt_out计算如下:
函数[checked_nlcons] = nlconCheck (x_opt_out选项)从fmincon ConstraintTolerance %选项
l1 = x_opt_out (1);
[X_ode] = solveODEs (x_opt_out%计算常微分方程的数值())
l2 = X_ode (1),
L_3 = X_ode(结束,3)
%我想实现:l1 = = (l2 - L_3) ConstraintTolerance = 1 e-6内是正确的
checked_nlcons (1, - 1) = num2cell (le (l1 - l2 - L_3 ConstraintTolerance));%将导致1是否满足约束
结束
你的回答给我的印象,最后一行可能是错的。
e_frog
2021年3月22日
假设fmincon检查:
c (1) = A - B% B < = 1 ConstraintTolerance e-06
我怎么检查这个约束手动afterards ?
%一样吗?
checked_nlcon (1) = A + A * ConstraintTolerance < = B;
%还是这样?
checked_nlcon (1) = < = B + B * ConstraintTolerance;
马特·J
2021年3月22日
编辑:马特·J
2021年3月22日
我们无法确定测试
fmincon
因为,就像我说的,它是非法的。然而,我认为这将是有益的措施相对和绝对约束违反,喜欢在下面。
函数[ct, ceqTest] = nlconCheck (xFinal xInitial)
%
% (cAbsolute ceqAbsolute] = nlconCheck (xFinal)
% (cRelative ceqRelative] = nlconCheck (xFinal xInitial)
doRelative =输入参数个数> 1;
阵线= @ (z)马克斯(- z, 0);%的措施违反
fvEq = @ (z) abs (z);
[cFinal, ceqFinal] = nlcon (xFinal);
cFinal =阵线(cFinal);
ceqFinal = fvEq (ceqFinal);
如果doRelative
[cInitial, ceqInitial] = nlcon (xInitial);
cInitial =阵线(cInitial);
ceqInitial = fvEq (ceqInitial);
ct = cFinal /(1 +马克斯(cInitial));ceqTest = ceqFinal /(1 +马克斯(ceqInitial));
其他的
ct = cFinal;ceqTest = ceqFinal;
结束
e_frog
2021年3月22日
谢谢你的努力到目前为止,但这并不帮我进一步与约束
量表(1)= l1 - l2 - L_3;
因为我想实现L1 = (L2-L3)目标值是0。那为什么没有相对的违反可以计算
e_frog
2021年3月22日
不用担心。我得到一些与你的代码nan因为它将由0一些约束。
谢谢你的帮助。我现在认为我的问题是独有的,因为如果不记录如何fmincon检查约束,然后我显然没有检查他们fmincon一样,然后可能实际上是没有约束违反。
但是你给我的代码帮助我缩小我的代码!也谢谢你!
马特·J
2021年3月22日
不用担心。我得到一些与你的代码nan因为它将由0一些约束。
不,我更新了代码与艾伦的公式从我给你的链接。不应该有任何分歧,零。
然后我显然没有检查他们fmincon一样,然后可能实际上是没有约束违反。
我敢肯定你不需要担心
fmincon
对你撒谎你是否满意
fmincon的
自己的停止准则。问题在于标准实际上是有意义的:-)
更多的答案(0)
一个错误发生
无法完成的行动,因为页面所做的更改。重新加载页面更新状态。
你也可以从下面的列表中选择一个网站
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。