MATLAB多維無約束最小化函數 fminunc 、fminsearch與多維有約束函數fmincon

一、多維無約束最小化函數 fminunc

1、函數模型

min f(x),式中f(x)爲無約束多變量函數,x是向量或矩陣

2、調用格式

x = fminunc(fun,x0)

matlab代碼

%% 多維無約束極值
f=@(x) (x(1)^2+2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2))
x0=[0 0];
[x,favl]=fminunc(f,x0)

%繪製處函數圖形,判斷求解是否正確
X=-10:0.1:10;
Y=X;
[x,y]=meshgrid(X,Y);
f=(x.^2+2*x).*exp(-x.^2-y.^2-x.*y);
mesh(x,y,f)

x = fminunc(fun,x0,options)

syms x y
f=(x^2+2*x)*exp(-x^2-x^2-x*y);

% f=@(x) (x(1)^2+2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2))
% x0=[1 1];
% options=optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true)
options=optimoptions('fminunc','Algorithm','quasi-newton','PlotFcns',@optimplotfval)

[x,favl]=fminunc(f,x0,options)


%提供梯度文件
function [f,g]=TD(x)

f = (x(1)^2+2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2));

if nargout > 1 % gradient required
    g = [exp(- 2*x(1)^2 - x(2)*x(1))*(2*x(1) + 2) - exp(- 2*x(1)^2 - x(2)*x(1))*(x(1)^2 + 2*x(1))*(4*x(1) + x(2))
        -x(1)*exp(- 2*x(1)^2 - x(2)*x(1))*(x(1)^2 + 2*x(1))];
end
options=optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true)
x0=[1 1]

[x,favl]=fminunc(@TD,x0,options)

x = fminunc(problem)

problem.options = options;
problem.x0 = [-1,2];
problem.objective = @rosenbrockwithgrad;
problem.solver = 'fminunc';

x = fminunc(problem)

[x,fval] = fminunc(___)

返回極值點函數值fval

[x,fval,exitflag,output] = fminunc(___)

返回一個描述fminunc退出條件的值exitflag,以及一個包含有關優化過程信息的結構輸出。

[x,fval,exitflag,output,grad,hessian] = fminunc(___)

返回梯度grad和海塞矩陣hessian

3、關於meshgrid的一點說明

在畫一個二維圖形或者三維圖形的時候,我們需要指定一個二維平面或者三維空間。就像繪製一維圖形需要指定自變量x的範圍一樣。

X=-10:0.1:10; 
Y=X;
[x,y]=meshgrid(X,Y);
f=(x.^2+2*x).*exp(-x.^2-y.^2-x.*y);
mesh(x,y,f)

以如下代碼爲例,其繪製出的圖形的二維平面的範圍與X和Y相同,是一個矩陣,該矩陣如下所示(這裏僅展示x的矩陣)。

二、多維無約束最小化函數 fminsearch

1、目標模型

其目標模型與fminunc相同,不同的是該函數使用無導數方法查找無約束的多元函數的最小值,而fminunc使用有導數方法。

2、調用格式

x = fminsearch(fun,x0)

f=@(x) (x(1)^2+2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2))
x0=[0 0];
[x,fval]=fminsearch(f,x0)

x = fminsearch(fun,x0,options)

% 顯示函數值的求解
x0=[0 0];
options = optimset('PlotFcns',@optimplotfval);
[x,fval]=fminsearch(@demo_9_28_1,x0,options);

x = fminsearch(problem)

返回極值點x

[x,fval] = fminsearch(___)

返回極值點函數值fval

[x,fval,exitflag] = fminsearch(___)

返回一個描述退出條件的值exitflag。

[x,fval,exitflag,output] = fminsearch(___)

返回帶有有關優化過程信息的結構輸出output。

三、多維無約束最小化函數 fmincon

1、目標模型

min  f(x)

 s.t  A*x<=b           線性不等式約束

       Aeq*x=beq     線性等式約束

       c(x)<=0          非線性不等式約束

       ceq*x=0         非線性等式約束

      lb=<x<=ub       最優解x的上下界

2、調用格式

x = fmincon(fun,x0,A,b) 線性不等式約束

f=@(x) -x(1)*x(2)*x(3);
A=[-1 -1 -1;1 2 2]
b=[20 5]
x0=[1 1 1];
[x,fval]=fmincon(f,x0,A,b,[],[])

x = fmincon(fun,x0,A,b,Aeq,beq)   線性不等式約束+等式約束

f=@(x) -x(1)*x(2)*x(3);
A=[-1 -1 -1;1 2 2]
b=[20 5]
x0=[1 1 1];
Aeq=[1 1 0];
beq=4
[x,fval]=fmincon(f,x0,A,b,Aeq,beq)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)  線性不等式約束+等式約束+x的上下界

f=@(x) -x(1)*x(2)*x(3);
A=[-1 -1 -1;1 2 2]
b=[20 5]
x0=[1 1 1];
Aeq=[1 1 0];
beq=4
lb=[4 2 1]
[x,fval]=fmincon(f,x0,A,b,Aeq,beq,lb)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)  線性不等式約束+等式約束+x的上下界+非線性約束

function [c,ceq]=con(u) %非線性約束函數文件
x=u(1);
y=u(2);
z=u(3);
c=[];
ceq=x*y+x*z+y*z-80;

f=@(x) -x(1)*x(2)*x(3);
x0=[5 5 5];
[x,fval]=fmincon(f,x0,[],[],[],[],[],[],@con)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 線性不等式約束+等式約束+x的上下界+非線性約束+選項設置

function [f,g]=con1(u) %函數與梯度的.m文件
x=u(1);
y=u(2);
z=u(3);
f=-x*y*z;
if nargout > 1 % gradient required
    g = [-y*z
         -x*z
         -x*y;];
end

function [c,ceq]=demo_9_29_1(u)
x=u(1);
y=u(2);
z=u(3);
c=[];
ceq=x*y+x*z+y*z-80;
end

%% 提供梯度
options = optimoptions('fmincon','SpecifyObjectiveGradient',true);
syms x y z
ff=-x*y*z;
g=gradient(ff);
x0=[5 5 5];
[x,fval]=fmincon(@con1,x0,[],[],[],[],[],[],@con)

x = fmincon(problem)  

[x,fval] = fmincon(___)  返回最優解x和該點函數值fval

[x,fval,exitflag,output] = fmincon(___) 返回函數退出條件exitflag和有關優化過程信息的結構輸出output

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章