作者w12389034e (林小纬)
看板MATLAB
标题[问题] 关於非线性问题的最佳化
时间Mon Jan 11 11:08:04 2016
如题
如果有一个非线性问题 变量为x 有八个
而且有边界的设定:
x(1)+x(5)<=1800
x(2)+x(6)<=1200
x(3)+x(7)<=500
x(4)+x(8)<=1100
目标函数是
F = C1*[x(1)+x(4)]+C2*[x(2)+x(6)]+C3*[x(3)+x(7)]+C4*[x(4)+x(8)]
C1~C4都是常数
先前只有单变数的上下限限制 所以小弟使用lsqnonlin
求解效果还不错 不过如果想要改成双变数的上限下的话
lsqnonlin似乎做不到?
尝试使用fmincon求解 结果跑出错误 如下
Error using fmincon (line 708)
User supplied objective function must return a scalar value.
翻了一下说明书 fmincon好像只能用在General smooth的问题?
问题很长 希望各位大大解惑 谢谢m(_ _)m
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.239.222.100
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1452481686.A.66D.html
1F:推 tn00364361: 怎麽看起来好像应该是线性规划的问题? 01/11 13:28
2F:推 sunev: 线性规划请用 linprog 01/11 14:25
会说是非线性问题的原因是因为
虽然F看起来是线性的
但是因为我还有用惩罚函数的关系
所以整个F应该写为
F = C1*[x(1)+x(4)]+C2*[x(2)+x(6)]+C3*[x(3)+x(7)]+C4*[x(4)+x(8)] + 惩罚值
不过刚刚去一些论坛看了一下 lsqnonlin似乎没办法像是fmincon这样
让两个变数的和在一个限制下求解
※ 编辑: w12389034e (140.116.77.71), 01/11/2016 15:16:15
3F:→ LiamIssac: What is the penalty fun? 01/11 19:15
4F:推 yugi2567: 你怎麽证明这就是最佳的?你有比较吗? 01/11 19:36
5F:推 tn00364361: 所以penalty是非线性的吗? 01/12 10:19
会使用惩罚函数法是因为我想要优选的问题含有一些限制条件
然而叠代的过程中有可能会违反限制 因此给予违反限制的情形惩罚
方法是将违反限制大小的平方与目标函数结合
违反越多 则惩罚量会平方增加 因此优选法会朝尽量不违反限制的方向优选
这个是比较简单的惩罚函数法(外点法)
也因为惩罚函数的存在所以不会是线性的(因为次方不为一次)
另外yugi大大题的最佳是指问题的全域最佳解吗@@?
如果是的话 lsqnonlin提供的演算法有两种:TRR法和LM法
这两种方法都不能保证找到全域最佳解
我尝试用不同的起始值计算得到的答案也不相同
如果尝试次数够多 理论上应该可以找到近似最佳解
但是要证明是否是全域最佳好像有点困难QQ
※ 编辑: w12389034e (36.239.204.154), 01/12/2016 11:53:15
6F:→ LiamIssac: 你还是没讲你的penalty是什麽形式 问题应该出在那边 01/12 15:14