前文: MATLAB非线性优化函数总结(一).
fminsearch
- 无梯度优化法寻找无约束多变量函数最小值,目标函数为 m i n x f ( x ) min_xf(x) minxf(x), f(x)是一个返回标量的函数,而x是一个向量或矩阵。
语法
x = fminsearch(fun,x0)
x = fminsearch(fun,x0,options)
x = fminsearch(problem)
[x,fval] = fminsearch(___)
%对任何之前输入的语法,在fval中返回解x处的目标函数fun的值。
[x,fval,exitflag] = fminsearch(___)
%返回描述退出条件的值exitflag。
[x,fval,exitflag,output] = fminsearch(___)
%返回带有优化过程信息的结构输出。
示例
Rosenbrock函数
f
(
x
)
=
100
(
x
2
−
x
1
2
)
2
+
(
1
−
x
1
)
2
f(x)=100(x_2-x_1^2)^2+(1-x_1)^2
f(x)=100(x2−x12)2+(1−x1)2
该函数在点x = [1,1]处被最小化,最小值为0。设置起始点为x0 = [-1.2,1],用fminsearch将Rosenbrock的函数最小化。
fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0,options)
fminunc
- 无约束多变量函数的最小化
语法
x = fminunc(fun,x0)
x = fminunc(fun,x0,options)
x = fminunc(problem)
[x,fval] = fminunc(___)
[x,fval,exitflag,output] = fminunc(___)
[x,fval,exitflag,output,grad,hessian] = fminunc(___)
示例
- 多项式最小化
最小化函数 f ( x ) = 3 x 1 2 + 2 x 1 x 2 + x 2 2 − 4 x 1 + 5 x 2 f(x)=3x_1^2+2x_1x_2+x_2^2-4x_1+5x_2 f(x)=3x12+2x1x2+x22−4x1+5x2
fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);
x0 = [1,1];
[x,fval] = fminunc(fun,x0)
- 供应梯度
当提供导数时,fminunc更快、更可靠。
用Rosenbrock函数 f ( x ) = 100 ( x 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 f(x)=100(x_2-x_1^2)^2+(1-x_1)^2 f(x)=100(x2−x12)2+(1−x1)2,其梯度为
∇ f ( x ) = [ − 400 ( x 2 − x 1 2 ) x 1 − 2 ( 1 − x 1 ) 200 ( x 2 − x 1 2 ) ] \nabla f(x)=\begin{bmatrix}-400(x_2-x_1^2)x_1-2(1-x_1) \\200(x_2-x_1^2) \end{bmatrix} ∇f(x)=[−400(x2−x12)x1−2(1−x1)200(x2−x12)]
options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
%创建选项来使用目标函数的梯度。将算法设置为'trust-region'。
x0 = [-1,2]; #初始点为[-1,2]
fun = @rosenbrockwithgrad;
x = fminunc(fun,x0,options)
%找到局部最小值。
%优化完成,因为梯度小于优化容忍度的值。
%创建rosenbrockwithgrad函数,包含梯度作为第二输出。
function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;
if nargout > 1 % gradient required
g = [-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1));
200*(x(2)-x(1)^2)];
end
end
fseminf
- 寻找半无限约束的多变量非线性函数的最小值
-
m
i
n
x
f
(
x
)
min_x f(x)
minxf(x) such that
{
c
(
x
)
≤
0
c
e
q
(
x
)
=
0
A
⋅
x
≤
b
A
e
q
⋅
x
=
b
e
q
l
b
≤
x
≤
u
b
K
i
(
x
,
w
i
)
≤
0
,
1
≤
i
≤
n
\left\{ \begin{aligned} c(x)\le 0 \\ ceq(x)=0 \\ A·x\le b \\ Aeq·x=beq \\ lb\le x \le ub\\ K_i(x,w_i) \le 0, 1 \le i \le n \end{aligned} \right.
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧c(x)≤0ceq(x)=0A⋅x≤bAeq⋅x=beqlb≤x≤ubKi(x,wi)≤0,1≤i≤n
b b b和 b e q beq beq为向量, A A A和 A e q Aeq Aeq为矩阵, c ( x ) c(x) c(x)、 c e q ( x ) ceq(x) ceq(x)和 K i ( x , w i ) K_i(x,w_i) Ki(x,wi)为返回向量的函数, f ( x ) f(x) f(x)为返回标量的函数, f ( x ) f(x) f(x)、 c ( x ) c(x) c(x)及 c e q ( x ) ceq(x) ceq(x)都可为非线性函数。向量或矩阵 K i ( x , w i ) ≤ 0 K_i(x,w_i)\le 0 Ki(x,wi)≤0是关于 x x x和变量 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn的连续函数。
语法
x = fseminf(fun,x0,ntheta,seminfcon)
%从x0开始,在seminfcon中定义的ntheta半无限约束下找到函数fun的最小值。
x = fseminf(fun,x0,ntheta,seminfcon,A,b)
%加入线性不等式约束A*x≤b。
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq)
%加入线性等式约束Aeq*x=beq。
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
%给x加上界和下界,满足lb ≤ x ≤ ub
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options)
%指定优化选项
x = fseminf(problem)
[x,fval] = fseminf(___)
[x,fval,exitflag,output] = fseminf(___)
[x,fval,exitflag,output,lambda] = fseminf(___)
示例
- 最小化半无限约束条件下的函数
最小化函数 ( x − 1 ) 2 (x-1)^2 (x−1)2,约束条件 0 ≤ x ≤ 2 0\le x\le 2 0≤x≤2,目标函数在x=1时被最小化。
加入约束 g ( x , t ) = ( x − 1 / 2 ) − ( t − 1 / 2 ) 2 ≤ 0 f o r a l l 0 ≤ t ≤ 1 g(x,t)=(x-1/2)-(t-1/2)^2\le0 \,for\,all\,0\le t\le 1 g(x,t)=(x−1/2)−(t−1/2)2≤0forall0≤t≤1,此时 x ≤ 1 / 2 x\le 1/2 x≤1/2。由于 ( t − 1 / 2 ) 2 ≤ 0 (t-1/2)^2\le0 (t−1/2)2≤0,故而 m a x t g ( t , x ) = x − 1 / 2 max_tg(t,x)=x-1/2 maxtg(t,x)=x−1/2,即 m a x t g ( t , x ) ≤ 0 w h e n x ≤ 1 / 2 max_tg(t,x)\le 0\, when \, x\le 1/2 maxtg(t,x)≤0whenx≤1/2。
要用fseminf解决这个问题,要把目标函数写成一个匿名函数。
objfun = @(x)(x-1)^2;
x0 = 0.2;
%初始点x0=0.2
ntheta = 1;
%指明有一个半无限约束
x = fseminf(objfun,x0,ntheta,@seminfcon)
%调用fseminf解决问题
function [c, ceq, K1, s] = seminfcon(x,s)
%无有限非线性不等式和等式约束
c = [];
ceq = [];
% 样本集
if isnan(s)
%有限样本区间
s = [0.01 0];
end
t = 0:s(1):1;
%评估半无限的约束条件
K1 = (x - 0.5) - (t - 0.5).^2;
end