38 lines
856 B
Matlab
38 lines
856 B
Matlab
function [xk, xs, gs] = Newton(f, x0, max_itr, tol, bt)
|
|
syms x y;
|
|
xk = x0;
|
|
|
|
gf = gradient(f);
|
|
hf = hessian(f, [x, y]);
|
|
|
|
fl = matlabFunction(f);
|
|
gfl = matlabFunction(gf);
|
|
|
|
tnorm = norm(at(gf, xk), 2);
|
|
xs = zeros(size(x0, 1), max_itr + 1);
|
|
xs(:, 1) = x0;
|
|
gs = zeros(1, max_itr + 1);
|
|
gs(1) = tnorm;
|
|
k = 1;
|
|
|
|
while tnorm > tol && k <= max_itr + 1
|
|
pk = - (at(hf, xk) \ at(gf, xk));
|
|
if bt
|
|
alpha = backtracking(fl, gfl, pk, xk, 1, 0.9, 1e-4);
|
|
else
|
|
alpha = 1;
|
|
end
|
|
xk = xk + alpha * pk;
|
|
tnorm = norm(at(gf, xk), 2);
|
|
k = k + 1;
|
|
xs(:, k) = xk;
|
|
gs(k) = tnorm;
|
|
end
|
|
xs = xs(:, 1:k);
|
|
gs = gs(:, 1:k);
|
|
end
|
|
|
|
function y = at(f, xk)
|
|
syms x y;
|
|
y = double(subs(f, [x, y], [xk(1), xk(2)]));
|
|
end
|