Laboration 2: Grafritning och visualisering av data I detta arbetsblad finns ett antal exempel på hur man kan använda Mathematica för att få översikt över funktioner och datamängder. Du har redan förra gången sett exempel på Plot---för att rita grafer ListPlot --- med vilken man kan rita upp bilder av mängder av punkter i planet, Show--- med vilken man kan visa flera bilder i samma bild. Vi går igenom dessa och fler liknande, och ser samtidigt exempel på hur man kan konstruera datamängder med Table och utnyttja detta för att få approximativa lösningar till problem som man inte kan lösa exakt. ü INLEDANDE EXEMPEL: Hur man konstruerar en invers funktion med Mathematica. Vi vill hitta den inversa funktionen till funktionen f(x)=sinx+x på intervallet [0, Pi/2]. Det går inte att göra exakt, men vi kan utnyttja att den inversa funktionens graf är spegelbilden, för att få en interpolerad funktion. Först talar vi om för Mathematica att f(x)=sinx+x och räknar ut funktionens värde i 1, för att se att Mathematica har förstått (Clear[f,x] tar bort gamla värden på x och f): Clear@f, xd f@x_d = Sin@xD +4 x f@1d êê N 4 x + Sin@xD 4.84147 Sedan tillverkar vi med kommandot Table en lista som vi kallar AA av punkter på grafen(sådana punkter betecknar Mathematica med {x, f[x]}). Listan består av alla punkter på grafen vars x-koordinat varierar från 0 till Pi med steglängden 0.001. Alltså ca 1500 punkter. Semikolonet talar om för Mathematica att vi inte vill se alla punkterna. Utan detta kommer Mathematica att skriva ut dem... AA = Table@8x, f@xd<, 8x, 0, Pi ê 2, 0.001<D; Sedan ritar vi upp AA. Den ser precis ut som en jämn kurva, vilket den inte är, eftersom det bara är ca 1500 punkter mycket nära varandra. Vi ger ett namn åt bilden(aspectratio Æ Automatic använder vi för att det ska vara samma skala på bägge axlarna.). BildAA = ListPlot@AA, AspectRatio Ø AutomaticD
2 Laboration2.2010.nb 7 6 5 4
Laboration2.2010.nb 3 3 2 1 0.5 1.0 1.5 Nu ska vi göra likadant med grafen till inversa funktionen, som vi kallar g. Det riktigt snygga är att vi kan utnyttja att g:s graf bara är spegelbilden i diagonalen y=x av f:s graf. Alltså om (x,f(x)) ligger på grafen till f så ligger (f(x),x) på grafen till inversa funktionen g.
4 Laboration2.2010.nb BB = Table@8f@xD, x<, 8x, 0, Pi ê 2, 0.001<D; BildBB = ListPlot@BB, AspectRatio Ø AutomaticD 1.5 1.0 0.5 1 2 3 4 5 6 7 Till slut kan vi visa bägge graferna i samma bild: Show@BildAA, BildBBD 7 6 5 4 3 2 1 1 2 3 4 5 6 7 Detta gav oss en hel del värden på g, men inte en funktion, som man t ex kan integrera och beräkna i alla punkter. För att få en sådan skapar vi(eller datorn) en approximation av den inversa funktionen genom interpolation av våra punkter BB. Det betyder att vi låter datorn använda de beräknade värdena av den inversa funktionen, alltså de vi fick genom speglingen ovan, för att approximera den inversa funktionen. g = Interpolation@BBD InterpolatingFunction@880., 7.28<<, <>D Inversa funktionens värde i x=1: g@1d 0.200267 Dess integral mellan x=0 och x=0.5:
Laboration2.2010.nb 5 Integrate@g@xD, 8x, 0, 0.5<D 0.0250042 Vi har verkligen (approximativt) den inversa funktion, d v s sammansättningarna f(g(x))=x och g(f(x))=x: Plot@f@g@xDD, 8x, 0, Pi ê 2<, AspectRatio Ø AutomaticD Plot@g@f@xDD, 8x, 0, Pi ê 2<, AspectRatio Ø AutomaticD 1.5 1.0 0.5 0.5 1.0 1.5 1.5 1.0 0.5 0.5 1.0 1.5
6 Laboration2.2010.nb ü EXEMPEL 1: Att använda Plot för att hitta extrempunkter visuellt Clear@fD, f@x_d = 2.1 + 1.5 x - 1.23 x 2 + x3 3 ; Plot@f@xD, 8x, 0, 4<D Funktionen verkar vara monotont växande. Men titta närmare på den, genom att minska intervallet på vilken den ritas: Plot@f@xD, 8x, 1.1, 1.6<D ü EXEMPEL 2: Grafer av funktioner av två variabler. Plot3D@Cos@x yd, 8x, -3, 3<, 8y, -3, 3<D Plot3D@Cos@x yd, 8x, -3, 3<, 8y, -3, 3<D Plot3D@Cos@x yd, 8x, -3, 3<, 8y, -3, 3<, Mesh Ø NoneD Nu ska vi rita upp en kurva i rymden i parameterform. Vi har alltså tre koordinater som allihop är funktioner av t: ParametricPlot3D@ 8Cos@tD, Sin@tD, HCos@5 td + Sin@4 tdl Sin@tD<, 8t, 1, 10<D En yta i rymden parametriserad av t och u: ParametricPlot3D@8u Sin@tD, u Cos@tD, t ê 3<, 8t, 0, 15<, 8u, -1, 1<D ü EXEMPEL 3: Sannolikheten för att ett tal är ett primtal. PrimePi[x] talar om hur många primtal, som är mindre än x. PrimPi[x]/x är då sannolikheten att ett slumpvis valt heltal mindre än x ska vara ett primtal. Det finns en sats som säger att för stora x är PrimPi[x]/x av samma storleksordning som 1/log(x+1). Först några exempel: PrimePi@100D PrimePi@100D ê 100 êê N PrimePi@1000D ê 1000 êê N En fjärdedel av alla tal mindre än 100 är primtal, men bara en sjättedel av de mindre än 1000. Sannolikheten minskar alltså---men hur snabbt? Vi kan använda tekniken ovan:
Laboration2.2010.nb 7 Primsannolikhet = Table@8x, PrimePi@xD ê x<, 8x, 2, 20 000<D; gprim = ListPlot@PrimsannolikhetD Jämför den sedan med grafen till 1/log(x), för att se en illustration av primtalssatsen. Vi ska ta kvoten mellan de två funktionern och påståendet är alltså att att PrimePi(x)Log[x]/x går mot 1 när x blir stort. ff = Table@8x, PrimePi@xD Log@xD ê x<, 8x, 2, 20 000<D; gprim2 = ListPlot@ffD Ett av de sju Clay-priserna om en miljon dollar styck handlar om att ge en bättre uppskattning. ü EXEMPEL 4: Att hitta de största talen i en lista. Här tiilverkar vi en lista på binomialkoefficienter, kallad Johansson, för att markera att det är vårt namn och inte Mathematicas. Johansson = Table@Binomial@20, id, 8i, 1, 20<D 820, 190, 1140, 4845, 15 504, 38 760, 77 520, 125 970, 167 960, 184 756, 167 960, 125 970, 77 520, 38 760, 15 504, 4845, 1140, 190, 20, 1< Det största av dem hittar vi så här: Max@JohanssonD 184 756 Vilket är det nu? Tittar vi på listan verkar det ligga mitt i. Vi kan plocka ut det tionde elementet i listan såhär: Johansson@@10DD 184 756 Binomial@20, 10D 184 756 Slutligen kan vi plotta alla koefficienterna
8 Laboration2.2010.nb JJ = ListPlot@Johansson, PlotStyle Ø PointSize@0.02DD 150 000 100 000 50 000 5 10 15 20 Vi kan förena punkterna (i ordningsföljd) genom kommandot Joined Æ True. Show@JJ, ListPlot@Johansson, Joined Ø TrueDD 150 000 100 000 50 000 5 10 15 20 Här är några fler exempel på listor och linjeteckningar. Nedanstående kommando skapar en lista av 1000 slumpade punkter i planet vars koordinater ligger mellan 0 och 1. Aktivera cellerna! slumppunkter = Table@RandomReal@80, 1<, 2D, 8i, 1000<D; ListPlot@slumppunkterD 1.0 0.8 0.6 0.4 0.2 0.2 0.4 0.6 0.8 1.0
Laboration2.2010.nb 9 ListPlot@slumppunkter, Joined Ø True, Axes Ø FalseD ü EXEMPEL 5: Dynamiska bilder av grafer och deras tangenter h@x_d := Sin@xD + 0.3 * Sin@3 xd Plot@h@xD, 8x, 0, 15<, AspectRatio Ø AutomaticD Flera funktioner kan plottas samtidigt. De beskrivs då med en lista, här {Sin[x], Cos[x]}: Plot@8Sin@xD, Cos@xD<, 8x, 0, 20<D
10 Laboration2.2010.nb Manipulate@Plot@8h@xD, h@ad + h'@ad * Hx - al<, 8x, 0, 20<, 8AspectRatio Ø Automatic, PlotRange Ø 880, 20<, 8-10, 10<<<D, 8a, 0, 20<D a 10 5 0 5 10 15 20-5 -10 Det här var en dynamisk bild på funktionen f[x]=sin[x] + 0.3*Sin[3 x] ovan och dess tangenter f[a] + f'[a]*(x - a) i olika punkter a. Resultatet är en slags räknedosa i vilken man kan trycka in olika värden på parametern. Genom att trycka på kontrollerna kan du få parametern att variera. Kommandot Manipulate har egenskapen att den utför ett kommando---eller program--- för olika värden på en parameter, här a. Det kan vara vilket kommando som helst som den utför, i detta fall plottar densamtidigt grafen till funktionen och dess tangent. Optionerna till Plot som vi använder är två: {AspectRatio Æ Automatic, PlotRange Æ {{0, 20}, {-10, 10}}}. Det första tillvalet ser till att skalan är densamma på bägge axlarna, och den andra, PlotRange Æ {{0, 20}, {-10, 10}}, ser till att Mathematica bara ritar upp de delar av grafen där x varierar mellan 0 och 20, och y mellan -10 och 10. ü EXEMPEL 6: Taylorpolynom som approximationer av funktioner taylor1 = Series@Sin@xD, 8x, 0, 9<D x - x3 6 + x5 120 - x7 5040 + x9 362 880 + O@xD10
Laboration2.2010.nb 11 Svaret här är en serie, och vi kan inte använda det som ett polynom rakt av. Om man nu vill ha ett polynom och inte en serie? poly9 = Normal@taylor1D Nu har vi fått ett polynom. När vi vill räkna ut värdet av polynomet i en punkt måste vi använda ersättningsoperatorn. Vi räknar också ut hur bra approximation av Sin polynomet är i x=1. poly9 ê. x -> 1 Hpoly9 ê. x Ø 1L - Sin@1D êê N Vi fortsätter att jämföra funktionen med sitt Taylorpolynom. Vi ser att nära x=0 är graferna nära, men att redan för x=7 är skillnaden stor. Plot@8poly9, Sin@xD<, 8x, 0, 10<D ü EXEMPEL 7: Hur man grafiskt hittar nollställen med FindRoot Problem : Låt w (x) = 2 sin^2 x + (5/2) cos^2 (x/2), på intervallet [0, Pi/2], och finn alla nollställen till derivatan. Först definierar vi funktionen. Clear @w, xd w@x_d = 2 HSin@ xdl^2 + H5 ê 2L HCos@x ê 2DL^2 Plot@8w@xD, w'@xd<, 8x, 0, Pi ê 2<D Och vilken är nu vilken? Vi kan färga graferna olika. Den som hör till den första i listan {w[x],w'[x]} ges nedan den första färgen grön i listan {Green, Red}, o s v. Plot@8w@xD, w'@xd<, 8x, 0, Pi ê 2<, PlotStyle Ø 8Green, Red<D Från grafen ser man att derivatan har ett nollställe ungefär vid x=1.25, som ser ut att svara mot ett maximum av w(x). Vi kan hitta ett närmevärde på det nollstället med kommandot FindRoot, som betraktar 1.25 som en första approximation av nollstället och sedan förfinar approximationen. FindRoot@w'@xD ã 0, 8x, 1.25<D w'@xd ê. 8x Ø 1.25297< Så det verkar stämma. Dessutom ser vi i grafen att derivatan verkar ha ytterligare ett nollställe vid x=0: w'@xd w'@0d
12 Laboration2.2010.nb Det verkar alltså rimligt att tro att derivatan har två nollställen. Det första x=0 är vi, med lite eftertanke, helt säkra på eftersom derivatans termer innehåller sin(x) och sin(x/2) som är 0 när x=0. Det andra nollstället är bara approximativt. Skulle det var viktigt, eller vi vill utveckla vår paranoida personlighet, bör vi förstås nu också bevisa att dessa två är de enda...men med datorräkningarna har vi i alla fall hittat vad vi bör försöka verifiera. ü EXEMPEL 8: Numeriska lösningar till differentialekvationer Så här tjusigt löser Mathematica differentialekvationer: DSolve@y''@xD ã y@xd, y@xd, xd Med randvärden: DSolve@8y''@xD ã y@xd, y'@0d ã 0, y@0d ã 1<, y@xd, xd DSolve@8y''@xD ã -y@xd, y'@0d ã 0, y@0d ã 1<, y@xd, xd I nästa fall finns det flera lösningar. Mathematica presenterar en av dem, men påpekar att det finns fler. Trycker man på >> får man mer upplysningar. DSolve@8H1 + x^2l y'@xd - y@xd^2-4 == 0, y@0d == 7<, y@xd, xd Här är en differentialekvation som inte går att lösa exakt. DSolve@8y'@xD ã Exp@Sin@xDD, y@0d ã 0<, y, xd Men vi kan lösa den numeriskt. Då måste vi specificera intervallet, säg mellan 0 och 20. (Observera hur ersättningsoperatorn /. används på y för att ge oss en funktion; First betyder att vi tar första elementet i en lista, i det här fallet det enda elementet. Se förklaringen senare.) funktion = First@ y ê. NDSolve@8y'@xD ã Exp@Sin@xDD, y@0d ã 0<, y, 8x, 0, 20<DD Funktionens värde i x=2 och dess graf: funktion@2d Plot@funktion@xD, 8x, 0, 20<D Resten av detta exempel förklarar formen på lösningen. Skriver vi bara NDSolve så får vi ut en interpolerande funktion. sol = NDSolve@8y'@xD ã Exp@Sin@xDD, y@0d ã 0<, y, 8x, 0, 20<D
Laboration2.2010.nb 13 Mathematica har beräknat ett antal värden på den sökta funktionen och interpolerar sedan dessa för att beräkna funktionens värden för andra punkter. Och hur får man sedan då ut t ex y[1]? sol@3d Nej...Formen på utdata är en transformationsregel, alltså: y@3d ê. sol Men om man ska vara petig: måsvingarna då---svaret vi fick är en lista på ett tal, inte ett tal... First plockar ut första elementet ur en lista, d v s här talet själv. First@y@3D ê. sold ü EXEMPEL 9: Användning av ContourPlot ContourPlot@8x^2 + 10 y^2 ã 1, 3 x^2 + y^2 ã 1<, 8x, -5, 5<, 8y, -5, 5<D 4 2 0-2 -4-4 -2 0 2 4 Mathematica ritar inte direkt i ett komplext talplan, men vi kan använda z=x+iy och rita i xy-planet. Vi vill rita upp kurvan Re (z^17) + Im (z^3) = 1 i komplexa talplanet. Skriv z=x+iy z = x + I * y; och sedan
14 Laboration2.2010.nb ContourPlot@Re@z^17D + Im@z^16D ã 1, 8x, -10, 10<, 8y, -10, 10<D 10 5 0-5 -10-10 -5 0 5 10