关于非线性规划

非线性规划问题是指目标函数或者约束条件中包含非线性函数的规划问题。
前面我们学到的线性规划更多的是理想状况或者说只有在习题中,为了便于我们理解,引导我们进入规划模型的一种情况。相比之下,非线性规划会更加贴近实际的生活。那这节我们先通过一个类似于线性规划中linprog()函数的fmincon()来体会一下这类问题的解决过程。

一、fmincon()的基本形式

非线性规划新算法python 非线性规划fmincon_线性规划


基本形式如下:x = fmincon(‘fun’,x0,A,b,Aeq,beq,lb,ub,‘nonlcon’,options) ;

(1)‘fun’为目标函数,注意需要单引号,或者@,或者直接在定义时写成匿名函数即可,后面的nonlcon为非线性约束(包括等式和不等式),形式要求同fun;

(2)x0表示决策变量的初始值,可以随机取一组符合约束条件的数据值,一般来讲没什么影响;

(3)A,b,Aeq,beq分别表示线性的不等式约束和等式约束,Ax<=b,Aeqx=beq;lb,ub同之前的linprog()函数,表示上下界的向量;

(4)使用 options 所指定的优化选项执行最小化。使用 optimoptions 可设置这些选项。如果没有非线性不等式或等式约束,请设置 nonlcon = []。

基本要求就是以上这些,下面我们以几个例子来具体实现一下。

二、例题的具体实现

1.线性不等式约束

fun=@(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2;
x0=[0,0];
A=[1,2];
b=1;
[x,y]=fmincon(fun,x0,A,b)

以上是关于求目标函数f=100*(x2-x12)2+(1-x1)^2
在线性约束x1+2x2<=1条件下的最小值,结果如下:

x =
    0.5022    0.2489
y =
    0.2489

2.线性不等式和等式约束

代码如下(示例):

非线性规划新算法python 非线性规划fmincon_非线性规划新算法python_02


那这个例子中我们又加入了线性等式约束

>> fun=@(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2;
>> x0=[0,0];
>> A=[1,-2];
>> b=1;
>> Aeq=[2,1];
>> beq=1;
>> [x,y]=fmincon(fun,x0,A,b,Aeq,beq)

结果如下

x =
    0.4149    0.1701
y =
    0.3427

3.带有非线性约束的求最值

上面两题只有目标函数是非线性的,那么接下来的题目其约束条件也是非线性的,我们又该怎么办呢?

目标函数 f (x) = x1^2 + x2^2 + x3^2 + 8求最小值
x1^2 − x2 + x3 ^2 ≥ 0%非线性不等式约束
x1 + x2^2 + x3 ^3 ≤ 20%非线性不等式约束
− x1 − x2^2 + 2 = 0%非线性等式约束
x2 + 2x3^2 = 3x1%非线性等式约束
x1,x2 , x3 ≥ 0

做法如下
先编写两个函数,一个为目标函数,另一个为非线性约束条件,最后调用

function f=fun1(x)
f=sum(x.^2)+8;
end

function [g,h]=fun2(x)
g=[-x(1)^2+x(2)-x(3)^2
    x(1)+x(2)^2+x(3)^2-20];
h=[-x(1)-x(2)^2+2
    x(2)+2*x(3)^2-3x1];
end

 [x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')
 %rand(3,1)表示一个三行一列且每个元素属于0到1的矩阵,及快速生成符合本题条件的x0
 %zeros3(3,1)生成一个三行一列的零矩阵用以表示决策变量的下界

结果如下

x =
    0.7472
    1.1193
    0.7490
y =
   10.3722

4.非线性约束

最后一个例子我们目标函数为fun = 100*(x2-x12)2+(1-x1)^2
在以(1/3,1/3)为圆心,1/3为半径的边界约束条件下求其最小值
约束条件还有` 0 ≤ x (1) ≤ 0.5 , 0.2≤x(2)≤0.8

function f=fun1(x)
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
end

function [g,h]=fun2(x)
g=(x(1)-1/3)^2+(x(2)-1/3)^2-1/9;
h=[];
end

[x,y]=fmincon('fun1',[1/3,1/3],[],[],[],[],lb,ub,'fun2')

结果如下`

x =
    0.5000    0.2500
y =
    0.2500

总结

以上就是我们这次所有的例题求解了。
 非线性规划求最值的fmincon函数其实和线性规划的improg大同小异,关键是对非线性约束条件的把握,即nonlcon,以及option(一般情况下我们不用管,默认值就可以了,有需求具体查阅使用即可)。