({{Číslo projektu, CZ.1.07/1.1.36/02.0066}, {Autor, Ladislav Kašpárek}, {Předmět, Programovací metody}, {Téma, interpolace a derivace}, {Metodický pokyn, výkladový text s ukázkami}})

Interpolace polynomem a defivace funkce

Pokračujme ve výkladu o interpolacích pomocí polynomu, ale myšlenku poněkud rozšíříme. Dále budeme interpolovat naše 4 známé body:

body={{-1,3},{1,-2},{2,2},{5,-1}}

body//ListPlot

Protože již známe mechanismus interpolace polynomem (vede na soustavu lineárních rovnic), snadno zjistíme že Mathamatica má funkci, která totéž a se stejným výsledkem dělá také, dále se o její služby také budeme zajímat. Je to funkce: InterpolatingPolynomial.

fint[x_]=InterpolatingPolynomial[body,x]//Expand

Plot[fint[x],{x,-1,5}]

Všechno dohromady (body a graf).

Show[Plot[fint[x],{x,-1,5}],ListPlot[body,PlotStyle->Directive[Red,PointSize[Large]]]]

Rozšíření interpolačního polynomu o první derivaci

Pozorujte následující obrázek a správně si uvědomte kde a co vidíte: jsou naznačeny tečny v zadaných bodech.

Jak byly vypočteny? Zkuste si je vypočítat ručne na papíře, výsledek kontrolujte s vypočtem Mathematicy.

Show[Plot[fint[x],{x,-1,5}],Table[Plot[(fint'[bod[[1]]])x+(q/.(Solve[(fint'[bod[[1]]])(bod[[1]])+q==bod[[2]],q]//Flatten)),{x,bod[[1]]-1/3,bod[[1]]+1/3},PlotStyle->Directive[Green,Thick]],{bod,body}],ListPlot[body,PlotStyle->Directive[Red,PointSize[Large]]]]

Následuje výsledek pro první dervaci pro bod [2,2].

fint'[body[[3]][[1]]]//N

Rozšíření interpolace o znalosti první derivace v jednom bodě

Řekněme, že z povahy úlohy víme, že funkce v bodě [2,2] nemá derivaci (směrnici tečny) 4,45 (což je poměrně strmý růst – zdůvodni proč se jedná o růst!), ale má dervaci fint’[2]=1/2.

Předchozí věta (otázka) v sobě skrývá odpověď. Je potřeba naši soustavu rovnic rozšířit o derivaci hledaného polynomu. Pozor na následující úvahu!

Polynom, který hledáme zderivujeme: f'(x)=3a (x^2)+2 b x+c a ze zadání víme, že má být rovna 1/2. Pokud takovou rovnost přidáme ke stávající soustavě získáme 5 rovnic pro 4 neznámé! To bude problém, pravděpodobně nebude mít řešení.

Solve[{3==a (((-1))^3)+b (((-1))^2)+c(-1)+d,-2==a (1^3)+b (1^2)+c (1^1)+d,2==a (2^3)+b (2^2)+c (2^1)+d,-1==a (5^3)+b (5^2)+c (5^1)+d,3a((2^2))+2b(2)+c==1/2},{a,b,c,d}]

Řešení opravdu nexistuje, jedná se o přezadanou soustavu rovnic. Závěr: funkce třetího stupně, která by vyhovovala všem požadavkům (průchod 4mi body a zadána derivace v jednom z nich) neexistuje. Polynom třetího stupně nedává prostor pro tak přísné podmínky.

Pokusme se navrhnout nějaké rozšíření, aby bylo možné všechny podmínky splnit, nejlépe s jednoznačným řešením... Použijeme polynom 4. stupně, budeme hledat:

({{({{f(x)=p (x^4)}})+q (x^3)+r (x^2)+s x+t}})

s její derivací: f'(x)=4p (x^3)+3q (x^2)+2r x+s. Dosaďme, sestavme soustavu 5ti rovnic o pěti neznámých a příslušnou funkci 4. stupně. Nyní budeme postupovat ručně, celý proces lze automatizovat, ale to není smyslem hry (jsou dvě možnosti: 1/ naprogramovat vlastní funkci, nebo použít vestavěnou InterpolatingPolynomial).

Solve[{p(((-1))^4)+q(((-1))^3)+r(((-1))^2)+s(-1)+t==3,p(((1))^4)+q(((1))^3)+r(((1))^2)+s(1)+t==-2,p(((2))^4)+q(((2))^3)+r(((2))^2)+s(2)+t==2,p(((5))^4)+q(((5))^3)+r(((5))^2)+s(5)+t==-1,4p(((2))^3)+3q(((2))^2)+2r(2)+s==1/2},{p,q,r,s,t}]

Sestavme příslušnou funkci a ověřme zda body vyhovují i derivace.

fintd[x_]=(95/216)(x^4)-(197/54)(x^3)+(523/72)(x^2)+(31/27)x-(389/54)

fintd[{-1,1,2,5}]

fintd'[2]

Ano všechny zadané podmínky jsou splněny, můžeme vykreslit graf:

Show[Plot[fintd[x],{x,-1,5}],Table[Plot[(fintd'[bod[[1]]])x+(q/.(Solve[(fintd'[bod[[1]]])(bod[[1]])+q==bod[[2]],q]//Flatten)),{x,bod[[1]]-1/3,bod[[1]]+1/3},PlotStyle->Directive[Green,Thick]],{bod,body}],ListPlot[body,PlotStyle->Directive[Red,PointSize[Large]]]]

Graf nalezené funkce prochází zadanými body a v bodě [2,2] má směrnici 1/2.

Interaktivní model, kde lze měnit první derivaci v jednom bodě.

Stejný výsledek jako náš postupný ruční výpočet dává i funkce InterpolatingPolynomial. To je důkaz, že náš i Wolfram postup je stejný a snad i správný.

InterpolatingPolynomial[{{-1,3},{1,-2},{{2},2,1/2},{5,-1}},x]//Expand

Následuje interaktivní model, kde je jedinný proměnný paramatr, kterým se mění hodnota první derivace v bodě [2,2]. Sledujte jak funkce reaguje na její změnu, zdůvodněte co vidíte, když se její hodnota pohybuje v blízkosti nuly nebo je přesně 0. Ostatní body jsou pevné a jejich dervace plynou z interpolované funkce. (mění se??? a proč)

Manipulate[(fintdm[x_]=InterpolatingPolynomial[{{-1,3},{1,-2},{{2},2,sm},{5,-1}},x];Show[Plot[fintdm[x],{x,-1,5}],Table[Plot[(fintdm'[bod[[1]]])x+(q/.(Solve[(fintdm'[bod[[1]]])(bod[[1]])+q==bod[[2]],q]//Flatten)),{x,bod[[1]]-1/3,bod[[1]]+1/3},PlotStyle->Directive[Green,Thick]],{bod,body}],ListPlot[body,PlotStyle->Directive[Red,PointSize[Large]]]]),{{sm,.5,"derivace"},-10,10}]

Rozšíření interpolace o znalosti první derivace obecně

Sestavit ukázku, kde by bylo možné měnit všechny první derivace v zadyných bodech není problém, ale je nutné si uvědomit, že poroste stupeň nalezeného polynomu a funkce bude mít snahu se hodně “vlnit”. Sestavte množinu bodů, kde by bylo možné toto vlnění udržet pod kontrolou (nápověda: parabola).

Experimentuje s následujícím modelem:

Manipulate[(fintdm[x_]=InterpolatingPolynomial[{{{-1},3,sm1},{{1},-2,sm2},{{2},2,sm3},{{5},-1,sm4}},x];Show[Plot[fintdm[x],{x,-1,5},PlotRange->{{-1.1,5.1},{-15,15}}],Table[Plot[(fintdm'[bod[[1]]])x+(q/.(Solve[(fintdm'[bod[[1]]])(bod[[1]])+q==bod[[2]],q]//Flatten)),{x,bod[[1]]-1/3,bod[[1]]+1/3},PlotStyle->Directive[Green,Thick]],{bod,body}],ListPlot[body,PlotStyle->Directive[Red,PointSize[Large]]]]),{{sm1,2,"derivace"},-10,10},{{sm2,-2,"derivace"},-10,10},{{sm3,4,"derivace"},-10,10},{{sm4,7,"derivace"},-10,10}]

Shrnutí

Interpolaci polynomem můžeme rozšířit o znalosti hodnot první resp. dalších derivací. (polynomy se snadno derivují). Tato vlastnost dává větší kontrolu nad výslednou funkcí. 
Sestavit polynom lze ručně (pomocí řešení soustavy rovnic), nebo použít vestavěnou funkci systeému Mathematica.

Úlohy

1/ Najdi interpolační polynom pro body [-4,2], [-1,-1], [2,7], [3,-1], [5,0]. 
1a/ ručně a také pomocí vestavěné funkce, výsledky porovnej
2/ najdi si 5 bodů na parabole (x^2)-1 a sestav interpolační polynom, porovnej jej spůvodní parabolou.
2a/ totéž co v př 2, avšak vol 4 body u sebe a pátý “daleko” od nich.
3/ příklad č1 rozšiř o derivaci v bodě -1, nastav ji na -1

Zdroje

http://reference.wolfram.com/mathematica/ref/InterpolatingPolynomial.html
http://demonstrations.wolfram.com/InterpolatingPolynomial/