Laboration 4: Integration på olika sätt I detta arbetsblad finns dels ett antal exempel på hur man kan använda Mathematica för att beräkna integraler och sedan ett exempel på Monte-Carlo integration. Exempel på exakt integration Mathematica klarar i stort sett av att hitta alla de primitiva funktioner som du klarar av med tekniker från analyskursen. Du har redan sett exempel på detta. Här kommer fler exempel som även omfattar multipelintegraler. Så här hittar man en primitiv funktion: In[]:= Out[]= Integrate@x * Sin@3 xd, xd - x Cos@3 xd + 3 Sin@3 xd 69 Om Mathematica inte klarar av att hitta en primitiv funktion, så returnerar den bara det uttryck du skrivit in. In[]:= Out[]= Integrate @Sin @x ^ * Cos @xdd, xd à Sin@x Cos@xDD â x Ibland blir dock svaret i termer av funktioner som du inte hört talas om. Dessa kan emellertid användas som vilka andra funktioner som helst. In[3]:= Integrate @Sin @x ^ D, xd FresnelSB Out[3]= xf Vi kontrollerar att Mathematica kan beräkna derivatan och ett värde av funktionen FresnelS[x] som ingick i svaret.
In[4]:= DB FresnelSB xf, xf FresnelS@0D N Out[4]= Sin@x D Out[5]= 0.4687 Exempel på numerisk integration Hur ska vi då göra om Mathematica inte kan hitta en primitiv funktion? I så fall kan vi ändå beräkna en integral numeriskt, och får förstås bara ett närmevärde. Här med integralen från förra sektionen. In[6]:= Out[6]= NIntegrate @Sin @x ^ * Cos @xdd, 8x, 0, <D 0.3757 Vill vi ändå ha ut den primitiva funktionen, kan vi få den som en interpolerad funktion, t.ex. genom att lösa motsvarande differentialekvation. Vi såg i laboration hur man gjorde. Man måste specificera intervallet, och manipulera med ersättningsoperatorn för att verkligen få ut en funktion. In[7]:= Out[7]= In[8]:= Out[8]= funktion = y. NDSolve @8y '@xd Sin @x ^ * Cos @xdd, y@0d 0<, y, 8x, 0, 0 <D@@DD InterpolatingFunction@880., 0.<<, <>D funktion @D 0.9976
In[9]:= 3 Plot @funktion @xd, 8x, 0, 0 <D 0.8 0.6 Out[9]= 0.4 0. 5 0 5 0 Exempel på multipelintegraler In[0]:= Integrate @x ^ y, 8x, 0, <, 8y, 0, <D Out[0]= 6 Integral över en region 0 x och 0 y x: In[]:= Out[]= Integrate @x Sin @y + xd, 8x, 0, <, 8y, 0, x<d 3 CosB F - SinB F SinB F För att integrera över mer komplicerade områden kan man använda funktionen Boole, som returnerar på ett instoppat påstående som är sant och 0 om det är falskt. Områden kan t ex beskrivas med olikheter, som x^ + y^ <. Boole[x^ + y^ < ] är alltså precis när x^ + y^ < är sann. Vi kan se det på grafen:
4 In[]:= ch@x_, y_d := Boole@x ^ + y ^ < D Plot3D@ch@x, yd, 8x, -, <, 8y, -, <D Out[3]= - - - - Integrerar vi över det här området, återupptäcker vi enhetsdiskens area. In[4]:= Out[4]= Integrate@ch@x, yd, 8x, -, <, 8y, -, <D Ovanstående funktion kallas för den karaktäristiska funktionen för enhetsdisken. För att integrera en godtycklig funktion över enhetsdisken är det bara att multiplicera med den karaktäristiska funktionen och sedan integrera över ett vanligt rektangulärt område.
In[5]:= 5 Plot3D@Sin@xD ^ ch@x, yd, 8x, -, <, 8y, -, <D 0.6 Out[5]= 0.4 0. - - - In[6]:= Out[6]= - Integrate@Sin@xD ^ ch@x, yd, 8x, -, <, 8y, -, <D N 0.664879 Regioner kan ges som logiska sammansättningar av olikheter. Det logiska konnektivet "och" betecknas i mathematica &&. Här är en integral som beräknar arean av området som ges av olikheterna < x^ - y^ < 4 och x y < samt att x,y är positiva. In[7]:= a = Integrate@Boole@ < x ^ - y ^ < 4 && x y < && x > 0 && y > 0D, 8x, -, <, 8y, -, < D Out[7]= 4 ArcCsch@D + ArcSinh@D + 4 Log@D - Log@4D - LogB 4 In[8]:= Out[8]= a N 0.6055 Vi kan se hur området ser ut med kommandot RegionPlot. J + 5 NF
6 In[9]:= RegionPlot@ < x ^ - y ^ < 4 && x y < && x > 0 && y > 0, 8x,, 5 <, 8y, 0, <D 0.8 0.6 Out[9]= 0.4 0...4.6.8.0..4 Rä kna area genom att räkna antalet sandkorn som hamnar i ett områ de när man kastar en näve grus på det. Antag att vi vill beräkna ett område A : s yta, men inte har något bra exakt sätt att göra det på. En användbar idé är baserad på att beräkna sannolikheten att en slumpvis vald punkt ligger i A. Detta är grunden för det som kallas Monte Carlo-integration. Hitta en rektangel R som omfattar A. Fyll sedan rektangeln R med 000 slumpvis valda punkter. Om t ex hälften av alla punkter hamnar inuti A, borde A ha halva arean mot R. Mer precist : beteckna antalet punkter som hamnar inuti A med antal (A). Då gäller antal (A) /000» Area (A)/Area (R). Ur detta får vi ett närmevärde på Area (A). Vi tillämpar detta på ett område vars area vi vet : A är cirkelskivan x^ + y^ <=, som ju har arean, och den är innehållen i kvadraten R = [-, ] [-, ], som har arean 4. (Vi får alltså ett närmevärde på Pi.) Först ska vi hitta 000 slumpvis valda punkter i kvadraten. För att få en slumpmässig punkt kan vi använda kommanot RandomReal.
som har arean 4. (Vi får alltså ett närmevärde på Pi.) 7 Först ska vi hitta 000 slumpvis valda punkter i kvadraten. För att få en slumpmässig punkt kan vi använda kommanot RandomReal. In[0]:= Out[0]= RandomReal @8-, <, D 8-0.937065, 0.7097< Detta talar om för Mathematica att slumpa fram en lista vars element består av två tal mellan - och, vilket får representera en punkt i planet. För att i stället få tusen punkter, skriver vi: In[]:= punkter = RandomReal @8-, <, 8000, <D; Nu gör vi en funktion test som testar om en punkt ligger på enhetsdisken. In[]:= test @8x_, y_ <D := x ^ + y ^ ; För att illustrera hur funktionen fungerar, testar vi med en punkt utanför enhetsdisken och en punkt på. In[3]:= test @8, <D test @8, <D Out[3]= False Out[4]= True Nu kan vi använda ett par av Mathematicas inbyggda listhanteringsfunktioner för att välja ut de punkter som ligger i cirkeln. In[5]:= icirkel = Select @ punkter, test D; ejicirkel = Complement @ punkter, icirkel D; För tydlighetens skull ritar vi ut vad vi har:
8 In[7]:= p = ContourPlot @x ^ + y ^, 8x, -, <, 8y, -, <D; p = ListPlot @8iCirkel, ejicirkel <, PlotStyle 8Green, Blue <D; Show @ p, p D Out[9]= - - - - Nu är det bara att räkna antal gröna sandkorn. In[30]:= Out[30]= Antal = Length @icirkel D 795 Insättning i formeln Antal/000 = Area/4 ger In[3]:= Out[3]= Area = N@HAntal * 4L 000 D 3.8 vilket blir vårt närmevärde på. Som synes är det ganska dåligt. För att få acceptabel nogrannhet måste man använda många fler punkter. Vi gör beräkningarna igen med fler punkter. Om vi inte bryr oss om att rita figurer, kan vi skriva det hela i kompaktare form. En av fördelarna är att vi slipper skapa långa punktlistor som äter upp datorns minne. Med tanke på övningarna sedan, inför vi en parameter dim som står för dimensionen av den integral vi vill beräkna. I det här fallet har vi en dubbelintegral för area i planet, så dim=. Observera att kvadraten vi jämför med då har arean ^dim=4.
In[3]:= Out[35]= 9 n = 00 000 ; dim = ; Antal = Sum @Boole @test @RandomReal @8-, <, dim DDD, 8i,, n<d; Area = Antal * ^ dim n N 3.3464 Notera att vi åter igen använder kommandot Boole. För att bena ut vad som händer, kan vi köra kommandona ett och ett. In[36]:= RandomReal @8-, <, dim D test @%D Boole @%D Out[36]= 853, - 0.888975< Out[37]= False Out[38]= 0 Vi summerar alltså över en "funktion" som slumpvis tar värdet 0 eller. Närmevärdet vi får fram är fortfarande inte speciellt bra, och det finns naturligtvis många metoder som ger bättre resultat. I övningarna kommer vi dock att se att metoden trots det är användbar i vissa situationer.