%% TMA671 Lösning av uppgift N.2.44
% Under storgruppsövningen som hölls onsdagen den 23e April 2018
% så demonstrerades uppgift 15 i Kapitel 2 i Numerisk Analys
% boken. Uppgiften handlar om att approximera Runges funktion
% dels med hjälp av interpolation med dessutom med splines
% Programmet är skrivet av Johannes Borgqvist
clc,clear;
% Definiera en kontinuerlig variabel med 100 punkter
xKont = linspace(-1,1,1000)';
%% Förarbete: generella funktioner
n = 100;
% Allokera minne for nio punkter och dess data
x = zeros(n+1,1); % Punkter
y = zeros(n+1,1); % Data
% Generera uniformt fördelade punkte i intervallet [-1,1]
for i = 0:n
    x(i+1,1) = -1 + (2/n) * i;
end
% Skapa ett handtag för Runges funktion
R =@(t) ((1)./(1+(25.*t.^2)));

%% Deluppgift (a): Generera datapunkter och plotta dessa
y = R(x);
% Vi plottar i vår Figur
fig = figure(1);
%fig = figure('units','normalized','outerposition',[0 0 1 1],...
%    'PaperPositionMode','auto');
clf
plot(x,y,'*black','Linewidth',10)
hold on
%% Deluppgift (b): Anpassa ett polynom av grad 8 med polyfit i Matlab, rita ut polunomet med polyval och plot
% Anpassa polynomet av grad 8 och få ut koefficienterna
c = polyfit(x,y,100);
% Få ut värdet på polynomet med polyval
yInterpolation = polyval(c,xKont);
% Plotta interpolationspolynomet av grad 8
plot(xKont,yInterpolation,'red','Linewidth',2);
hold on

%% Deluppgift (c): Anpassa en spline till punkterna med spline och plotta
% Anpassa en kubisk spline
ySpline = spline(x,y,xKont);
plot(xKont,ySpline,'blue','Linewidth',2);
hold on
%% Deluppgift (d): Vilken av anpassningarna stämmer bäst överens med den underliggande funktionen
% Vi definierar den underliggande funktionen med många mätpunkter
rungeRiktig = R(xKont);
% Vi definierar interpolationsfelet med hjälp av euklidisk längd
felInterpolation = sqrt((rungeRiktig - yInterpolation)' * (rungeRiktig - yInterpolation));
% Vi definierar splinefelet med hjälp av euklidisk längd
felSpline = sqrt((rungeRiktig - ySpline)' * (rungeRiktig - ySpline));


% Vi plottar även den riktiga kurvan
plot(xKont,rungeRiktig,'--black','Linewidth',2);
hold on



% Vi skriver ut detta i våra legends så att vi får svaret på frågan
leg = legend('M\"{a}tdata',...
    ['Fel interpolation$=',num2str(felInterpolation),'$'],...
    ['Fel spline$=',num2str(felSpline),'$'],...
    ['Runges funktion $R(x)$']);
% Snygga till legend
set(leg,'interpreter','latex','Fontsize',30,'Location','South');








%% Städa upp och fixa till plotten ordentligt
grid on
set(gca,'Ticklabelinterpreter','latex','Fontsize',20)
axis([-1,1,-1.5,1.5])
%axis([-1,1,-12,5])
xlabel('Variabel, $x$','interpreter','latex','Fontsize',40)
ylabel('Funktionsv\"{a}rde, $f(x)$','interpreter','latex','Fontsize',40)
titleStr = {'\textbf{TMA671 Uppgift N.3.15}','Datum: 2018-04-23, Skriven av: Johannes Borgqvist',...
    ['\textit{Approximationer av Runges funktion av ordning:}$\;\;\;n=',num2str(n),'$'],...
    };
title(titleStr,'interpreter','latex','Fontsize',50)
%print(fig, '-depsc', '-r300', ['UppgiftN215Datum20180419with',num2str(n),'Nodes.eps'])
