(优化)fmincon不尊重非线性约束

20视图(30天)
米哈伊尔•
米哈伊尔• 2011年7月11日
回答: 马特·J 2023年4月29日
你好,
道歉如果这是论坛发布错误的部分。
我试图使用fmincon执行非线性优化。然而,它表现在某种程度上,我无法解释。简而言之,它终止优化和约束条件告诉我,满足 很明显 他们不是。
我想发布的所有代码只会混淆这个问题,所以我只会把最低限度:
objfun:
函数fval = objfun_up (~)
fval = 0;
没有客观的这个例子中,它只是一个“发现”的问题。然而,甚至行为发生在其他情况下,我使用一个目标函数。
confun:
函数测查[c] = confun2 (P)
负载var
P =重塑(P [m m]);
H = B * D + (Im-B) * P;
piH = statdist (H);
c =λ* A - n *(60 /τ)* piH;
测查= [];
数学是无关紧要的。简而言之,非线性约束函数程序变量矢量P,一些非线性的东西,它和输出c。在这个例子中,我只有不等式约束。
你会注意到c取决于n。所有的常量存储在var和读取正确。一切都很多次我都检查过了,没有明显的或愚蠢的错误。
这是调用fmincon:
选择= optimset (“算法”,“激活集”);
m ^ 2磅= 0 (1);
乌兰巴托= 1 (1 m ^ 2);
[P ~ exitflag] = fmincon (@objfun, D(:),[],[],[],[],磅,乌兰巴托,@confun,选项);
P =重塑(P [m m]);
再次,就忽略了数学。但我认为需要注意的重要部分是:我有非常简单的上界和下界(0 < p < 1),没有其他线性等式或不等式约束。一切都取决于c = confun (P)。
所以就像我说的,c在很大程度上依赖于n。这是会发生什么当我运行优化与提高n的值。
1。从n = 3开始,按预期的行为是:
没有找到可行的解决方案。fmincon停止,因为预测目标函数的变化小于默认值函数的宽容但在默认值约束不满足约束的宽容。
好了,好了。n是低所以c =λ* - n *(60 /τ)* piH(忽略数学)几乎肯定是大于零的。
健康检查:
confun (P) = 3.7983 3.9712 4.4778 1.2078 4.8830 7.1656 0.7788 5.3027 -1.8769 0.2918
任何(confun (P) > 0) = 1
exitflag = 2
一切如预期。你可以看到,只有一个c的值小于零,因此,约束显然没有见过。
2。现在,当我得到n = 10,命运开始发生:
局部最小值发现,满足约束。
优化完成,因为目标函数中引入可行的方向,在默认值函数的宽容,在默认值和约束满足约束的宽容。
好了,好了。似乎是我找到了一个解决方案。检查:
exitflag = 1
但是:
confun (P) = 0.4947 -0.0496 0.3744 -1.2497 0.4694 1.1195 -2.3594 0.6577 -6.6541 -4.8028
任何(confun (P) > 0) = 1
所以告诉我,我的约束是满意,显然当我们可以看到,他们不是。一半的c是大于零的值。
3所示。然后我强行运行优化n的值更高。最终我得到n = 18。
优化完成,因为目标函数中引入可行的方向,在默认值函数的宽容,在默认值和约束满足约束的宽容。
检查:
confun (P) = -4.8472 -6.6988 -5.6686 -5.4916 -4.7158 -0.1210 -7.1805 -1.6490 -12.6144 -11.0132
任何(confun (P) > 0) = 0
exitflag = 1
所以最终我找到一个解决方案,手动。我知道一个人存在,因为它是一个很琐碎的约束,最终会见了足够大的n。但与fmincon是怎么回事?为什么它错误地评估约束是满意吗?我做错了什么或这是一个错误吗?
提前谢谢,
1评论
弗兰克
弗兰克 2023年4月29日
不幸的是fmincon不是开源的,我猜你必须编写自己的约束优化代码。

登录置评。

答案(2)

马特·J
马特·J 2017年10月12日
任何(confun (P) > 0)是错误的测试。你必须看任何(confun (P) > TolCon)。

马特·J
马特·J 2023年4月29日
数学是无关紧要的。简而言之,非线性约束函数程序变量矢量P,一些非线性的东西,它和输出c。在这个例子中,我只有不等式约束。
数学不是无关紧要的。fmincon假定非线性约束函数可微性和non-stochasticity非常具体的数学属性。我们无法看到这些属性是否坚持这个问题,因为数学是隐藏在一些第三方statdist函数。下面是一个简单的例子来说明可以观察到这种行为如果非线性约束函数包含随机化操作。
选择= optimoptions (“fmincon”,“算法”,“激活集”,“显示”,“没有”);
[x, fval exitflag] = fmincon (@ x (x), 2, [], [], [], [], 0, 1, @confun,选择)
x = 1
fval = 1
exitflag = 1
confun (x)
ans = 0.2196
函数测查[c] = confun (x)
测查= [];
c =兰德- 0.5;
结束

类别

找到更多的在和迭代解算器输出显示帮助中心文件交换

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!