I want a situation whereby if the first 'if' statement is true (norm_sn <= del), the code should calculate x_plus and exit the if condition (jump to calculate f_x), or if the 'if' statement is false and the 'elseif' statement is true (del <= norm_s_cp), the code should calculate x_plus and exit the if statements (jump to calculate f_x). if none of the first two is true, then it can calculate the 'else'. I want it to be in that order. Can someone help me out. Thank you.
function [x_plus,grad,norm_grad,f_x,f_xplus,m_xplus] = dogleg(f,x,del) syms x_1 x_2 aux grad = subs(gradient(f,[x_1,x_2]),[x_1,x_2],x'); norm_grad = norm(grad); H = subs(hessian(f,[x_1,x_2]),[x_1,x_2],x'); %
s_n = -H^-1*grad; norm_sn = norm(s_n); lambda_star1 = norm_grad^2/(grad'*H*grad); s_cp = -lambda_star1*grad; norm_s_cp = norm(s_cp); if norm_sn <= del x_plus = x + s_n; elseif del <= norm_s_cp x_plus = x - (del/norm_grad)*grad; else gamma = norm_grad^4/((grad'*H*grad)*(grad'*abs(s_n))); %gamma = norm_s_cp*norm(grad)/grad'*abs(s_n);
eta = 0.8*gamma + 0.2; s_ncap = eta*s_n; lambda = solve(norm(s_cp + aux*(s_ncap - s_cp))^2 == del^2); x_plus = x + s_cp + lambda(lambda>0)*(s_ncap - s_cp); end f_x = subs(f,[x_1,x_2],x'); f_xplus = subs(f,[x_1,x_2],x_plus'); m_xplus = f_x + grad'*(x_plus - x) + 0.5*(x_plus - x)'*H*(x_plus - x);end
Best Answer