CurrentValue[$FrontEnd,CellContext]=Notebook;

Nejprve rovnice, kterou řešíme

rovnice = D[f[x],x,x]==-Abs[Cos[Pi x]] f[x]
okrajPodminky = f[-1]==1 && f[1]==1

Pro |cos(x)| na pravé straně už nenajdeme analytické  řešení a tak zkusíme použít to, co nám Mathematica dá numericky
To se hodí při zkoumání přesnosti numerického řešení

NDSolve[ rovnice && okrajPodminky,f[x],{x,-1,1}]
reseni =f[x]/.%[[1]];
Plot[ reseni,{x,-1,1},PlotTheme->"Detailed"]

Nyní budeme hledat aproximaci řešení s použitím polynomů
Teorie říká, že máme vzít Čebyševovy polynomy 
Jak moc je konkrétní polynom zastoupen v řešení představuje neznámé (Subscript[a, 0])... (Subscript[a, n])

nMax =8;
obecnyPolynom = Sum[a[k]ChebyshevT[k,x],{k,0,nMax}]
nezname = Table[a[k],{k,0,nMax}]

Dosazením polynomu do rovnice získáme rovnici, kterou by měl splňovat
Polynom musí splňovat i okrajové podmínky

residual = rovnice /. f->Function[x,Evaluate@obecnyPolynom]
okrPodminkyProa = okrajPodminky /. f->Function[x,Evaluate@obecnyPolynom]

Máme 2 okrajové podmínky, ale n+1 neznámých (Subscript[a, 0])... (Subscript[a, n])
Potřebujeme n+1 rovnic, tedy n-1 vyrobíme dosazením vhodných x do residualu
Těmto bodům se říká kolokační a celé metodě se říká pseudospektrální metoda řešení ODE

Jakmile máme  dost rovnic, vyřešíme je

pocetNeznamych == Length[nezname]
nC = nMax-1;

colocationPoints = Table[ Cos[  (2k+1) Pi/2 / nC ],{k,0,nC-1}]//N
rovnicProOkrajovePodminky == Length @ okrPodminkyProa
pocetBoduX == Length[colocationPoints]

(* dame dohromady vsechny rovnice *)
residual/. ({x->#}&)/@ colocationPoints;
(%/.List -> And) && okrPodminkyProa;
(* a vyresime je *)
numReseniA = Solve[%,nezname]

Protože je přesné řešení sudá funkce, vycházejí lichá a hodně malá, lze se jich zbavit funkcí Chop

fNum = obecnyPolynom/.numReseniA//Chop

Můžeme nakreslit přesné a přibližné řešení a také nalézt odhad maximální odchylky

Plot[ {fNum,reseni},{x,-1,1},PlotTheme->"Detailed",PlotLegends->{"približně","přesně"},ImageSize->Large]
MaximalniChyba[n==nMax] == (Table[fNum-reseni,{x,-1,1,1/1000}]//Abs//Max)

Pseudospektrální metoda za příznivých okolností vykazuje chybu srovnatelnou s velikostí posledních  členů rozvoje. Viz též graf Čebyševových polynomů.

posledniClenyRozvoje == {a[nMax-2],a[nMax-1],a[nMax]}/.numReseniA

Problém 2.2. Namalujte s pomocí funkce ListLogPlot závislost | (Subscript[a, k])|  na indexu k pro dosatečně velké nMax tak jako je na grafu níže. Takovýto graf říká kolik členů rozvoje zhruba potřebujeme, abychom rovnici vyřešili s danou přesností.

hezka = {1.0946013210986179`,1.09`*^-16,0.12654786824133807`,3.6`*^-18,0.03583332869658255`,1.0`*^-18,0.004243565111611562`,1.03`*^-18,0.0003913363726288022`,4.2`*^-19,0.00003770373947508616`,6.45`*^-19,3.4054652415925`*^-6,1.1`*^-18,2.737466619933`*^-7,1.1`*^-18,2.0605465750519`*^-8,1.97`*^-19,1.4972040361437675`*^-9,2.9`*^-19,1.04260160742`*^-10,5.68`*^-19,6.924220655027`*^-12,9.46`*^-20,4.435206923`*^-13,2.89`*^-20,2.559958525`*^-14};
oskliva = Abs@nezname/.numReseniA[[1]];
ListLogPlot [ {hezka,oskliva},Frame->True,GridLines->Automatic,PlotRange->Full,FrameLabel->{k,"|(Subscript[a, k])|"},BaseStyle->14]