求用frank-wolfe方法求解这个问题的matlab代码

求用frank-wolfe方法求解这个问题的matlab代码,第1张

优化问题

用matlab自带的fmincon工具箱就能解决了。

具体使用可以自己看matlab关于fmincon的帮助

你的q1j是整数吧?

如果是的话,就好办,for循环做积分

如果不是的话,偶无能为力。

最数下降法解无约束优化的程序

先建立一维搜索的m文件:minWP.m如下

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [x,minf]=minWP(f,XMAX,c1,c2,alpha,tol)

%一维搜索的Wolfe-Powell法

%作者:龚纯 王正林<<精通 Matlab 最优化计算>>

%f:目标函数

%XMAX:搜索最大值

%c1:可接受系数1

%c2:可接受系数2

%alpha:增大步长倍数

%tol:精度

%x:极小值点

%minf:极小值点处的函数值

format long

if nargin==5

tol=1.0e-6

end

if ~(c1>0)||~(c1<c2)||~(c2<1)||~(XMAX>0)||~(alpha>1)

error('参数不对')

end

var=findsym(f)

df=diff(f)

f0=subs(f,var,0)

df0=subs(df,var,0)

a=0

b=XMAX

if b<inf

t=(a+b)/2

else

t=10

end

while 1

ft=subs(f,var,t)

fu=f0+c1*t*df0

if ft<=fu

dft=subs(df,var,t)

dfl=c2*t*df0

if dft>dfl

x=t

break

else

a=t

if b==inf

t=t*alpha

else

t=(a+b)/2

end

continue

end

else

b=t

t=(a+b)/2

continue

end

end

minf=subs(f,var,t)

format short

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

然后建立最速下降法的m文件如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%minFD.m

function [x,minf]=minFD(f,x0,var,tol)

%最速下降法

%作者:龚纯 王正林《精通Matlab最优化计算》

%目标函数:f

%初始点:x0

%自变量向量:var

%精度:tol

%所求的驻点:x

%驻点处的函数值

format long

if nargin==3

tol=1.0e-6

end

gradf=jacobian(f,var) %f的梯度

wucha=1

syms lamda

while wucha>tol

d=-subs(gradf,var,x0)

wucha=norm(d)

y=x0+lamda*d

yf=subs(f,var,y)

%l=minHJ(yf,0,100)

l=minWP(yf,10,0.2,0.6,2)

x1=x0+l*d

x0=x1

end

x=x1

minf=subs(f,var,x)

format short

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

保存后就可调用了:

>>clear

>>syms x1 x2

>>f=1.5*x1^2+0.5*x2^2-x1*x2-2*x1

f =

3/2*x1^2+1/2*x2^2-x1*x2-2*x1

>>[x,mf]=minFD(f,[-2 4],[x1,x2])

x =

1.00001.0000

mf =

-1.0000

armijo 是wolfe的一个条件,它能确保有足够的decrease,但是不能保证alpha足够的精确(最小点)。因为matlab无法估计你函数的复杂程度,它一般还需要一个条件,即构成strong wolfe 来找到更精确的alpha。简单的说,armijo简单但不够精确,strong wolfe 复杂一些但更精确!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8085698.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存