-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcalc_alpha.m
57 lines (46 loc) · 1.47 KB
/
calc_alpha.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function alfa=calc_alpha(x,d)
alfa_l=0;
alfa_u = rand;
epsilon = 1e-3;
xnew = x + alfa_u*d;
[~,~,g]=calc_grad(xnew);
hl = g'*d;
if abs(hl)<1e-8 %Verifica se hl é zero
alfa = alfa_u;
disp('Não realiza busca')
return
end
while hl<0 % tenta encontra um alfa que torne h positivo
alfa_u = 2*alfa_u; %dobra o valor de alpha
xnew = x + alfa_u*d; %calcula o novo valor
[~,~,g]=calc_grad(xnew); %calcula o valor do gradiente
hl = g'*d; %calcula o valor de hl
end
if abs(hl)<1e-8 %Verifica se hl é zero
alfa = alfa_u;
disp('Não realiza busca')
return
end
nint = ceil (log(alfa_u/epsilon)); % numero de iteações
k=0;
disp(sprintf('***********Buscando um valor de alfa*********************'))
disp(sprintf('Iteração k=%d hl = %1.5f [%1.2f %1.2f]',k, hl, alfa_l,alfa_u))
alfa_m = (alfa_l+alfa_u)/2; % calcula o alfa medio
while k<nint & abs(hl)>1e-8
k=k+1;
alfa_m = (alfa_l+alfa_u)/2; % calcula o alfa medio
xnew = x + alfa_m*d; %calcula o novo valor
[~,~,g]=calc_grad(xnew); %calcula o valor do gradiente
hl = g'*d; %calcula o valor de hl
if hl>0
alfa_u = alfa_m;
elseif hl <0
alfa_l = alfa_m;
else
break;
end
disp(sprintf('Iteração k = %d hl = %1.5f [%1.2f %1.2f]', k, hl, alfa_l,alfa_u))
end
alfa = alfa_m;
disp(sprintf('Iteração k = %d hl = %1.5f melhor alfa =%1.5f ', k, hl, alfa))
disp(sprintf('**********Terminando a busca do alfa**********************'))