Упражнение 8.
Интерполиране с обобщени полиноми.

1 зад. Постройте тригонометричен полином τ(t) с период Т=2π, който интерполира таблицата:
({{t, 0, (π/3), ((5π)/6), ((4π)/3), ((11π)/6)}, {τ(t), 9, 11.1, 14.9, 12.9, 9}})
Постройте полинома p(t) и точките на една графика в интервала [0,4π].

τ[t_]:=(Subscript[a, 0])+(Subscript[a, 1])Cos[t]+(Subscript[a, 2])Sin[t]+(Subscript[a, 3])Cos[2t]+(Subscript[a, 4])Sin[2t]
sol = Solve[{τ[0]==9,τ[Pi/3]==11.1,τ[5Pi/6]==14.9,τ[4Pi/3]==12.9, τ[11Pi/6]==9},{(Subscript[a, 0]),(Subscript[a, 1]),(Subscript[a, 2]),(Subscript[a, 3]),(Subscript[a, 4])}];
τ[t_]=τ[t]/.sol[[1]];
plot1=Plot[τ[t],{t,0,4Pi}];
plot2 = ListPlot[{{0,9},{Pi/3,11.1},{5Pi/6,14.9},{4Pi/3,12.9},{11Pi/6,9}}];
Show[plot1,plot2]

2 зад. Дадено е просто махало:
https://learn.fmi.uni-sofia.bg/mod/resource/view.php?id=130889
Да се създаде анимация на махалото. За целта е въведена подходяща координатна система и в нея са дадени следните 5 сцени от движението на махалото:

({{, , , , }, {"t=0", "t=1", "t=2", "t=3", "t=4"}})

Упътване : За да анимираме махалото е достатъчно да можем да пресмятаме координатите на неговия център (x(t), y(t)), които са функции на времето. За целта ще построим 2 обобщени полинома x (t) и y (t), които  интерполират данните:
({{t, 0, 1, 2, 3, 4}, {x(t), 0, 0.5, 1, 0.5, 0}, {y(t), 0, -0.4, 0, -0.4, 0}})
  Понеже данните са периодични (с период T=4), то е подходящо да търсим тригонометричен полином. Обърнете внимание, че в момента данните не са в интервала [0,2π), което означава, че не е гарантирано, че съществува единствен полином, който ги интеролира. Поради това е необходимо да се направи смяна на променливата t, принадлежаща на интервала [0,4], в променливата (Subscript[t, 1]) в интервала [0,2π). Смяната, която е необходимо да се направи, е (Subscript[t, 1])=2πt/4 и тогава търсените полиноми трябва да интерполират данните:
  ({{(Subscript[t, 1]), 0, (π/2), π, ((3π)/2), 2π-0.01}, {x((Subscript[t, 1])), 0, 0.5, 1, 0.5, 0}, {y((Subscript[t, 1])), 0, -0.4, 0, -0.4, 0}})

xCoord[t1_]:=(Subscript[a, 0])+(Subscript[a, 1])Cos[t1]+(Subscript[a, 2])Sin[t1]+(Subscript[a, 3])Cos[2t1]+(Subscript[a, 4])Sin[2t1]
yCoord[t1_]:=(Subscript[b, 0])+(Subscript[b, 1])Cos[t1]+(Subscript[b, 2])Sin[t1]+(Subscript[b, 3])Cos[2t1]+(Subscript[b, 4])Sin[2t1]
xSol = Solve[{xCoord[0]==0,xCoord[Pi/2]==0.5,xCoord[Pi]==1,xCoord[3Pi/2]==0.5, xCoord[2Pi-0.01]==0},{(Subscript[a, 0]),(Subscript[a, 1]),(Subscript[a, 2]),(Subscript[a, 3]),(Subscript[a, 4])}];
ySol = Solve[{yCoord[0]==0,yCoord[Pi/2]==-0.4,yCoord[Pi]==0,yCoord[3Pi/2]==-0.4, yCoord[2Pi-0.01]==0},{(Subscript[b, 0]),(Subscript[b, 1]),(Subscript[b, 2]),(Subscript[b, 3]),(Subscript[b, 4])}];
xCoord[t_]=xCoord[2π/4 t]/.xSol[[1]];
yCoord[t_]=yCoord[2π/4 t]/.ySol[[1]];
(*тестваме дали получените полиноми удовлетворяват интерполационните условия*)
xCoord[{0,1,2,3,4}]
yCoord[{0,1,2,3,4}]

Animate[Graphics[{Circle[{xCoord[t],yCoord[t]},0.25],Line[{{xCoord[t],yCoord[t]},{0.5,1}}]},
				PlotRange->{{-0.25,1.25},{-0.75,1.1}}, Axes->True],{t,0,2Pi,0.1},AnimationRate->5]

3 зад. Дадени са точките
а) (0,1),(1,2), (2,3), ..., (10,11);
Б) (0,1), (1,2), (2,3), ..., (500, 501). 
За всяка една от подточките да се намери обобщен полином (Subscript[a, 0])+(Subscript[a, 1])x+(Subscript[a, 2])(x^2)+....+(Subscript[a, n])(x^n), който да интерполира точките, като за целта използвате функциите в Wolfram Mathematica Sum, Table и NSolve. Сравнете получените резултати с точното решение 1+x.

n=10;
poly10[x_]=Sum[(Subscript[a, i])x^i,{i,0,n}];
sol=NSolve[Table[poly10[i]==i+1 ,{i,0,n}],Table[(Subscript[a, i]),{i,0,n}]];
poly10[x_]=poly10[x]/.sol[[1]]

(*Понеже правилния отговор е 1+x, всъщност забелязвам много малки грешки*)

n=500;
poly500[x_]=Sum[(Subscript[a, i])x^i,{i,0,n}];
sol=NSolve[Table[poly500[i]==i+1 ,{i,0,n}],Table[(Subscript[a, i]),{i,0,n}]];
poly500[x_]=poly500[x]/.sol[[1]]
(*Сравнявайки с точното решение, се вижда, че полученият отговор е много по-различен. Основната причина за това е, че се натрупват грешки от закръгляване при решаването на тази система. Причината за това е, че матрицата на системата е много лоша (близка до особена матрица) и съответно при решаването на такива системи се получават много големи грешки. Затова и обикновено не се търси полином на Лагранж по метода на неопределените коефициенти. *)

4 зад. Напишете функция trigLagrange[nodes_,values_,x_],която да пресмята обобщен тригонометричен полином τ(x) по дадени възли nodes и стойности values, използвайки интерполационната формула на Лагранж.  В нея вместо да използвате  базисните полиноми на Лагранж, използвайте следния базис:
(Subscript[τ, k])(x)=((Sin[((x-(Subscript[x, 0]))/2)]...Sin[((x-(Subscript[x, k-1]))/2)]Sin[((x-(Subscript[x, k+1]))/2)]...Sin[((x-(Subscript[x, n]))/2)])/(Sin[(((Subscript[x, k])-(Subscript[x, 0]))/2)]...Sin[(((Subscript[x, k])-(Subscript[x, k-1]))/2)]Sin[(((Subscript[x, k])-(Subscript[x, k+1]))/2)]...Sin[(((Subscript[x, k])-(Subscript[x, n]))/2)])).
Тествайте функцията върху задача 1.

LangrangeBasis[nodes_,k_,x_]:=Product[If[k≠j,((Sin[((x-nodes[[j]])/2)])/(Sin[((nodes[[k]]-nodes[[j]])/2)])),1],{j,1,Length[nodes]}];
Langrange[nodes_,values_,x_]:=Expand[Sum[ values[[i]]*LangrangeBasis[nodes,i,x],{i,1,Length[nodes]}]];
(Subscript[τ, 1])[x_]:=Langrange[{0,Pi/3,5Pi/6,4Pi/3,11Pi/6},{9,11.1,14.9,12.9,9},x]//N

τ[t]-(Subscript[τ, 1])[t]//FullSimplify

Plot[{τ[t],(Subscript[τ, 1])[t]},{t,0,4Pi}]

Plot[{τ[t]-(Subscript[τ, 1])[t]},{t,0,4Pi}]