数学形式
m
i
n
f
(
x
)
s
.
t
.
{
A
x
≤
B
A
e
q
⋅
x
=
B
e
q
C
(
x
)
≤
0
C
e
q
(
x
)
=
0
minf(x)\\ s.t.\begin{cases} Ax \leq B\\ Aeq \cdot x=Beq\\ C(x)\leq 0\\ Ceq(x) = 0 \end{cases}
m i n f ( x ) s . t . ⎩ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎧ A x ≤ B A e q ⋅ x = B e q C ( x ) ≤ 0 C e q ( x ) = 0
f
(
x
)
f(x)
f ( x ) 为目标函数,可以是任意函数
A
x
Ax
A x 为矩阵相乘,前两个条件是线性等式和线性不等式,与线性规划相同
C
(
x
)
、
C
e
q
(
x
)
C(x)、Ceq(x)
C ( x ) 、 C e q ( x ) 为非线性等式和非线性不等式
fmincon函数
[
x
,
f
v
a
l
]
=
f
m
i
n
c
o
n
(
F
U
N
,
X
0
,
A
,
B
,
A
e
q
,
B
e
q
,
L
B
,
U
B
,
N
O
N
L
C
O
N
)
[x,fval]=fmincon(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON)
[ x , f v a l ] = f m i n c o n ( F U N , X 0 , A , B , A e q , B e q , L B , U B , N O N L C O N )
X
0
X0
X 0 是初始值,因为这个函数只能找到局部最优解,所以初始值很重要
NONLCON 为非线性规划的等式和不等式
FUN 和 NONLCON 要写在一个函数文件中,其中,NONLCON有两个输出,即
[
c
,
c
e
q
]
=
f
u
n
c
t
i
o
n
f
(
x
)
[c,ceq] = function f(x)
[ c , c e q ] = f u n c t i o n f ( x ) ,其中,第一个输出 c 为不等式,第二个输出 ceq 为等式
这个函数虽然实际上没有什么用,因为NP难问题是很难找到全局最优解的,这个函数不够“智能”,但是这个函数的调用形式是非常重要的,很多智能算法工具箱都是这样的形式
函数说明
新建一个函数的m文件,function f = functionName(x);则在脚本中@functionName或者‘functionName’就可以引用这个函数
在函数中x1 用 x(1) 表示,代表 x 向量的第一个元素。
实例
m
i
n
f
(
x
)
=
x
1
2
+
x
2
2
+
8
s
,
t
.
{
x
1
2
−
x
2
≥
0
−
x
1
−
x
2
2
+
2
=
0
x
1
,
x
2
≥
0
minf(x)=x_1^2+x_2^2+8\\ s,t.\begin{cases} x_1^2-x_2 \geq 0\\ -x_1-x_2^2+2=0\\ x_1,x_2\geq 0 \end{cases}
m i n f ( x ) = x 1 2 + x 2 2 + 8 s , t . ⎩ ⎪ ⎨ ⎪ ⎧ x 1 2 − x 2 ≥ 0 − x 1 − x 2 2 + 2 = 0 x 1 , x 2 ≥ 0
function f = fun1 ( x)
f = x ( 1 ) ^ 2 + x ( 2 ) ^ 2 + 8 ;
end
function [ c, ceq] = fun2 ( x)
c = - x ( 1 ) ^ 2 + x ( 2 ) ;
ceq = - x ( 1 ) - x ( 2 ) ^ 2 + 2 ;
end
[ x, fval] = fmincon ( @fun1, rand ( 2 , 1 ) , [ ] , [ ] , [ ] , [ ] , zeros ( 2 , 1 ) , [ ] , @fun2) ;
disp ( x) ;
disp ( fval) ;