swh:1:snp:d460e09d7a0ebd508ffbb5fc8580c6584ff91442
Tip revision: 8da858a9a496faf7eb26f1854e8db3c57776c0e0 authored by lwt831 on 30 April 2021, 08:00:14 UTC
Update Readme
Update Readme
Tip revision: 8da858a
linesearch_for_energy_decrease.m
function status = linesearch_for_energy_decrease(M, b, Jp, z, delta, Eg, energy_type, status)
delta_norm = norm(delta);
dot_delta_g = dot(delta, Eg);
delta = reshape(delta,[],3);
E = status(2);
E_next = E;
ls = 1;
ls_alpha = 0.2;
ls_beta = 0.5;
while ls * delta_norm > 1e-6
z_next = z - ls*delta;
Eq_next = trace(z_next'*M*z_next) - 2 * dot(z_next(:),b(:));
J_next = z_next' * Jp;
[~,s,~] = svdJacobian(J_next);
switch energy_type
case 1
s = s(:);
Ed_next = sum(s.^2 + s.^(-2) - 2) / size(Jp,2) * 3;
case 2
s = s(:);
Ed_next = sum((s-1).^2) / size(Jp,2) * 3;
end
E_next = Eq_next + Ed_next;
if E_next < E - ls * ls_alpha * dot_delta_g
break;
end
ls = ls * ls_beta;
end
status(1) = ls;
status(3) = E_next;
status(8) = delta_norm;
if energy_type == 2
status(4) = max(s);
status(6) = min(s);
end
end