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

Aproximace obecně

Aproximace

Obecně aproximace znamená přiblížení k něčemu, které je natolik blízké, že je použitelné (nedopouští se zásadní chyby). Například zlomek 22/7 je aproximací čísla π. Pro většinu aplikací takové nahrazení stačí a výpočet se výrazně zjednoduší. Nebo např (π^2) lze aproximovat číslem 10.

Aproximace funkce

Interpolace je velmi přísná a svazující v tom, že hledaná funkce musí procházet zadanými body. Víme, že interpolační polynomy vyšších stupňů se mohou nebezpečně vlnit a tím ne zcela přesně vystihovat celou situaci, avšak prochází zadanými body...

Aproximace upouští od pořadavku, aby hledaná funkce procházela body, ale musí je minout jen těsně, musí jim být blízko. To lze poměrně snadnou dosáhnout, když budeme měřit vzdálenost hledané křivky od daného bodu a tuto vzdálenost minimalizovat.

Na tomto místě není důležité dále rozebírat jak celý proces funguje, odkazuji čtenáře na studium metody nejmenších čtverců. Toto je nejčastější metoda pro hledání aproximačních funkcí a navíc dává dobré výsledky.

Definice vstupu pro hledání aproximace: množina bodů, které chceme proložit funkcí a od kterých se výsledná funkce bude jen málo vzdalovat a množina funkcí jejíž lineární kombinace bude hledaná funkce. Tuto množinu funkcí budeme nazívat bází.

Příklad

Najděte přímku a x + b, která nejlépe vystihuje následující body:

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

body//ListPlot

Je zřejmé, že přímky, která by procházela všemi body neexistuje, ale mi upouštíme od tohoto požadavku, a hledáme přímku, která bude od nich co nejméně vzdálena.

f=Fit[body,{1,x},x]

Show[{body//ListPlot,Plot[f,{x,-2,6}]}]

I když to není na první pohled zřejmé, nalezená přímka je ideální pro svůj účel. Nutno podotknout, že hledat přímku pro tyto body je nevhodné řešení.

Pokusme se najít kubickou funkci. Musíme tedy funkci Fit zadat správnou bázi:

fk=Fit[body,{1,x, (x^2),(x^3)},x]

Show[{Plot[fk,{x,-1,5}],ListPlot[body]}]

Porovnejte výsledek s interpolací. vznikne zajímavé porovnání. Funkce i graf.

Interpolujte dané body funkcí sinus a cosinus.

fsin=Fit[body,{1,Sin[x],Cos[x]},x]

Show[{Plot[fsin,{x,-1,5}],ListPlot[body]}]

Další příklad na přímku

Pro malý počet bodů, které jsou od sebe hodně rozházeny je proložení přímky nevhodné, viz předchozí příklady, ale je-li bodů mnoho, může přímka ukázat “trend” nebo být zjednodušním místo shluku bodů. Aproximujte následující množinu bodů:

SeedRandom[50];mn=Table[{x,x+RandomReal[{-5,10}]},{x,0,50,1.}]

mn//ListPlot

flin=Fit[mn,{1,x},x]

Show[{Plot[flin,{x,-10,60},PlotStyle->Red],ListPlot[mn]}]

Zkus si další funkce pro interpolaci této skupiny bodů.

Sbírka úloh

1/ Vysvětli jaký je principielní rozdíl mezi interpolací a aproximací.

2/ Aproximuj body {{1,1},{2,2.1},{3,3},{4,4.1}} postupě: přímkou, parabolou, odmocninou a logaritmem. Sleduj grafy nalezených funkcí.

3/

4/

5/

Zdroje

http://reference.wolfram.com/mathematica/ref/Fit.html