Rachunek całkowy

W programach komputerowych takich jak Mathematica całkowanie jest rozumiane jako funkcja pierwotna, tj. odwrotna do różniczkowania. Od lat 60-tych wiadomo, że całkowanie symboliczne tak jak różniczkowanie, jest operacją którą można wykonać algorytmicznie (zaprogramować).  Algorytm Rischa (https://en.wikipedia.org/wiki/Risch_algorithm) i inne pozwalają (w teorii) obliczyć całkę, lub ustalić, że nie wyraża się przez funkcje ,,elementarne’’.

Całkowanie symboliczne (funkcje pierwotne)

Elementarz całkowania

Fundamentalnym poleceniem dotyczącym całkowania jest Integrate. Oto znane wyniki całkowania funkcji elementarnych:

Integrate[Sin[x],x]

Integrate[Cos[x],x]

Integrate[x^n,x]

Integrate[Exp[x],x]

Integrate[1/x,x]

Pozostałe całki na ogół nie są wymagane na pamięć, i traktuje się je jako zadania, np:

Integrate[Log[x],x]

Podstawowy fakt: całkowanie ( Integrate ) i różniczkowanie  ( D )  są operacjami odwrotnymi:

D[Integrate[Tan[x],x],x] (* pochodna całki *)

Integrate[D[Tan[x],x],x] (* całka pochodnej *)

Funkcja pierwotna (całka nieoznaczona)  istnieje tylko wtedy, gdy funkcja podcalkowa jest pochodną jakiejś kombinacji funkcji ,,elementarnych’’:

D[Log[x ArcTan[1+x^2]-Sqrt[x]],x]

Simplify[%]

Integrate[%,x]

Integrate[Log[x-Sqrt[x]]/x^3,x]

Poniższe całki nie wyrażają się przez kombinacje f. elementarnych:

Integrate[x^x,x]

Integrate[Sqrt[Log[x]+Exp[x]],x]

Niektóre całki wyrażają się przez funkcje specjalne. Mathematica zna dużo więcej funkcji specjalnych niż większość z nas:

Integrate[Exp[-x^2],x]

Integrate[Exp[x]/x,x]

Integrate[Exp[-x^3],x]//PowerExpand

Całkowanie ,,nieoznaczone’’ normalnie używa liczb zespolonych:

Integrate[Cos[Tan[x]],x]

Całkowanie nawet ewidentnie rzeczywistych funkcji często daje w wyniku wyrażenia zawierające symbole urojone:

Integrate[1/Sqrt[x^4+1],x]

%/.x->1

ComplexExpand[%]

N[%]

Sytuacja powyższa nie powinna dziwić bardziej, niż wzory na rozwiązania równania 3 stopnia: tam także nie jest możliwe zapisanie wzorów na rozwiązania rzeczywiste bez użycia symbolu jednostki urojonej I=Sqrt[-1].

Nie istnieje dla przykładu funkcja zespolona, która po zróżniczkowaniu da wartość bezwzględną:

Integrate[Abs[x],x]

Jeżeli rozumiemy x jako liczbę rzeczywistą, to powyższa całka istnieje, a nawet jest różniczkowalna. Oto sposób ,,zmuszenia’’ komputera do wyliczenia tej całki:

Integrate[Abs[t],{t,0,x}]

Zróżniczkowanie nie daje f. podcałkowej z powodu nieanalityczności Abs:

D[%,x]

Powyższy wynik zwykle interpretujemy nastepująco:

%/.Abs'->Sign (* pochodna |x| to signum(x) *)

FullSimplify[%,x∈Reals]

Przykład: Oblicz całkę nieoznaczoną z 1/x dla x<0

Głównym problemem dla studentów nie jest wpisanie Integrate: to potrafi każdy. Problemem staje się interpretacja wyniku i doprowadzenie go do użytecznej dalej postaci. Na przykład, w szkolnej analizie poniższa całka zwykle zawiera Abs[x] pod logarytmem:

Integrate[1/x,x]

Powyżej otrzymaliśmy funkcję pierwotną rozumianą jako taka funkcja zespolona, która po zróżniczkowaniu da 1/x. Jeżeli rozumiemy 1/x jako wzór funkcji rzeczywistej, to całka ewidentnie istnieje dla x<0, i jest tam oczywiście rzeczywista. Niestety:

Log[-1]

Jeden z trików pozwalający obejść ten problem to wyliczenie całki nieoznaczonej jako całki oznaczonej o zmiennej górnej granicy, a dolnej usytuowanej w obszarze x<0. ( Nie może to być x=0, bo całka jest rozbieżna - nie istnieje ! )

Integrate[1/t,{t,-1,x}]

Powyższy wynik jest nieco dziwaczny: stała całkowania dla x<0 okazała się zespolona. Warunki pokazują, że x nie może być liczbą rzeczywistą. Dodajmy warunek rzeczywistości x:

Integrate[1/t,{t,-1,x},Assumptions->x∈Reals]

Integrate[1/t,{t,-1,x},Assumptions->x∈Reals&&x<-1]

Integrate[1/t,{t,-1,x},Assumptions->x∈Reals&&x<0]

W męczarniach można wydedukować z powyższych wzorów, że dla x<0 całka z 1/x to Log[-x]. Tego typu trudności, a nawet większe, to normalna sytuacja przy całkowaniu funkcji rzeczywistych. Dodanie warunków dla całki nieoznaczonej nic nie daje:

Integrate[1/x,x,Assumptions->x∈Reals&&x<0]

Integrate[1/x,x,Assumptions->x<0]

Wnioski są następujące. Mathematica potrafi praktycznie zawsze znaleźć zespoloną funkcję pierwotną. Jeżeli chodzi o całkowanie rzeczywiste, czyli to o co zwykle chodzi, należy ją traktować jako rewelacyjny system podpowiadający. Niestety, większość wyników wymaga dodatkowej ,,obróbki’’, a to z kolei wiedzy teoretycznej na temat całkowania.

Niektóre całki z dowolnych funkcji (całkowanie przez części itp.)

W niektórych przypadkach Mathematica potrafi całkować wyrażenia zawierające dowolne funkcje, np:

Integrate[f'[x]/f[x],x]

Integrate[f'[x]f[x],x]

Integrate[x''[t]x'[t],t]

Integrate[x''[t]x'[t]+x[t]x'[t],t]

Całkowanie przez części nie może być zastosowane jawnie:

Integrate[g[x]f'[x],x]

Ale podobny wzór (pochodna iloczynu) jest całkowany:

Integrate[g[x]f'[x]+g'[x]f[x],x]

Integrate[f[a x+b],x]

Całki oznaczone

Oblicz całkę oznaczoną (∫_(-∞)^∞)(e^(- a (x^2)))dx

Integrate[Exp[-x^2],{x,-Infinity,Infinity}]

Integrate[Exp[-a x^2],{x,-Infinity,Infinity}]

Refine[%,a>0]

Oblicz całkę nieoznaczoną z funkcji x/((x^2)-1), gdzie x jest rzeczywiste, oraz |x|<1

Integrate[x/(x^2-1),x]

Plot[(1/2) Log[-1+(x^2)],{x,-1,1}]

Integrate[x/(x^2-1),{x,0,t}]

Integrate[x/(x^2-1),{x,0,t},Assumptions->t∈Reals]

Refine[%,Abs[t]<1]

Refine[%,0<t<1]

Plot[%,{t,-1,1}]

Całkowanie przez rozwiązanie równania różniczkowego

Obliczenie całki funkcji  ∫ f[x]dx = F[x], jest równoważne stwierdzeniu, że pochodna F to f: F’[x]=f[x]. Ostanie równanie to równanie różniczkowe. Można je rozwiązać poleceniem DSolve:

DSolve[F'[x]==1/x,F,x]

DSolve[{F'[x]==1/x,F[-1]==0},F,x]

F[x]/.%[[1]]

ComplexExpand[%]

Całki wielokrotne

Przykład 1: oblicz pole koła w układzie biegunowym i prostokątnym

Standardowe zadanie z matematyki i fizyki, czyli obliczenie pola koła, sprowadza się do całki podwójnej. Można ją zapisać na 2 sposoby. Pierwszy, mający zastosowanie w każdej sytuacji, także gdy granice całek są funkcjami, to całka z całki:

Integrate[Integrate[r,{r,0,R}],{ϕ,0,2 Pi}]

W tym konkretnym przypadku granice całkowania są stałe, możemy użyć alternatywnego zapisu:

Integrate[r,{r,0,R},{ϕ,0,2 Pi}]

To samo w układzie kartezjańskim:

Integrate[
Integrate[
1,
{y,-Sqrt[R^2-x^2],Sqrt[R^2-x^2]}
],
{x,-R,R}
]

Wiemy, że R>0:

PowerExpand[%]

Najtrudniejsze zwykle jest ustalenie granic całkowania. Możemy obejść ten problem za pomocą tzw. funkcji charakterystycznej regionu, przyjmujacej wartość 1 ,,wewnątrz’’, i ZERO na ,,zewnątrz’’. Całka oznaczona z zera to zero, czyli dostajemy żadany wynik bez podawania
granic całkowania. F. charakterystyczna regionu to Boole. Ma wartość jeden, jeżeli wyrażenie wewnątrz jest prawdziwe, natomiast zero gdy jest fałszywe. Wstawiamy do niego równanie koła:

Integrate[Boole[x^2+y^2≤R^2],{x,-R,R},{y,-R,R}]

Niestety, Mathematica nie umie obliczyć takiej całki symbolicznie dla dowolnego R. Jeżeli przyjmiemy np: R=1, to wynik otrzymujemy od razu:

Integrate[Boole[x^2+y^2≤1^2],{x,-1,1},{y,-1,1}]

Granice całkowania muszą być na tyle duże, aby koło zmieściło się w środku. Nic większego niż ∞ nie znajdziemy:

Integrate[Boole[x^2+y^2≤1],{x,-Infinity,Infinity},{y,-Infinity,Infinity}]

Przykład 2: Znajdź granice całkowania całki podwójnej która obejmie obszar koła o promieniu 1

Całkowanie symboliczne z użyciem funkcji Boole może niektórych zaskoczyć: jak Mathematica to robi? Odpowiedź to algebraiczny rozkład cylindryczny ( CylindricalDecomposition ):

CylindricalDecomposition[x^2+y^2<1,{x,y}]

Wynikiem rozkładu są de facto granice całkowania całki podwójnej po zadanym obszarze (Skopiować wynik myszą i pokazać!)

RegionPlot[x^2+y^2<1,{x,-2,2},{y,-2,2}]

RegionPlot[-1<x<1&&-(Sqrt[1-(x^2)])<y<(Sqrt[1-(x^2)]),{x,-2,2},{y,-2,2}]

Przykład 3: Znajdź granice całkownia całki podwójnej po obszarze całkowania w postaci trójkąta równobocznego o boku 2 z okragłą dziurą o promieniu 1/2 w centrum

Na płaszczyźnie sporo studentów radzi sobie z tego typu zadaniami, ale warto wiedzieć jak wspomóc się komputerem.

RegionPlot[
{
y>0&&x/1+y/Sqrt[3]<1&&x/-1+y/Sqrt[3]<1 (* trojkat *),
x^2+(y-Sqrt[3]/3)^2<1/4 (* koło o środku {0,Sqrt[3]/3} i promieniu R=1/2*)
},
{x,-2,2},{y,-2,2}]

CylindricalDecomposition[y>0&&x/1+y/Sqrt[3]<1&&x/-1+y/Sqrt[3]<1 &&x^2+(y-Sqrt[3]/3)^2>1/4 ,{x,y}]

pole=2*(Integrate[Integrate[1,{y,0,((3+3 x)/(Sqrt[3]))}],{x,-1,-1/2}]+Integrate[Integrate[1,{y,0,(1/(Sqrt[3]))-(1/2) (Sqrt[1-4 (x^2)])}],{x,-1/2,0}]+Integrate[Integrate[1,{y,(1/(Sqrt[3]))+(1/2) (Sqrt[1-4 (x^2)]),((3+3 x)/(Sqrt[3]))}],{x,-1/2,0}])

Simplify[%]

a^2 Sqrt[3]/4-Pi R^2/.{a->2,R->1/2}

Przykład 4: Znajdź granice całkowania dla stożka obrotowego o podstatwie kołowej z R=1 i wysokości H=1

Znalezienie granic całkowania w 3D okazuje się sporym problemem. Rozkład cylindryczny działa na szczęście w dowolnej liczbie wymiarów.

RegionPlot3D[z>0&&1-Sqrt[x^2+y^2]>z,{x,-3/2,3/2},{y,-3/2,3/2},{z,-1/2,3/2},PlotPoints->64]

CylindricalDecomposition[z>0&&1-Sqrt[x^2+y^2]>z,{x,y,z}]

Integrate[
Integrate[
Integrate[
1,{z,0,1-(Sqrt[(x^2)+(y^2)])}
],
{y,-(Sqrt[1-(x^2)]),(Sqrt[1-(x^2)])}
],
{x,-1,1}] (* Długotrwały rachunek !! *)

Integrate[
Integrate[
Integrate[
1,{z,0,H(1-(Sqrt[(x^2)+(y^2)])/R)}
],
{y,-(Sqrt[R^2-(x^2)]),(Sqrt[R^2-(x^2)])}
],
{x,-R,R}](* Długotrwały rachunek !! *)

Refine[%,R>0]

Całkowanie numeryczne

Oblicz (∫_0^e)(x^x)dx

Aby odróżnić całkowanie numeryczne od symbolicznego polecenie nazywa się NIntegrate. Zwracam uwagę, że polecenia poniżej różnią się:

N[Integrate[x^x,{x,0,E}]]

NIntegrate[x^x,{x,0,E}]

W pierwszym przykładzie, całka najpierw została obliczona symbolicznie, a następnie wynik zamieniony na liczbę zmiennoprzecinkową. W przypadku całek które bardzo długo liczą się symbolicznie (często bez rezultatu), tracimy bezowocnie sporo czasu:

N[Integrate[x^x,{x,0,E}]]//Timing

NIntegrate[x^x,{x,0,E}]//Timing

Integrate[x^x,{x,0,E}]

Przypominam, że całka oznaczona to pole pod wykresem krzywej:

Plot[x^x,{x,0,E},PlotRange->{0,All},Filling->Bottom]

xTBL=Table[x,{x,0,3,1/8}]

yTBL=Table[y,{y,0,16,1}]

Plot[x^x,{x,0,E},PlotRange->{0,All},Filling->Bottom,GridLines->{xTBL,yTBL}]

Narysuj wykres funkcji f[t]=(∫_(-∞)^t)|x((|)^x)dx

f=Function[t,NIntegrate[Abs[x]^x,{x,-Infinity,t}]]

Plot[f[x],{x,-4,4}]

Table[f[x],{x,2,3,0.01}]

g=Function[t,NIntegrate[Abs[x]^x,{x,0,t}]]

Plot[g[x],{x,-4,4}]

h=Function[t,NIntegrate[Abs[x]^x,{x,-Infinity,t},Method->"DoubleExponential"]]

Plot[h[x],{x,-4,4}]

Obliczenia pól i momentów bezwładności figur płaskich

Uwagi na temat roli liczb zespolonych i stałej całkowania

Prosta, ciągła funkcja:

w=(4+2 x + x^2)/(17+2 x-7x^2+x^4)

Plot[w,{x,-5,5},PlotRange->All]

Ekstrema wyrażenia w:

D[w,x] //Simplify //Numerator

Solve[%==0,x] //N (* To nie jest 2 ! *)

Jej całka powinna być funkcją ciągłą:

Integrate[w,x]

calka1=(%//Simplify) /. x->t

Plot[calka1,{t,-5,5}]

Obliczenie całki oznaczonej po osi rzeczywistej rozwiązuje problem częściowo:

calka2=Assuming[ t∈Reals, Integrate[w,{x,0,t}] ]

(* calka3=Integrate[w,{x,-2,t}] TIMEOUT!!!! *)

Całka obliczana numerycznie. (:= oznacza ,,opóźnione'' wywołanie funkcji NIntegrate )

calka4 := NIntegrate[w,{x,0,t}]

Co ciekawe, każda całka oznaczona o ustalonych granicach jest obliczana analitycznie:

Table[{t,Integrate[w,{x,0,t}]},{t,-10,10,1/2}]

calka5=%//Interpolation

Oto wynik z Maple12:

calka6 = ArcTan[5/3-x-1/3*x^2+1/3*x^3]+ArcTan[x-1]-ArcTan[5/3]+1/4*Pi (* Wynik z Maple12: int((4+2*x+x^2)/(17+2*x-7*x^2+x^4),x=0..t);*)

p1=Plot[Tooltip[calka1,"Integrate[w,x] "],{t,-10,10}]

p4=Plot[calka4,{t,-10,10}]

p5=Plot[calka5[t],{t,-10,10}]

p6=Plot[calka6,{x,-10,10}]

Show[p1, p5,p4,p6,PlotRange->All]

Plot3D[Re[w /. x->a+b I],{a,-5,5},{b,-1,1},PlotRange->{-5,5},PlotPoints->{100,20}]

x/.Solve[Denominator[w]==0,x] //N

bieguny = {Re[%],Im[%]}//Transpose

Manipulate[Show[ListPlot[bieguny],Graphics[Circle[{0,0},r]],PolarPlot[NIntegrate[w,{x,0,r Cos[ϕ]+I r Sin[ϕ]},PrecisionGoal->2]//Abs,{ϕ,0,2 Pi},PlotStyle->Red,PlotPoints->8],PlotRange->{{-3,3},{-3,3}},AspectRatio->1,PlotLabel->"r="<>ToString[r]],{{r,1},0,3,0.1}]

Plot3D[Re[calka1 /.t->a+b I],{a,-5,5},{b,-1,1},PlotRange->{-4,4},PerformanceGoal->"Quality", PlotPoints->{400,20}]

Plot3D[Re[calka6 /.x->a+b I],{a,-5,5},{b,-1,1},PlotRange->{-4,4},PerformanceGoal->"Quality", PlotPoints->{400,20}]

Manipulate[Plot[{Re[calka6 /.x->a+b I],Re[calka1 /.t->a+b I],Im[calka6 /.x->a+b I],Im[calka1 /.t->a+b I]},{a,-5,5},PlotRange->{-4,4},PlotPoints->50,PlotStyle->{{Red},{Blue},{Red,Dashed},{Blue,Dotted}}],{{b,0},-1,1}]

D[calka1,t] //Simplify

D[calka6,x] //Simplify

Plot[{calka1 /. t->x, calka6},{x,-5,5}]

(calka1 /. t->x)-calka6 //FullSimplify

Plot[%,{x,-5,5}]