Rozvinutí funkce do Maclaurinova rozvoje 1.1 Úvod Na přednáškách z matematické analýzy mě zaujala teorie o mocninných řadách a rozvojích, kde jsem zjistil, že každá vhodná funkce lze rozvinout do nekonečné mocninné řady. Chtěl jsem vyzkoušet, jak postupně vypadá graf polynomu Maclaurinova rozvoje libovolné funkce pro několikátý částečný součet dané řady. Naprogramoval jsem tedy funkci, která by na základě libovolně zadané, avšak spojité a diferencovatelné do určitého řádu, vykreslí a animuje postupně se zlepšující polynomické křivky, které mohou aproximovat graf dané funkce. Během programování jsem však zjistil, že se dá o takové funkci při doprogramování dalších funkcí zjistit i něco o oboru konvergence nebo zbytku po Taylorově polynomu. 1.2 Teorie V úvodu jsem použil slovo vhodná funkce, to je v našem případě taková funkce, která je nekonečně diferencovatelná v bodě 0 a je zároveň analytická. Taková funkce se bude moci rozvinout do Maclaurinovy řady a zároveň může platit, že n-tý částečný součet takové řady v limitě pro n přejde do rovnosti s danou funkcí na svém oboru konvergence. K získání explicitního předpisu takové řady lze buď funkci převést na již nějakou známou Maclaurinovu řadu, kde na oboru konvergence budeme moci využít pravidel derivování a integrování po členu i v případě nekonečné varianty, jelikož jde vždy o mocninnou řadu a nebo zjistit obecný předpis pro n-tou derivaci funkce v bodě 0. Ne vždy se to však může podařit. Pro funkce ve tvaru součinu, nebo mocniny je velice obtížné takový předpis najít, a proto se musí rozvoj spočítat z definice. Z definice sestavíme n-tý částečný součet Maclaurinovy řady, díky napočítání hodnoty i-té derivace funkce v bodě 0 pro všechna * +. Ručně by takové počítání bylo velice náročné, ale díky tomu, že ve vyzkoušených případech půjde vždy o derivaci elementární funkce, nebude pro Matlab problém vypočíst derivaci sám a do ní dosadit. Jakmile máme napočítané všechny ( ) ( ) ( ) koeficienty a i tak, že vždy ( ) ( ). Potom sestavíme ( ) ( ) Nyní již je vše spočítáno k tomu, aby se zkonstruoval n-tý částečný součet Maclaurinovy řady, provádí se to následujícím způsobem: ( ) Je nyní vidět, proč bylo výhodné zvolit si právě rozvoj v bodě 0. Jde o mocninnou řadu se středem právě v bodě 0 a tudíž, pokud bude mít pro n konečný součet, bude to vždy jen 1
pro taková x, která jsou z oboru konvergence dané řady a tento obor bude tím pádem vždy interval se středem v bodě 0 nebo jednoprvková množina. V programu vždy půjde vykreslit prvních pár členů takového rozvoje (prvních 10, 20, 1000), ale vždy nám v mocninné řadě zbyde nějaký zbytek, což bude řada začínající od n+1 členu pokračující do nekonečna: ( ) ( ) Výraz označený R(n+1) se nazývá zbytek po Maclaurinově polynomu. Platí, že součet řady se rovná přímo té funkci, pokud platí, že ( ) Takovou limitu bez znalosti všech členů rozvoje nespočítáme. Dá se však předpokládat, že pokud program spočítá dostatečně mnoho takových R(n+1) pro různá n a tato posloupnost bude monotónní a klesající k nule pro jisté x, bude také toto x v oboru konvergence dané řady, tj. budeme moci napsat rovnítko mezi funkci a řadu. V programu jsou dvě možnosti, jak právě tento obor konvergence zjistit. Obě se váží zvolení velkého počtu iterací (tj. čísla n) a tudíž i experimentální určení této vlastnosti z chování funkce: - graficky částečné součty vykreslovat tak, že již pro nějaké hodnoty se při velkém počtu kroků nebude přibližovat grafu zadané funkce - číselně vytvoření posloupnosti (( ( )) a z jejích vlastností vykoukat, jestli je opravdu monotónní a jestli se koeficienty a i x i opravdu blíží nule Je tedy více možností, jak studovat daný rozvoj včetně určení jeho oboru konvergence a analýzy konvergence posloupnosti jeho zbytku R. Jediná nevýhoda je, že nikdy neurčíme krajní body oboru konvergence, jelikož vykreslování nikdy nebude přesné natolik, aby byl takový rozdíl poznat. 1.3 Popis jednotlivých úkonů programu Funkce maclaurinuv() na vstupu dostane předpis funkce deklarovaný za pomoci symbolické proměnné x, definiční obor (tedy vlastně vždy jen množinu prvků reprezentovaných maticí s nějakým počátečním bodem, krokem, a konečným bodem. Poslední položkou ve vstupu je počet iterací, tj. jaký n-tý částečný součet má postupně vykreslit. Funkce vždy spočítá koeficienty popsané v teorii a i, sestaví jeden sčítanec, který potom přidá do funkčních hodnot aktuálně sestavovaného polynomu a vypíše také funkční předpis takového polynomu. Na dalším obrázku je vidět, jak ve skutečnosti výpis programem vypadá v jedné z jeho částí. 2
Jde o obrázek animace z šesté iterace aproximace funkce ( ) ( ) na intervalu ( ) Pro tento příklad byl vstup maclaurinuv(x*sin(x)+1,-2*pi:pi/30:2*pi,9) Ještě než uvedu samotnou implementaci tak popíši, co všechno program dokáže vypsat a vykreslit. Do názvu grafu vždy přiřadí název funkce a také postupně konstruuje Maclaurinovu řadu v dolní části okna tak, že vždy vypíše nenulové členy daného rozvoje až do i v i-té iteraci. Barevně je vždy rozlišena zadaná funkce a její polynomická aproximace. Graf obsahuje legendu v pravé dolní části, nicméně barvy se během vykreslování nedají změnit. To by se dalo vyřešit tím, že by se do vstupu ještě přidaly parametry pro barvu, avšak vzhledem k tomu, že původní tři parametry jsou již dost vyčerpávající pro zadání, tak jsem zvolil takové barvy napevno, jelikož je z nich pěkně vidět, kdy je již aproximace v dobré shodě se zadáním a kdy ještě ne. Vzhledem k přehlednosti jsem zvolil jak vykreslení obou souřadnicových os (černou barvou) tak i přidání mřížky do výsledného grafu. Program také dokáže vyrobit animované video ve formátu.avi k přehrání v běžném přehrávači médií. 3
1.4 Program function []= maclaurinuv(funkce,rozsah,pocetiteraci) %nastavení videa, názvu souboru; počet snímků za sekundu byl %zvolen tak, aby rychlostně odpovídal postupnému vykreslování %na obrazovce vidobj = VideoWriter('Taylor.avi'); vidobj.framerate=1; open(vidobj); %deklarujeme symbolickou funkci a její zálohu pro vykreslení syms x; y = funkce; y_=y; %funkční hodnoty zadané funkce pole = subs(y,rozsah); %funkční hodnoty aproximace v jednotlivých bodech definičního oboru hodnoty_y=zeros(size(rozsah)); %iterační index i = 0; % funkční předpis aproximace pro výpis polynomu do dolní části grafu z_=x*0; figure('color',[0.85 0.85 0.85],'Name','Maclaurinuv rozvoj'); %do předpisu aproximace se bude vkládat pouze prvních pár členů %daného polynomu, pro více jsou koeficienty an malá čísla a navíc %by se nemusel daný výpis vejít na obrazovku ppridani = 0; while i<=pocetiteraci an = subs(y,0)/gamma(i+1); % výpočet koeficientu an z = an*x.^i; % výpočet daného členu řady pretty(z); % úprava do pěkného zlomkového tvaru hodnoty_y = hodnoty_y+subs(z,rozsah); % vykreslení polynomu plot(rozsah,hodnoty_y, 'g','linewidth',3); if (abs(an)>0.0001)&&(ppridani<=6) % konstrukce daného předpisu z_=z_+z; ppridani = ppridani+1; end xlabel(['y(x) ~ ', char(z_),'+r(',num2str(i+1),')']); ylabel('\it y'); 4
axis ([rozsah(1,1) rozsah(1,size(rozsah,2)) rozsah(1,1)... rozsah(1,size(rozsah,2)) ]); grid on; title(['maclaurinuv rozvoj funkce ',char(y_)],... 'FontWeight','bold','Fontsize',15); hold on % vykreslení původní zadané funkce plot(rozsah,pole,'r','linewidth',2); % vykreslení souřadnicových os plot(rozsah,zeros(size(rozsah,2)),'k'); plot(zeros(size(rozsah,2)),rozsah,'k'); % přidání legendy s danými parametry h = legend('aproximace',char(y_)); set(h, 'Box', 'off'); set(h,'fontsize',10,'fontweight','b'); rect = [0.65, 0.15,.25,.1]; set(h, 'Position', rect) hold off end f = getframe; writevideo(vidobj,f); refreshdata; drawnow; pause(0.5); y=diff(y); i = i+1; % zachycení videa % zderivování předpisu do další iterace % zvýšení iteračního indexu close(vidobj); end 5
1.4 Výstupy na obrazovku pro různé vstupy Jelikož je výstup do jisté míry animovaný, je obtížné ho umístit do tohoto dokumentu. Jsou tedy k němu přiložena tři videa, která případně lépe ukazují, co program vykresluje, než zde na statických obrázcích. Vadou videa však může být, že nedokáže zobrazit obsah celého okna, ale pouze vnitřní část grafu tak, že není vidět vzorec postupné polynomické aproximace umístěný ve spodní části okna. 1. příklad ( ) maclaurinuv(x*sin(x),-2*pi:pi/30:2*pi,20) první iterace 6
desátá iterace 2. příklad maclaurinuv(1/sqrt(1+x^2),-5:0.1:5,20) Na tomto příkladě je hezky vidět, jak se polynom přiblíží dané funkci na intervalu ( ), ale v ostatních bodech se k ní ani v dalších 10 iteracích nepřiblíží. Je to dáno také tím, že zbytky R(n) nekonvergují k nule. 7
desátá iterace dvacátá iterace 8
3. příklad ( ) ( ) maclaurinuv(log(x+1)*sin(x),-1:0.1:3,15) čtvrtá iterace devátá iterace 9
1.5 Závěr Z vykreslených křivek je hezky vidět, jak se zvyšujícím se indexem iterace aproximační polynom postupně kopíruje křivku zadané funkce. Je pravděpodobné, že pokud se v prvních desítkách iterací nepřiblíží polynom zadané funkci na daném intervalu více, než v předchozích, bude zřejmě interval konvergence právě tento nezměněný interval. Pro vyšetřování krajních bodů nám však tato grafická metoda nepomůže, bylo by zapotřebí zkoumat přímo mocninnou řadu s dosazeným krajním bodem. Nicméně pro představu, jak silný nástroj je Maclaurinův rozvoj, a jak přesně souvisí iterace s tvarem výsledného polynomu, je skript plně funkční. 1.6 Reference [1] Matematická analýza 3, Milan Krbálek, Skriptum FJFI, 2010 [2] http://cgi.math.muni.cz/~kriz/analyza/kap7.html 10