Vad är Taylors formel bra för?

Taylors formel är ett oumbärligt verktyg i numerisk analys. Följande sida försöker att ge lite känsla för vad Taylors formel är och hur den kan användas.

Taylors formel för en funktion, f, i en variabel , x, kan skrivas på lika olika sätt. Vi börjar med

f(a + h) = f(a) + h f '(a) + (h2 / 2) f ''(a) + ...

Specialfallet med a = 0 går i bland under namnet Maclaurinutveckling. Jag kommer dock endast att referera till Taylor.

Utvecklingen talar om hur en funktion uppför sig i en omgivning till x = a genom att enbart utnyttja information om hur funktionen och dess derivator ser ut i x = a. I numerisk analys använder vi normalt trunkerade utvecklingar, dvs. vi tar endast med ett begränsat antal termer i utvecklingarna.

Dvs. låt a vara ett fixt värde och antag att h kan variera. Då utgör den trunkerade utveckling en approximation av f(a + h). Vi kan välja hur noga vi vill känna f(a + h) genom att anpassa antalet termer i utvecklingen. Fler termer ger mer information (men kräver mer beräkningsarbete). Ett stort h kräver normalt fler termer än ett litet h för att ge samma fel i uppskattningen av f(a + h).

Vi kan betrakta f(a), f '(a) etc. som koefficienter i ett polynom i h. Till exempel är ju f(a) + h f '(a) + h2 / 2 f ''(a) ett andragradspolynom i variabeln h. Vi kallar sådana polynom för Taylorpolynom. Genom att ta med fler termer kan vi alltså öka gradtalet hos polynomet. Låt oss approximera sinusfunktionen kring nollan (a = 0) med Taylorpolynom av olika gradtal. Vi vet att sin(0 + h) = h - h3 / 6 + h5 / 120  - ....

I följande plot har jag dels ritat ut sinusfunktionen (svart) i intervallet [-3, 3] och dels Taylorpolynomen: 0, konstant noll (röd), h (grön), h - h3 / 6 (blå) samt h - h3 / 6 + h5 / 120 (magenta).

Fig1

Vi noterar att ju högre gradtal polynomet har desto längre ligger Taylorpolynomet nära sinuskurvan. Att approximera med en konstant funktion, noll, är inte av något större intresse i detta fall eftersom vi får en så dålig approximation. Linjär approximation (med den gröna linjen) är ofta användbart (i Newtons metod t.ex.) och kvadratisk approximation (den blå kurvan) är också vanligt. Oavsett hur högt gradtal vi har (om det är ändligt) så kommer sinuskurvan och Taylorpolynomet att gå isär. Ett polynom (som inte är konstant) måste ju alltid gå mot plus eller minus oändligheten när h gör det och sinus är ju en begränsad funktion.

Det är viktigt att kunna hantera Taylorutvecklingen när man har andra beteckningar. En vanlig form av utvecklingen får vi om vi sätter x = a + h i vår ursprungliga formel,  f(a + h) = f(a) + h f '(a) + (h2 / 2) f ''(a) + .... Vi får då följande uttryck (eftersom h = x - a):

f(x) = f(a) + (x - a) f '(a) + ((x - a)2 / 2) f ''(a) + ...

Tar vi nu speciellt a = 0 får vi en variant som kommer att vara vanlig i kursen, nämligen:

f(x) = f(0) + x f '(0) + (x2 / 2) f ''(0) + ..

Man kan ju fråga sig varför Taylors formel ser ut så här. Hade man kunnat skissa detta utseende utan att ha sett sats och bevis? Ja, formeln verkar rimlig om vi låter f vara polynomet, f(x) = a0 + a1 x + a2 x2 + a3 x3 + ... + an xn. Vi ser att f(0) = a0 och f'(0) = a1. f''(x) = 2 a2 + ... + n(n-1) an xn-2 så att f''(0) = 2 a2. Allmänt gäller att f(k)(x) = k! ak + ... så att f(k)(0) = k! ak och ak = f(k)(0) / k! precis som i Taylors formel.


Här följer några exempel på hur man kan använda Taylors formel.

Exempel: Ibland kan vi ersätta (approximera) en komplicerad funktion med en enkel (Taylorpolynom). Låt oss studera uttrycket  f(x) = sin2 x / (x cos x) för x nära noll. Vi kan få ett grepp om detta uttryck genom att approximera sin x med x. Vi måste också uppskatta cos x. Nu vet vi att cos x = 1 - x2 / 2 + ...och här är en situation när approximation med en konstant funktion är lämplig. cos x är ungefär ett för små x.

Alltså uppför sig f(x) som x2 / (x * 1) = x för små x. Genom att ta med fler termer i Taylorpolynomen kan vi få bättre approximationer, t.ex.

(x - x3 / 6)2 / (x (1 - x2 / 2))

Nu är detta lite svårtolkat, så i stället kan vi beräkna Taylorutvecklingen av funktionen f direkt. Detta gör man helst med ett symbolbehandlande system, t.ex. Maple eller Mathematica.

Så här ser det ut, först i Maple och sedan i Mathematica (x är variabeln, a = 0 och sen anger vi ett maximalt gradtal också):

> series(sin(x)^2 / (x * cos(x)), x = 0, 9);

3 31 5 173 7 9
x + 1/6 x + --- x + ---- x + O(x )
360 5040

x = 0 betyder att x är variabeln och att vi gör utvecklingen kring nollan. Talet nio anger ordningen på Taylorpolynomet. {x, 0, 7} har liknande betydelse i Mathematica nedan.

In[1]:= Series[Sin[x]^2 / (x Cos[x]), {x, 0, 7}]

3 5 7
x 31 x 173 x 8
Out[1]= x + -- + ----- + ------ + O[x]
6 360 5040

O markerar att det kommer termer av högre ordning (gradtal).

Exempel: Här följer en mycket praktisk tillämpning på ovanstående metodik. Säg att vi måste beräkna (1 + x4)1/3 - 1, för en massa små värden på x. Vi antar att det skall skrivas en funktion i Java eller C t.ex., för att beräkna uttryckets värde givet x. Detta är nu inte alldeles enkelt för formeln lämpar sig inte speciellt väl för praktisk beräkning. Låt x = 10-4, vi får då följande resultat i Matlab (liksom i Java, C, etc.).

>> x = 1e-4
x =
1.000000000000000e-04

>> (1 + x^4)^(1/3) - 1
ans =
0

Svaret blir noll på grund av så kallad utskiftning. Eftersom Matlab räknar med ett begränsat antal siffror (ungefär 16) så kommer 1 + 10-16 att beräknas till ett, 10-16 får inte plats eftersom det är så litet jämfört med ett. Så om vi kopierar formeln som den står, så kommer vår funktion att returnera värdet noll för alla | x | <= 10-4, vilket inte är tillfredsställande. Om x är större, t.ex. 10-3 så blir värdet inte noll, men vår beräkning kommer att vara behäftad med ett stort relativt fel.

Observera att uttrycket är speciellt på det sättet att vi adderar ett till det lilla talet och sedan drar bort ett, (1 + litet)1/3 - 1, som blir litet, ettorna försvinner. Vi borde alltså kunna utföra beräkningen utan att vi får utskiftning och här kommer Taylorutvecklingen in.

In[4]:= utveck = Series[(1 + x^4)^(1/3) - 1, {x, 0, 12}]

4 8 12
x x 5 x 13
Out[4]= -- - -- + ----- + O[x]
3 9 81

In[5]:= Simplify[utveck / (x^4 / 3)]

4 8
x 5 x 9
Out[5]= 1 - -- + ---- + O[x]
3 27

Hur många termer skall vi ta med? Vi vill ju att vår funktion skall vara så snabb som möjligt, så vi vill inte ta med onödigt många termer. Antag att vår funktion endast behöver ta hand om | x | <= 10-4. Vi ser då från det andra uttrycket (där jag har delat med den första termen så att det skall vara lättare att jämföra termernas storlek relativt den första) att det räcker med en term, de övriga kommer att skiftas ut, ty 1 - x4 / 3 blir ju 1 för våra aktuella x. Med andra ord, funktionen skall returnera x4 / 3. Här följer en kontroll med hjälp av Mathematica då x = 10-4:

In[9]:= facit = N[(1 + 10^-16)^(1/3) - 1, 50]  50 siffror

                                                              -17
Out[9]= 3.3333333333333332222222222222222283950617283950613 10


In[10]:= fel = facit - 3.333333333333334 10^-17 Från Matlab

                    -33
Out[10]= -6.16298 10      Absolut fel

In[11]:= fel / facit

                    -16
Out[11]= -1.84889 10      Relativt fel

Exempel: Antag att vi approximerat ex, för x nära noll, med det rationella uttrycket

                                         2
1 + 1/2 x + 1/12 x
-------------------
2
1 - 1/2 x + 1/12 x

Taylorutvecklingen av skillnaden mellan detta uttryck och ex ger oss ett uttryck för felet i approximationen:

> series((1 + x/2 + x^2/12) / (1 - x/2 + x^2/12) - exp(x), x = 0, 6);

5 6
- 1/720 x + O(x )

Exempel: Ett standardproblem i numerisk analys är att approximera derivator. Vi kan fråga oss hur väl approximerar (f(x + h) - f(x)) / h derivatan av f '(x)? Vi använder Taylorutvecklingen och får

(f(x + h) - f(x)) / h = ( [f(x) + h f '(x) + h2 / 2 f ''(x) + ... ] - f(x) ) / h = f '(x) + h / 2 f ''(x) + ...

Så förutsatt att f ''(x) är begränsad så uppför sig felet som h. Det är nu hög tid att införa lite matematisk stringens, annars kan vi dra fel slutsatser.


I tredje exemplet ovan ser vi att skillnaden uppför sig som -x5 / 720 + O(x6). Detta innebär att x5-termen kommer att dominera för tillräckligt litet x. Om x t.ex. är 10-3 så är ju x5 = 10-15 och x6 = 10-18. Vad tillräckligt litet är beror på hur väl man vill att den ledande termen skall uppskatta skillnaden och hur de försummade termerna uppför sig. Säg att ett uttryck uppför sig som x5 + O(x6). Det spelar då stor roll om O(x6) = 1010 x6 eller x6 eller 10-10 x6 till exempel.

När man resonerar om Taylorutvecklingar är det oftast underförstått att O-termer uppför sig på detta snälla vis. När vi vill vara ordentligare använder vi rest-termen i utvecklingen. Om f är n+1 gånger kontinuerligt deriverbar i en omgivning till a så gäller, i detta intervall, att:

f(x) = f(a) + (x - a) f '(a) + ((x - a)2 / 2) f ''(a) + ... + ((x - a)n / n!) f (n)(a) +  ((x - a)n+1 / (n+1)!) f (n+1)(z)

där z är en (okänd) punkt mellan a och x. Rest-termen är den sista termen, den som beror av z. Eftersom f är kontinuerligt deriverbar n+1 gånger så gäller att n-te-derivatan, f (n+1)(z), är begränsad i intervallet (åtminstone om vi ser till att det är slutet). Vi kan skriva | f (n+1)(z) | <= M för en konstant M. Vi kan nu garantera att skillnaden mellan utveckling och exakt värde minskar när x -> a. Det gäller ju att

| f(a) + (x - a) f '(a) + ((x - a)2 / 2) f ''(a) + ... + ((x - a)n / 2) f (n)(a)  - f(x) | <=  (|x - a|n+1 / (n+1)!) M

Observera att en utveckling inte behöver existera för alla x. Man får inte gå utanför intervallet där derivatorna är kontinuerliga, för då bryter man ju mot förutsättningarna i satsen.

Exempel:

Så här ser Taylorutvecklingen av sqrt(1 + x),  | x | < 1, ut (a = 0 och n = 2 i detta exempel):

sqrt(1 + x) = 1 + x / 2 - x2 / 8 + x3 / (16 (1 + z)5/2), | z | < 1

eftersom, med f(x) = sqrt(1 + x), derivatorna blir, f'(x) = 1 / (2 sqrt(1 + x)), f''(x) = -1 / (4 sqrt(1 + x)3)

och f'''(x) = 3 / (8 sqrt(1 + x)5). Så, det gäller alltså att

| 1 + x / 2 - x2 / 8 - sqrt(1 + x) | <= M |x|3, | x | <= x0 < 1

x0 är ett givet tal, som vi bestämmer, strängt mindre än ett. Vi gör på detta sätt för att sluta intervallet. 1 / (1 + z)5/2 är ju begränsat på ett slutet intervall till höger om z = -1 men inte på det öppna intervallet -1 < z.

Observera att vi inte får stoppa in x = -1 i utvecklingen eftersom ingen av derivatorna existerar i denna punkt (de går ju mot oändligheten när x -> -1).

Exempel:

Man kan använda rest-termen för att stringent ta fram vissa standardgränsvärden. Vi vet redan att (ex - 1) / x -> 1 när x -> 0, men låt oss ändå bevisa detta med Taylorutveckling.

ex = 1 + x + ez x2 / 2

Det gäller alltså att (ex - 1) / x = 1+ ez x / 2. Rest-termen är begränsad för x i en omgivning till origo, ty ez är ju t.ex. mindre än M = e = 2.718... om | z | <= 1. Alltså gäller att:

| (ex - 1) / x - 1 | <= M x

som visar att (ex - 1) / x -> 1 när x -> 0.


Jag har skrivit lite om Taylors formel för funktioner av flera variabler i svaret på Newton-frågan (titta under FAQ i marginalen).


Back