Algebra Symboliczna
Wykład IV

Andrzej Odrzywolek
Instytut Fizyki, Zakład Teorii Względnosci i Astrofizyki
11,11,2008, środa, 13:15

Nowa strona wykładu: http://ribes.if.uj.edu.pl/alsymb/

Dane kontaktowe

dr Andrzej Odrzywołek
pokój 447, IV pietro
E-mail: odrzywolek@th.if.uj.edu.pl
Wykład: środy 13.15-15.00, sala 128
Cwiczenia: piątki 10.30-12.00
Konsultacje: środy 11-13, czwartki 12-13
WWW: http://ribes.if.uj.edu.pl/alsymb/

Najczesciej wykonywane symbolicznie zadania

Całka oznaczona, np: (∫_0^π)Sin[x]dx

Integrate[Sin[x],{x,0,Pi}]

Rozwiązanie równania, np: (x^4)=4

Solve[x^4==4,x]

Reduce[x^4==4,x]

FindInstance[x^4==4,x] (* czy równanie ma jakiekolwiek rozwiązanie *)

Upraszczanie/przekształcanie wyrazeń

TrigExpand[Sin[4 x]]

ExpToTrig[Exp[x]]

TrigToExp[Cos[x]]

PowerExpand[Log[(x /y)^m]]

Simplify[a^2+ 2a b + b^2]

Factor[x^4+x^2 + 1]

Simplify[Gamma[n+1],Assumptions->n∈Integers&&n>0]

FullSimplify[Gamma[n+1],Assumptions->n∈Integers&&n>0]

Expand[(1+x)^6]

Pochodna funkcji

D[Tan[x],x] (* pochodna Tan[x] po x *)

D[Sin[a x],{x,25}] (* 25-ta pochodna po x funkcji Sin[a x] *)

D[Exp[x^2+y^2],x,y] (* druga pochodna cząstkowa wyrażenia *)

Integrate[f'[x],{x,x1,x2}] (* podstawowy wzór rachunku całkowego *)

Granice

Limit[Sin[x]/x,x->0]

Limit[Exp[-1/x],x->0]

Limit[FresnelS[x],x->Infinity]

Czy MATHEMATICA obliczyła poniższe granice czy nie?

Limit[(FresnelS[x]-1/2)/Exp[-x],x->Infinity]

Limit[(FresnelS[x]-1/2)/Log[1+1/x],x->Infinity]

Najczęściej wykonywane numerycznie zadania

Całka oznaczona np: (∫_0^π)Sin[x]dx

NIntegrate[Sin[x],{x,0,Pi}]

Manipulate[NIntegrate[If[x^n+y^n<1,1,0],{x,0,Infinity},{y,0,Infinity}],{n,2,10,1}]

Numeryczne rozwiązanie równania

FindRoot[Exp[x]==Sin[x],{x,1}] (* punkt startowy x=-1 *)

Rzeczywiste rozwiazania układu równań x^2 + y^2 == 4, Log[x] + Log[y] == -1:

ContourPlot[{x^2+y^2==4, Log[x]+Log[y]==-1},{x,0,3},{y,0,3}]

Z wykresu odczytujemy wartości startowe:

FindRoot[{x^2+y^2==4, Log[x]+Log[y]==-1},{{x,2},{y,0.2}}]

FindRoot[{x^2+y^2==4, Log[x]+Log[y]==-1},{{x,0.2},{y,2}}]

Interpolacja wyników w celu zdefiniowania własnej funkcji:

sin={{0,0},{Pi/6,1/2},{Pi/4,Sqrt[2]/2},{Pi/3,Sqrt[3]/2},{Pi/2,1}}//Interpolation

Plot[{sin[x],Sin[x]},{x,0,Pi/2}]

Powody implementacji i używania metod numerycznych w CAS

Obliczenia numeryczne czesto prowadza do wyniku szybciej, np. obliczenie całki oznaczonej z funkcji o „banalnym’' przebiegu

Wiekszosc problemów nie posiada rozwiazania analitycznego

Zwykle ostatecznym celem jest uzyskanie wyniku liczbowego

Stosuje się algorytmy o ustabilizowanej reputacji. Algorytmy „niepewne” nie sa używane.

Dysponujemy metodami graficznymi  pozwalajacymi na relatywnie łatwe testowanie wyników pod katem poprawnosci

Gigantyczna i ciagle rosnaca moc obliczeniowa komputerów pozwala na obliczenia numeryczne w czasie rzeczywistym, w sposób nieomal nieodróżnialny od obliczeń analitycznych

Obliczenia symboliczne vs numeryczne

Liczba zmiennoprzecinowa zawsze posiada skończoną precyzję numeryczną. Jeżeli wymagana jest ,,nieskończona'' precyzja rachunki należy wykonywać na liczbach wymiernych.

Pi1=3.141592653589793

Pi2 = 3141592653589793/10^15

Precision[Pi1]

$MachinePrecision

Precision[Pi2]

Liczba 0.1 nie ma swojego odpowiednika w systemie dwójkowym. Dlatego każdy współczesny komputer będzie powodował błędy operując na podobnych liczbach; uzycie wymiernej liczby 1/10 nie wprowadza zadnych błędów.

BaseForm[0.1,2]

2^^0.00011001100110011001101 //FullForm

Nest[10 #^2&,0.1,60] (* 10*x^2 *)

Nest[10 #^2&,0.1``50,60]

Nest[10 #^2&,1/10,100]

Wyrażenia logiczne

Koniunkcja (zachodzi A i B)

A&&B

And[A,B]

Alternatywa (zachodzi A lub B)

A||B

Or[A,B]

Negacja (nie zachodzi A)

!A

Not[A]

Równość:

A==B

Nierówność (!=)

A≠B

Przykład uproszczenia wyrażenia logicznego:

!(!A||!B) (* prawo De'Morgana *)

Simplify[%]

!(A&&B||C)&&(!C&&!A&&B)&&A

Simplify[%]

Nakładanie warunków na wyrażenia ($Assumptions):

Sqrt[a^2] //Simplify

$Assumptions=a>0&&a∈Reals

Sqrt[a^2] //Simplify

Uwagi na temat roli liczb zespolonych na przykładzie 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}]

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}]

Wnioski z przykładu

MATHEMATICA operuje w dziedzinie zespolonej !

Nawet w przypadkach problemów czysto rzeczywistych odbija się to na wynikach. Prosty przykład w którym istnienie osobliwości funkcji dla x=I i x=-I powoduje niezrozumiałą (na pierwszy rzut oka) odpowiedź:

f=1/(1+x^2)

Integrate[f,{x,-1,t}] (* MATHEMATICA nie zakłada że t jest rzeczywiste. Ponieważ mamy osobliwości w I i -I wynik zależy od drogi po której będziemy całkować *)

Assuming[t∈Reals,Integrate[f,{x,-1,t}]] (* tylko dla t rzeczywistego wynik okazuje się (w tym przypadku ) jednoznaczny i możliwy do zapisania analitycznie*)

Prawidłowa odpowiedź na zadanie polegające na obliczeniu całki nie jest prosta. Na ogół szczegóły wynikają dopiero z kontekstu. Może chodzić o:
a) funkcję pierwotną, czyli taką która po zróżniczkowaniu daje f. podcałkową - istnieje nieskończenie wiele takich funkcji różniących się o dowolną funkcję kawałkami stała (sprawdzamy wynik poprzez różniczkowanie )
b) całkę oznaczoną w sensie całki riemanna (sprawdzamy poprzez NIntegrate i metody graficzne)
c) całkę po drodze zespolonej z ,,dobrej'' funkcji (należy uważać na konwencje dotyczące drogi, tzw ,,cięcia'', należy narysować
wykresy f. podcałkowej i ,,całki'' na płaszczyźnie zepolonej
d) całkę oznaczoną zdefiniowaną po drodze na płaszczyźnie lub w przestrzeni: jest ona liczona po odcinku linii prostej ; każdą inną drogę należy zdefiniować explicite . Przykład:

z

f[z_]:=1/z

Integrate[f[z],{z,-1,1}] (* całka po linii prostej przechodzi przez zero *)

Integrate[f[z],{z,-1,I,1}] (* omijamy zero oporzez punkt z=I *)

Integrate[f[Exp[I ϕ]] I Exp[I ϕ],{ϕ,0,Pi}]  (* całka po okręgu, musimy wpisać explicite:  z=Exp[I ϕ], dz = I Exp[I ϕ] dϕ *)

W MATHEMATICE ,,stała całkowania'' oznacza w rzeczywistości funkcję kawałkami stałą

Większość całek których ,,nie liczy'' MATHEMATICA ma charakter opisany powyżej. Jeżeli rzeczywiście istotne jest aby
podać wynik w postaci jednego wyrażenia analitycznego może oznaczać to sporo ,,ręcznego'' poprawiania , sklejania i przekształcania wzorów. Mamy w zamian cały szereg innych możliwości:
a) całka w postaci funkcji ,,posklejanej '' (np: Piecewise)
b) numeryczne obliczenie całki poprzez NIntegrate lub wręcz bezpośrednio z definicji np. metodą prostokątów:

f:=Exp[-x^2]&

Manipulate[Sum[f[x] dx, {x , -10,10,dx}],{dx,{0.01,0.1,1.0}}]

NIntegrate[f[x],{x,-Infinity,Infinity}]

c) tablicę analitycznie obliczonych całek oznaczonych:

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

Table[{t,Integrate[w,{x,0,t}]},{t,-Pi, Pi,Pi/2}] //Simplify//MatrixForm

Należy dobrze rozumieć co to jest całka i umieć interpretować wyniki generowane przez MATHEMATICĘ:

Plot[1/(z^52+z^49-z^29-z^26-z^23+z^3+1),{z,0,1}]

Integrate[1/(z^52+z^49-z^29-z^26-z^23+z^3+1),{z,0,1}] (* to musi być liczba rzeczywista !*)

N[%]