%% TMA671 Lösning av uppgift N.7.10
clear;
% Under storgruppsövningen som hölls onsdagen den 21e Maj 2018
% så demonstrerades uppgift 10 i Kapitel 7 i Numerisk Analys
% boken. Uppgiften handlar om att minimera en konvex funktion 
% f:R^2->R med hjälp av Newtons metod.
% Programmet är skrivet av Johannes Borgqvist

%% Almänna saker för uppgiften
% Funktion som skall minimeras
f = @(x,y) (0.5.* (x.^2 - y).^2) + (0.5 .* (1 - x) .^2);
% Definiera minimipunkt 
xMin = [1; 1];
% Definiera gradient
gradF =@(x,y) [(2.*x.^3) + ((1-2.*y).* x) - 1;...
                y - x.^2];
% Definiera Hessianen
hessCol1 = @(x,y) [((6.*x.^2)-(2.*y) + 1);...
            (-2.*x)];% Kolonn 1
hessCol2 = @(x,y) [(-2.*x);...
            (1)]; % Kolonn 2        
% Definiera en startgissning
x0 = [2; 2];

% Första iteration
iteration = 0;

% Skriv ut iteration 0
fprintf('====================================================================\n\n');
fprintf('Iteration\t\tx\t\tf(x,y)\t\tAvstånd\n\n');
fprintf('====================================================================\n\n');
fprintf('%d\t\t(%0.2f,%0.2f)\t\t%0.4f\t\t%0.4f\n\n',...
    iteration,x0(1),x0(2),f(x0(1),x0(2)),sqrt((x0-xMin)'*(x0-xMin)));


%% Iteration 1: Vi tar ett steg med Newton Raphson
% Uppdatera iterationen
iteration = iteration + 1;
% Beräkna stegriktning
s = -gradF(x0(1),x0(2));
% Beräkna Hessianen
H = [hessCol1(x0(1),x0(2)), hessCol2(x0(1),x0(2))];
% Beräkna stegriktningen
p = H\s;
% Beräkna steglängden
alpha = ((s' * p) /(p'*(H*p)));
% Uppdatera vår startgissning
x1 = x0 + alpha*p;
% Skriv ut
fprintf('%d\t\t(%0.2f,%0.2f)\t\t%0.4f\t\t%0.4f\n\n',...
    iteration,x1(1),x1(2),f(x1(1),x1(2)),sqrt((x1-xMin)'*(x1-xMin)));

%% Iteration 2: Vi tar ett steg med Newton Raphson
% Uppdatera iterationen
iteration = iteration + 1;
% Beräkna stegriktning
s = -gradF(x1(1),x1(2));
% Beräkna Hessianen
H = [hessCol1(x1(1),x1(2)), hessCol2(x1(1),x1(2))];
% Beräkna stegriktningen
p = H\s;
% Beräkna steglängden
alpha = ((s' * p) /(p'*(H*p)));
% Uppdatera vår startgissning
x2 = x1 + alpha*p;
% Skriv ut
fprintf('%d\t\t(%0.2f,%0.2f)\t\t%0.4f\t\t%0.4f\n\n',...
    iteration,x2(1),x2(2),f(x2(1),x2(2)),sqrt((x2-xMin)'*(x2-xMin)));

%% Plottar
% number of elements
nuOfEle = 100;
% Define the boundaries
minX = 0.8; maxX = 2.5; minY = 0.3; maxY = 3.4;
% Define the function mesh
[functionMesh,xMesh,yMesh] = meshGenerator(f,minX,maxX,minY,maxY,nuOfEle); 


fig = figure('units','normalized','outerposition',[0 0 1 1],...
     'PaperPositionMode','auto');
%figure(1)
clf
contourf(xMesh,yMesh,functionMesh)
colormap jet
cb = colorbar;
%cb.Label.Interpreter = 'latex';
set(cb,'Ticklabelinterpreter','latex','Fontsize',20)
hold on
p1 = plot(xMin(1),xMin(2), '*','Color',[1, 99/255 ,71/255], 'MarkerSize', 30, 'LineWidth', 3);
hold on
p2 = plot([x0(1); x1(1); x2(1)],[x0(2); x1(2); x2(2)], '*red', 'MarkerSize', 30, 'LineWidth', 3);
hold on
p3 = plot(x1(1),x1(2), '*green', 'MarkerSize', 30, 'LineWidth', 3);
hold on
p4 = plot(x2(1),x2(2), '*magenta', 'MarkerSize', 30, 'LineWidth', 3);
hold off
axis([minX, maxX, minY, maxY])
set(gca,'Ticklabelinterpreter','latex','Fontsize',20)
leg = legend([p1,p2,p3,p4],'Minimum','Startgissning','Iteration 1','Iteration 2');
set(leg,'interpreter','latex','Fontsize',30,'Location','NorthWest')
xlabel('$x$','interpreter','latex','FontSize',40)
ylabel('$y$','interpreter','latex','FontSize',40)
%clabel('$f\left(x,y\right)$','interpreter','latex','FontSize',40)
cb.Label.String = '$f\left(x,y\right)$';
cb.Label.Interpreter = 'latex';
cb.Label.FontSize = 40;
titleStr = {'\textbf{TMA671 Uppgift N.7.10}','Datum: 2018-05-21, Skriven av: Johannes Borgqvist',...
    ['\textit{Minimering med Newtons metod:}'],...
    '$f(x,y)=\frac{1}{2}\left(x^2-y\right)^2+\frac{1}{2}\left(1-x\right)^{2}$'
    };
title(titleStr,'interpreter','latex','Fontsize',50)
print(fig, '-depsc', '-r0', 'UppgiftN710Datum20180521.eps')


fprintf('====================================================================\n\n');
