求解有约束的非线性规划问题主要有两类方法:一类是利用约束问题本身的性质,直接求解;另一类是将有约束的问题转化为无约束的规划问题,再通过无约束规划问题求解。
1. 求解只有等式约束的非线性规划问题
对于只有等式约束的非线性规划问题:
可以利用高等数学中的Lagrange乘数法。其基本思想就是通过引入Lagrange因子,将含有n个变量和k个约束条件的有约束优化问题转化为含有n+k个变量的无约束优化问题,也就是令L(x,λ)=f(x)+λTh(x),再求解L(x,λ)的极值即可。
例3 求解下列有约束的非线性规划问题
解 先构造函数
MATLAB程序如下:
2. 求解二次规划问题
若某非线性规划的约束条件全是线性的,而目标函数为自变量x的二次函数,我们就称这种规划为二次规划。二次规划一般形式可表述为如下:
其中:H是对称矩阵;f, b, beq, lb, ub是列向量;A, Aeq是矩阵。
MATLAB中求解二次规划的命令:
[x, fval]=quadprog(H, f, A, b, Aeq, beq, lb, ub, x0, options)
其中:返回值x是决策向量x的值;返回值fval是目标函数在x处的值。
例4 求解下列有约束的非线性规划问题
解 在例3中我们已用Lagrange函数方法求解,此方法只对等式约束有效。此题满足二次规划的形式,现在我们用quadprog函数求解。
MATLAB程序如下:
求得x1=4.0, x2=2.0, min f(x)=-36.00。
(注意,此题的目标函数比例3的目标函数少一个常数60)(www.xing528.com)
3. 求解一般非线性规划问题
quadprog函数虽然解决了非线性规划的约束条件既有等式又有不等式的问题,但其只针对二次规划成立,对于一般的有约束的非线性规划问题不能用。为此引入罚函数,用增加惩罚项的方法来求解。其基本思想是利用问题中的约束函数做出适当的罚函数,由此构造出带参数的增广目标函数,把一般问题转化为无约束非线性规划问题。增广目标函数由两部分构成,一部分为原问题的目标函数,另一部分为由约束条件构造的罚函数。
对于非线性规划问题:
令M足够大,则增广目标函数为
从而原问题转化为求上式的最小值,也就是无约束非线性规划问题。
对于一般的有约束的非线性规划问题,除非它的最优解恰好是无约束问题的最优解,一般用罚函数法求得的最优解都在可行域的外部,因此罚函数法也称外罚函数法。
例5 求下列非线性规划问题:
解 首先,写出增广目标函数,编写M函数test如下:
function g=test(x);
M=50000;
f=x(1)*x(2)*(x)3;
g=f-M*min(x(1), 0)-M*min(x(2), 0)- M*min(x(3), 0) -M*min(x(1)+2*x(2)+3*x(3), 0)
+M*max(x(1)+2*x(2)+3*x(3)-72, 0);
其次,求增广目标函数的最小值:
[x, y]=fminunc('test', rand(2, 1))
计算结果为x1=20,x2=11,x3=15,minf(x)=3 300。由于这是非线性规划问题,很难求得问题的全局最优解,所以只能求得一个局部最优解,并且每次运行的结果是不一样的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。