导航:网站首页 >
matlab中fmincon函数中不含等号的边界值怎么设置?,matlab中的fmincon函数一直求不出为什么
matlab中fmincon函数中不含等号的边界值怎么设置?,matlab中的fmincon函数一直求不出为什么
这个问题看似简单,但要想真正解决,可能从理论上存在很大的问题。
如果英语阅读能力过得去,建议看一下MathWorks官网上的一个讨论:/matlabcentral/newsreader/view_thread/235640我简单概括一下讨论的主要内容:1、约束条件如果不含等号,意味着可行域所有符合约束条件的点构成的集合不是一个闭集closed set。
很多看起来很简单的函数在闭集上有最优解,但在非闭集上却未必有解,例如,minimize f(x)=x如果约束条件是x>=0,则很显然最优解为x=0。
然而,如果约束条件改成x>0,则该问题无解,这可以很简单地证明:对于任何x>0,都有f(x/2)关于可行域、闭集、开集之类的概念,我就不展开了,如有兴趣请找本数学规划方面的书看看。
2、对于非闭集约束的问题,该讨论中三个人给了三个不同的建议:(1)Matt建议直接按照无约束优化问题求解fminunc,然后检验是否满足约束。
(2)Bruno Luong建议把约束条件改为包括等号,使得可行域成为闭集,用fmincon求解之后然后检验最优解是否刚好落在边界上即是否满足本来不应包括的等号条件:如果是,则问题无解;否则求出的解即为所需。
(3)Steven Lord建议把非闭约束的边界值改变一个很小的值例如eps,从而改为一个闭约束问题,例如,把x>0改成x>=1e-12,然后进行求解。
上面的三个建议中,我个人更倾向于第二个,其次是第三个。
主要是你的fconfun函数中的ln变量没办法赋值进去你那样写肯定是不对的,fmincon函数求它的最优解时,只是吧x作为变量,当然这也是你希望的个然建议ln = 1+a(3),a(2),a(1);a(1),1+a(3),a(2);a(2),a(1),1+a(3)求出来后,再把ln的确切的值带进fconfun函数中,让fconfun函数只有一个变量x,然后你的程序应该就不会有错了~!
fmincon函数是默认从你给定的x0为中心开始搜索,直至找到函数的最小值,并返回距离x0最近的函数最小值对应的x值这样我们在计算的时候就必须预先判定函数最小值的对应的x值的大概范围确保我们定的初值x0在所求的x附近,以减少计算量在利用调用f(x)就可以求得最小值了如果你给的是周期函数那你给不同的值一般应该会得到不同x值但应该f(x)值是一致的
注意:1fmincon函数提供了大型优化算法和中型优化算法。
默认时,若在fun函数中提供了梯度options 参数的GradObj设置为'on',并且只有上下界存在或只有等式约束,fmincon函数将选择大型算法,当既有等式约束又有梯度约束时,使用中型算法。
2fmincon函数的中型算法使用的是序列二次规划法。
在每一步迭代中求解二次规划子问题,并用BFGS法更新拉格朗日Hessian矩阵。
3fmincon函数可能会给出局部最优解,这与初值X0的选取有关。
在上面的基础上,在nonlcon参数中提供非线性不等式c(x)或等式ceq(x)。
非线性不等式约束nonlcon的定义方法 该参数计算非线性不等式约束c(x)nonlcon 参数是一个包含函数名的字符串。
该函数可以是M文件、内部文件或MEX文件。
它要求输入一个向量x,返回两个变量—解x处的非线性不等式向量c和非线性等式向量ceq。
参考资料:百度百科-fmincon
1、首先,你的参数写错位了——A后面应该有b吧?缺少一个参数,是造成目前报错的直接原因。
2、没有非线性约束,则该位置的参数也写成空矩阵 。
3、传递附加参数的做法,除了你现在使用的参数补位方法外,目前更多的使用匿名函数或嵌套函数的做法。