目录
1,引文
原文教程为川川菜鸟的《第二天打卡-整数规划(1)》
链接为第三天打卡--非线性规划(1)_python菜鸟-优快云博客
有需要者自取。
2,分析
前两天,我们系统地学习了线性规划。我们现在已经能够熟练地利用MATLAB对线性规划的模型进行处理了。
但实际生活中,能让我们恰好使用线性规划模型去解决的问题又有多少呢?
归根结底,能够恰好线性规划的问题终究是少数,那不能用线性规划,我们该用什么?那自然是非线性规划了。
非线性规划的模型如下所示
第一行和第二行自然无需多说,那么第三行和第四行,可能有同学看到就懵了。其实很好理解,第三行和第四行就是非线性状态下的前两行。举个实例,X^2+2X<=6,X^2-X=12就可以分别放在第三行第四行中。
同时,为了解决非线性规划这个问题,咱们前两天的普通式子就有点捉襟见肘了。为此,给大家介绍一个新函数:fmincon函数。fmincon函数用于寻找约束非线性多变量函数的最小值。这个函数怎么用?
这是语法格式:
x = fmincon(fun,x0,A,b) 从 x0 开始,尝试在满足线性不等式 A*x ≤ b 的情况下寻找 fun 中所述的函数的最小值点 x。x0 可以是标量、向量或矩阵。
x = fmincon(fun,x0,A,b,Aeq,beq) 在满足线性等式 Aeq*x = beq 以及不等式 A*x ≤ b 的情况下最小化 fun。如果不存在不等式,则设置 A = [] 和 b = []。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) 对 x 中的设计变量定义一组下界和上界,使解始终在 lb ≤ x ≤ ub 范围内。如果不存在等式,请设置 Aeq = [] 和 beq = []。如果 x(i) 无下界,请设置 lb(i) = -Inf,如果 x(i) 无上界,请设置 ub(i) = Inf。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 使用 options 所指定的优化选项执行最小化。使用 optimoptions 可设置这些选项。如果没有非线性不等式或等式约束,请设置 nonlcon = []。
而这其中的参数
b 和 beq 是向量,A 和 Aeq 是矩阵,c(x) 和 ceq(x) 是返回向量的函数,f(x) 是返回标量的函数。f(x)、c(x) 和 ceq(x) 可以是非线性函数。
x、lb 和 ub 可以作为向量或矩阵传递
看不懂?不要紧,让我们结合题目来好好地学一学它。
3,线性不等式约束
目标函数:
fun = (x)100*(x(2)-x(1)^2)^2+(1-x(1))^2
约束方程:X(1)+2X(2)<=1
所以,咱们MATLAB就写成
看,是不是很简单?
4,线性不等式和等式约束
大家看题,这比咱们上面多了啥?
多了个等式,对吧。
所以类比线性规划,咱们可以
同样可以类比线性规划来记。
5,带有非线性约束的求最值
目标函数:
min 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
所以,MATLAB:
目标函数为最小化函数,fun是一个函数,fun接受向量或数组x,并返回实数标量f,即在x处计算的目标函数值。
非线性约束条件,nonlcon是一个函数,接受向量或数组x,并返回两个数组c(x)和ceq(x)。
6,非线性约束
当我们要求你在以(1/3,1/3)为圆心,1/3为半径的范围内找一个目标函数的最小值
目标函数:
fun = (x)100*(x(2)-x(1)^2)^2+(1-x(1))^2
匿名后
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
约束条件:
0 ≤ x (1) ≤ 0.5 0
0.2≤x(2)≤0.8
于是
函数代码为
function [c,ceq] = circle(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];
end
主代码为
clc
clear all
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
lb = [0,0.2];
ub = [0.5,0.8];
A = [];
b = [];
Aeq = [];
beq = [];
x0 = [1/4,1/4];
nonlcon = @circle;
[x,y] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)