算法思想
算法步骤
代码
Matlab代码如下:
function mk=armijo(xk,dk )
beta=0.5; sigma=0.2;
m=0; mmax=20;
while (m<=mmax)
if(fun(xk+beta^m*dk)<=fun(xk)+sigma*beta^m*gfun(xk)'*dk)
mk=m; break;
end
m=m+1;
end
alpha=beta^mk
newxk=xk+alpha*dk
fk=fun(xk)
newfk=fun(newxk)
示例
考虑无约束优化问题
m
i
n
f
(
x
)
=
100
(
x
1
2
−
x
2
)
2
+
(
x
1
−
1
)
2
minf(x)=100(x_1^2-x_2)^2+(x_1-1)^2
minf(x)=100(x12−x2)2+(x1−1)2
设当前迭代点x=(-1,1)T,下降方向
d
k
=
(
1
,
−
2
)
T
d_k=(1,-2)T
dk=(1,−2)T,求步长
α
k
\alpha_k
αk.
fun函数文件:
%目标函数
function f=fun(x)
f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;
gfun函数文件:
%梯度
function gf=gfun(x)
gf=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1), -200*(x(1)^2-x(2))]’;
交互界面输入:
xk=[-1,1]’;
dk=[1,-2]’; mk=armijo(xk,dk)
结果:
m
k
=
2
m_k= 2
mk=2;
α
k
=
0.25
\alpha_k= 0.25
αk=0.25;
x
k
+
1
=
(
−
0.75
,
0.5
)
T
x_{k+1}=(−0.75,0.5)T
xk+1=(−0.75,0.5)T
f
(
x
k
)
=
4
f(x_k) = 4
f(xk)=4;
f
(
x
k
+
1
)
=
3.4531
f(x_{k+1}) = 3.4531
f(xk+1)=3.4531