最速下降法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最速下降法
%% 最速下降法图示
% 设置步长为0.1,f_change为改变前后的y值变化,仅设置了一个退出条件。syms x;f=x^2;
step=0.1;x=2;k=0; %设置步长,初始值,迭代记录数
f_change=x^2; %初始化差值
f_current=x^2; %计算当前函数值
ezplot(@(x,f)f-x.^2) %画出函数图像
axis([-2,2,-0.2,3]) %固定坐标轴
hold on
while f_change>0.000000001 %设置条件,两次计算的值之差小于某个数,跳出循环
x=x-step*2*x;
%-2*x为梯度反方向,step为步长,!最速下降法!
f_change = f_current - x^2; %计算两次函数值之差
f_current = x^2 ;
%重新计算当前的函数值
plot(x,f_current,'ro','markersize',7) %标记当前的位置
drawnow;pause(0.2);
k=k+1;
end
hold off
fprintf('在迭代%d次后找到函数最小值为%e,对应的x值为%e\n',k,x^2,x)
wolfe准则
unction [alpha, newxk, fk, newfk] = wolfe(xk, dk)
rho = 0.25; sigma = 0.75;
alpha = 1; a = 0; b = Inf;
while (1)
if ~(fun(xk+alpha*dk)<=fun(xk)+rho*alpha*gfun(xk)'*dk) b = alpha;
alpha = (alpha+a)/2;
continue;
end
if ~(gfun(xk+alpha*dk)'*dk>= sigma*gfun(xk)'*dk)
a = alpha;
alpha = min([2*alpha, (b+alpha)/2]); continue;
end
break;
end
newxk = xk+alpha*dk;
fk = fun(xk);
newfk = fun(newxk);
Armijo准则
function mk = armijo(xk, dk)
beta = 0.5; sigma = 0.2;
m = 0; mmax = 200;
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)