%% TMA671 Lösning av uppgift L.2.44
% Under storgruppsövningen som hölls onsdagen den 28e Mars 2018
% så demonstrerades uppgift 44 i Kapitel 2 i Linjär Algebra 
% boken. Uppgiften handlar om att approximera en linjär funktion
% med hjälp av dess Fourierserie, och här är ett litet skript för
% att illustrera hur antalet termer påverkar nogrannheten hos
% approximationen.
% Programmet är skrivet av Johannes Borgqvist

%% Beräkning av analytisk lösning
% Variabel för funktionen
t = linspace(0,2*pi,400)';
% Den analytiska funktionen vi vill approximera
f = 2*pi-t;


%% En snygg loop för att interagera med användaren
nuOfTerms = input('Ange antal termer i Fourierserien:\n');
% Vi introducerar lite index för att avbryta "while"-loopen
irritationTooMuch = 4;
breakedOnce = false;
terminationIndex = 0;
% "While"-loopen pågår tills användaren anger ett korrekt antal termer
while ~isnumeric(nuOfTerms)
    nuOfTerms = input('Igen...Ange antal termer i Fourierserien:\n');
    while floor(nuOfTerms) ~= nuOfTerms
        nuOfTerms = input('Igen...Ange antal termer i Fourierserien:\n');
        if terminationIndex > irritationTooMuch
            disp('Tyvärr du misslyckades, programmet terminerar!');
            breakedOnce = true;
            break;
        end
        terminationIndex = terminationIndex + 1;
    end
    terminationIndex = terminationIndex + 1;    
    if terminationIndex > irritationTooMuch && breakedOnce == false
        disp('Tyvärr du misslyckades, programmet terminerar!');
        break;
    end
end

%% Beräkning av Fourier-serie
% Beräkna Fourier serien med hjäp av två loopar:
% första över antalet tidpunkter och andra för att beräkna summan
% vid varje tidpunkt
Fourier = ones(size(f));
for index = 1:length(Fourier)
    Fourier(index) = pi;
   for innerIndex = 1:nuOfTerms
        Fourier(index) = Fourier(index) + (2/innerIndex) * sin(innerIndex * t(index));  
   end
end


%% Plottning av approximation och analytisk lösning
axisDelta = 0.7;
figure(1)
clf
plot(t,f,'red')
hold on
plot(t,Fourier,'blue')
grid on
axis([0, 2*pi + axisDelta/10, 0 - axisDelta, 2*pi + axisDelta])
hold off
leg = legend('$f(t)=2\pi-t$','$\hat{f}_{n}(t)=\pi+2\sum_{i=1}^{n}\frac{1}{i}\,\mathrm{sin}\left(i\cdot t\right)$');
set(leg,'interpreter','latex','Location','NorthEast','Fontsize',40)
ax = gca;
xtickVector = [0, pi/2, pi, ((3*pi)/(2)), 2*pi];
set(ax,'Ticklabelinterpreter','latex','Fontsize',40,'XTick',xtickVector,...
    'XTickLabel',{'$0$','$^{\pi}/_{2}$', '$\pi$','$^{3\pi}/_{2}$','$2\pi$'},...
    'YTick',xtickVector,...
    'YTickLabel',{'$0$','$^{\pi}/_{2}$', '$\pi$','$^{3\pi}/_{2}$','$2\pi$'})
xlabel('Variabel, $t$','interpreter','latex','Fontsize',40)
ylabel('Funktionsv\"{a}rde, $f(t)$','interpreter','latex','Fontsize',40)
titleStr = {'\textbf{TMA671 Uppgift L.2.44}','Datum: 2018-03-28, Skriven av: Johannes Borgqvist',...
    ['\textit{Fourierapproximation av ordning:}$\;\;\;n=',num2str(nuOfTerms),'$'],...
    };
title(titleStr,'interpreter','latex','Fontsize',50)

