%=========================================================================
%                 APROXIMACE FUNKCE NA OKOLI BODU
%=========================================================================


%-------------------------------------------------------------------------
% function taylor_polynom(f, x0, polomer, max_stupen,zobraz_vse);
%
% Sestroji Tayloruv polynom stupne n (n=0,1,...,max_stupen)
% pro symbolicky zadanou funkci f v bode x0 
% na okoli <x0-polomer,x0+polomer>
% (pro zobraz_vse=1 zobrazi vsechny polynomy)
%-------------------------------------------------------------------------

taylor_polynom('sin(x)', 0, pi, 4, 1);
taylor_polynom('sin(x)', 0, pi, 4, 0);

taylor_polynom('sin(x)', 0.1, pi, 8, 1);
taylor_polynom('sin(x)', 0.1, pi, 8, 0);

taylor_polynom('1/x', 1, 0.95, 16, 1)
taylor_polynom('1/x', 1, 0.95, 16, 0)




%=========================================================================
%              APROXIMACE FUNKCE INTERPOLACNIM POLYNOMEM
%=========================================================================

%-------------------------------------------------------------------------
% function lagrangeuv_polynom(zobraz_vse,x,f);
%
% Sestroji Lagrangeuv interpolacni polynom 
% pro funkci zadanou tabulkou [x;f(x)]
%
% pro zobraz_vse=1 zobrazi vsechny dilci polynomy
% nejsou-li zadane vektory x,f => zadaji se mysi 
%-------------------------------------------------------------------------

x=[0 1 3];
f=[1 2 0];
lagrangeuv_polynom(1,x,f);

x=[0 2 4 7 9];
f=[2 5 3 4 5];
lagrangeuv_polynom(1,x,f);


lagrangeuv_polynom(1);

lagrangeuv_polynom;


%-------------------------------------------------------------------------
% function newtonuv_polynom(zobraz_vse,x,f);
%
% Sestroji Newtonuv interpolacni polynom 
%-------------------------------------------------------------------------

x=[0 1 -1 3];
f=[1 2 2 0];
newtonuv_polynom(1,x,f);

x=[0 1 3 6 8 10];
f=[1 4 5 4 3 4];
newtonuv_polynom(1,x,f);

newtonuv_polynom(1);

newtonuv_polynom;



%-------------------------------------------------------------------------
% function nevilluv_algoritmus(zobraz_vse,x,f,alfa);
%
% Vypocte hodnotu Newtonova interpolacniho polynomu v bode alfa 
% pro funkci zadanou tabulkou [x;f(x)]
%
% nejsou-li zadane vektory x,f => zadaji se mysi 
% neni-li zadano alfa => zada se rucne
% pro zobraz_vse=1 zobrazi vsechny dilci ukony
%-------------------------------------------------------------------------

x=[0 1 2 3 4];
f=[1 0.36788 0.13534 0.04979 0.01832];
alfa=1.8;
nevilluv_algoritmus(0,x,f,alfa);

nevilluv_algoritmus(1,x,f,alfa);


x =[0 1 5 6 8 9];
f=[1 4 5 4 2 2];
alfa=2;
nevilluv_algoritmus(0,x,f,alfa);

nevilluv_algoritmus(1,x,f,alfa);


nevilluv_algoritmus


%-------------------------------------------------------------------------
%                NEVYHODY INTERPOLACNICH POLYNOMU
%-------------------------------------------------------------------------

% Pri extrapolaci

x=-3:3;
f=sign(x).*0.001.*x;   
alfa=5;
%newtonuv_polynom(0,x,f);
nevilluv_algoritmus(1,x,f,alfa);

x=[ 0 2 4 7 9];
f=[ 2 1 1 2 2];
alfa=13;
nevilluv_algoritmus(1,x,f,alfa);



% Pro hodne zadanych bodu

x=1:8;
f=10*rand(size(x));
alfa=7.5;
nevilluv_algoritmus(1,x,f,alfa);

x=1:10;
f=0.05*rand(size(x));
alfa=0;
nevilluv_algoritmus(1,x,f,alfa);


% Pro aproximaci racionalni lomenne funkce

x=[0.01 0.027 0.125 0.343];
f=[100 37 8 3];
alfa=0.25;
nevilluv_algoritmus(1,x,f,alfa);

pomx=0.1:0.2:1.1;
x=pomx.^2;
f=1./x;
alfa=x(1);
nevilluv_algoritmus(1,x,f,alfa);


% Citlivost na vstupni data pri ekvidistantnich datech 
% (spatne podminena uloha) 

x=1:10;
f=zeros(size(x));
f(5)=0.0001;
lagrangeuv_polynom(0,x,f,0);

x=uzly_cebysev(1,10,10);
f=zeros(size(x));
f(5)=0.0001;
lagrangeuv_polynom(0,x,f,0);


uzly_cebysev(0,1,10,1);

uzly_cebysev(0,1,15,1);



%-------------------------------------------------------------------------
%                  APROXIMACE FUNKCE POMOCI SPLINE 
%-------------------------------------------------------------------------

x=1:7;
f=[3 8 1 7 2 4 3];
Da=0;Db=0;
kubicky_spline(x,f,Da,Db);

x=[0.01  0.05   0.25  1/3   1   ];
f=[100    20       4    3    1  ];
Da=0;Db=-1;
kubicky_spline(x,f,Da,Db);

x=[0 1 2 3  4 5 6 7 8  9 10];
f=[3 5 0 2 -4 0 2 2 -2  2  3];
Da=1;Db=1;
kubicky_spline(x,f,Da,Db);


kubicky_spline;




%=========================================================================
%            APROXIMACE FUNKCE VE SMYSLU NEJMENSICH CTVERCU
%=========================================================================

%-------------------------------------------------------------------------
% function l2_aproximace(x,f,stupen);
%
% Sestroji diskretni L2-aproximaci 
% pro funkci zadanou tabulkou [x;f(x)]
% pouzitim polynomu stupne stupen
%
% nejsou-li zadane vektory x,f => zadaji se mysi
%-------------------------------------------------------------------------

x=[0.5   0.8   0.9   1.1    1.2  ];
f=[2.25  0.72  0.33  -0.27  -0.48];
stupen=1;
l2_aproximace(x,f,stupen);

x=1:5;
f=[3 4 6 7 8];
l2_aproximace(x,f,1);

l2_aproximace(x,f,2);

l2_aproximace(x,f,3);

l2_aproximace(x,f,4);

l2_aproximace(x,f);

l2_aproximace;



%-------------------------------------------------------------------------
% function l2_aproximace_spojita(zobraz_vse,f,a,b,stupen);
%
% Sestroji spojitou L2-aproximaci pro funkci f=f(x) 
% na intervalu <a,b> pouzitim polynomu stupne stupen
%
% pri volbe zobraz_vse=1 zobrazi
% aproximace polynomy stupne 0 az do optimalniho stupne
%-------------------------------------------------------------------------

l2_aproximace_spojita(0,'sqrt(x)',0,1,1);

l2_aproximace_spojita(0,'sqrt(x)',0,1,2);

l2_aproximace_spojita(1,'sqrt(x)',0,1,4);

l2_aproximace_spojita(1,'sqrt(x)',0,1);



l2_aproximace_spojita(1,'tan(x)',-1.5,1.5,4);

l2_aproximace_spojita(0,'tan(x)',-1.5,1.5);



l2_aproximace_spojita(1,'exp(x)',-10,1,4);

l2_aproximace_spojita(0,'exp(x)',-10,1);




%=========================================================================
%              FOURIEROVA ANALYZA PRO PERIODICKE FUNKCE
%=========================================================================

%-------------------------------------------------------------------------
% function fourierova_analyza(zobraz_vse,x,f,stupen);
%
% provede diskretni Fourierovu analyzu 
% pro periodickou funkci zadanou tabulkou 
%
% stupen ... pocet bazovych funkci
%            ( pokud neni zadan stupen vezme 
%              maximalni mozny pocet bazovych funkci
%              odpovidajici poctu zadanych bodu )     
% uvazujeme ekvidistantni uzly x, 
% pricemz posledni bod nezadavame 
% (funkcni hodnota je stejna jako u prvniho bodu
%  a x-ovou souradnici lehko urcime, nebot 
%  uvazujeme ekvidistantni rozlozeni uzlu)
%-------------------------------------------------------------------------

x=[0  pi/2 pi 3*pi/2];
f=[12  -4   0    4  ];
fourierova_analyza(1,x,f);


x=0:pi/6:2*pi-pi/6;
f=cos(x)-sin(x/3);          
fourierova_analyza(1,x,f);
fourierova_analyza(1,x,f,3);
fourierova_analyza(0,x,f,3);
fourierova_analyza(0,x,f);


x=0:pi/5:2*pi-pi/5;
f=1./sin(1+sin(x));
fourierova_analyza(1,x,f);


N=4;
x=1:2*N-1;
f=sign(N-x);
fourierova_analyza(1,x,f);

N=8;
x=1:2*N-1;
f=sign(N-x);
fourierova_analyza(1,x,f);

N=16;
x=1:2*N-1;
f=sign(N-x);
fourierova_analyza(1,x,f);







