⎨⎧x12−x2+x32≥0x1+x22+x33≤20−x1−x22+2=0x2+2x32=3x1,x2,x3≥0其中,公式1为目标函数,公式2为约束条件。
对于非线性规划问题,MATLAB 提供了 fmincon
函数来解决,其基本语法为:
1
| [x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
|
其中,fun
为目标函数,x0
为初始值,A
为线性不等式约束的系数矩阵,b
为线性不等式约束的右端项,Aeq
为线性等式约束的系数矩阵,beq
为线性等式约束的右端项,lb
为变量的下界,ub
为变量的上界,nonlcon
为非线性约束函数。
MATLAB 中的非线性规划问题的标准形式为:
xminf(x) such that ⎩⎨⎧c(x)≤0,ceq(x)=0,A⋅x≤b,Aeq⋅x=beq,lb≤x≤ub
其中,c(x)
为非线性不等式约束,ceq(x)
为非线性等式约束。
所以要使用 fmincon
函数,需要先将非线性规划问题转为标准形式:
minf(x)=x12+x22+x32+8
s.t. ⎩⎨⎧−x12+x2−x32≤0x1+x22+x33−20≤0x1+x22−2=0x2+2x32−3=0x1,x2,x3≥0
这里没有线性约束条件,因此 A
和 b
为空矩阵。
接下来,将目标函数和非线性约束条件分别写成函数形式:
1 2 3
| function f = objfun(x) f = x(1)^2 + x(2)^2 + x(3)^2 + 8; end
|
1 2 3 4
| function [c,ceq] = nonlcon(x) c = [-x(1)^2 + x(2) - x(3)^2; x(1) + x(2)^2 + x(3)^3 - 20]; ceq = [x(1) + x(2)^2 - 2; x(2) + 2*x(3)^2 - 3]; end
|
将函数分别保存到 objfun.m
和 nonlcon.m
文件中。
最后,使用 fmincon
函数求解:
1 2 3
| [x,fval] = fmincon(@objfun,[0 0 0],[],[],[],[],[0 0 0],[],@nonlcon)
[x,fval] = fmincon('objfun',[0 0 0],[],[],[],[],[0 0 0],[],'nonlcon')
|
通过修改 x0
的值,可以改变迭代过程,但是最终的解是相同的。
本题的解为:
1 2 3 4 5
| x = 0.5522 1.2033 0.9478
fval = 10.6511
|
小嗷犬
分享技术,记录生活
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小嗷犬!