当前位置:   article > 正文

MATLAB非线性优化函数总结(二)_matlab中的objfun函数

matlab中的objfun函数


前文: 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)
  • 1
  • 2
  • 3
[x,fval] = fminsearch(___)
%对任何之前输入的语法,在fval中返回解x处的目标函数fun的值。
[x,fval,exitflag] = fminsearch(___)
%返回描述退出条件的值exitflag。
[x,fval,exitflag,output] = fminsearch(___)
%返回带有优化过程信息的结构输出。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

示例

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(x2x12)2+(1x1)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)
  • 1
  • 2
  • 3

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(___)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

示例

  1. 多项式最小化

最小化函数 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+x224x1+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)
  • 1
  • 2
  • 3
  1. 供应梯度
    当提供导数时,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(x2x12)2+(1x1)2,其梯度为
    ∇ f ( x ) = [ − 400 ( x 2 − x 1 2 ) x 1 − 2 ( 1 − x 1 ) 200 ( x 2 − x 1 2 ) ] \nabla f(x)=
    [400(x2x12)x12(1x1)200(x2x12)]
    f(x)=[400(x2x12)x12(1x1)200(x2x12)]
options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
%创建选项来使用目标函数的梯度。将算法设置为'trust-region'。
  • 1
  • 2
x0 = [-1,2]; #初始点为[-1,2]
fun = @rosenbrockwithgrad;
x = fminunc(fun,x0,options)
%找到局部最小值。
%优化完成,因为梯度小于优化容忍度的值。
  • 1
  • 2
  • 3
  • 4
  • 5
%创建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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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\{
    c(x)0ceq(x)=0A·xbAeq·x=beqlbxubKi(x,wi)0,1in
    \right.
    c(x)0ceq(x)=0AxbAeqx=beqlbxubKi(x,wi)0,1in

    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(___)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

示例

  1. 最小化半无限约束条件下的函数
    最小化函数 ( x − 1 ) 2 (x-1)^2 (x1)2,约束条件 0 ≤ x ≤ 2 0\le x\le 2 0x2,目标函数在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)=(x1/2)(t1/2)20forall0t1,此时 x ≤ 1 / 2 x\le 1/2 x1/2。由于 ( t − 1 / 2 ) 2 ≤ 0 (t-1/2)^2\le0 (t1/2)20,故而 m a x t g ( t , x ) = x − 1 / 2 max_tg(t,x)=x-1/2 maxtg(t,x)=x1/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)0whenx1/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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/350648?site
推荐阅读
相关标签
  

闽ICP备14008679号