>>> from sympy import *
>>> x, y, z, t, a, b, c = symbols('x, y, z, t, a, b, c')
4.3. Matematička analiza¶
Za simbolički pristup standardnim temama iz matematičke analize, poput limesa, nizova, redova, derivacija, integrala i diferencijalnih jednadžbi, koristimo sympy paket.
4.3.1. Limesi¶
Limesi se izvrijednjavaju funkcijom limit
:
>>> limit(sin(x)/x, x, 0)
1
>>> limit((1+1/x)**x, x, oo)
E
4.3.2. Razvoj u red¶
Taylorov razvoj neke funkcije po nekoj varijabli oko neke točke
do nekog reda radi funkcija series
:
>>> ser = series(sin(x), x, 0, 6); ser
x - x**3/6 + x**5/120 + O(x**6)
gdje je upotrijebljena standardna Landauova oznaka zanemarenog ostatka. S ovakvim se izrazom može dalje računati i ostatak apsorbira članove tog i višeg reda:
>>> ser + 1 + x**7
1 + x - x**3/6 + x**5/120 + O(x**6)
a ukoliko nam taj ostatak smeta, možemo ga maknuti metodom removeO
:
>>> ser.removeO()
x**5/120 - x**3/6 + x
Zadatak 1
Odredite Taylorov razvoj funkcije \(f(x) = \arctan(x^2+1)\) oko točke \(x=\infty\) do petog reda.
Zadatak 2
Kolika je relativna pogreška koju radimo ako za izvrijednjavanje \(f(2)=\arctan(5)\) koristimo red dobiven u gornjem zadatku? Da li bi greška bila manja da smo upotrebljavali razvoj do petog reda, ali oko \(x=0\)?
Zadatak 3
Za koji \(x\) greška razvoja funkcije \(f(x) = \arctan(x^2+1)\) do petog reda oko točke \(x=0\) postaje jednaka greški istog razvoja, ali oko točke \(x=\infty\)?
4.3.3. Derivacije¶
Deriviranje se radi funkcijom diff
>>> diff(exp(2*x)*cos(3*x), x)
-3*exp(2*x)*sin(3*x) + 2*exp(2*x)*cos(3*x)
Višestruko deriviranje:
>>> diff(exp(2*x)*cos(3*x), x, 4)
(120*sin(3*x) - 119*cos(3*x))*exp(2*x)
Deriviranje izraza koji uključuje opću simboličku funkciju f(x)
, korištenjem
Leibnitzovog lančanog pravila:
>>> f = Function('f') # simboličke funkcije treba deklarirati
>>> df = diff(x**2 * f(x), x); df
x**2*Derivative(f(x), x) + 2*x*f(x)
>>> df.subs(f, sin)
x**2*Derivative(sin(x), x) + 2*x*sin(x)
>>> df.subs(f, sin).doit()
x**2*cos(x) + 2*x*sin(x)
4.3.4. Simboličko integriranje¶
Simboličko neodređeno integriranje (integriramo izraz koji smo gore dobili deriviranjem):
>>> integrate(-3*exp(2*x)*sin(3*x) + 2*exp(2*x)*cos(3*x), x)
exp(2*x)*cos(3*x)
Primijetite da se konstanta integracije podrazumijeva bez navođenja.
Simboličko rješavanje određenih integrala:
integrate(x*log(x), (x, 0, 1))
-1/4
Zadatak 4
Izračunajte neodređeni integral
i onda provjerite dobiveni rezultat deriviranjem i algebarskim manipulacijama.
Zadatak 5
Izračunajte (simbolički) dvostruki određeni integral
Zadatak 6
Izračunajte dvostruki neodređeni integral
i provjerite rezultat deriviranjem.
4.3.5. Numeričko integriranje¶
Neki integrali su preteški ili se naprosto ne daju prikazati u zatvorenoj formi pa sympy vraća zadani izraz:
>>> integrate(atan(gamma(x)), (x, 0, 1))
Integral(atan(gamma(x)), (x, 0, 1))
Tada nam preostaje numerička integracija. U paketu scipy.integrate
ima
nekoliko rutina za numeričku integraciju. Npr. quad
daje rezultat kao tupl.
Prvi element tupla je rezultat integracije, a drugi procijenjena greška.
>>> import scipy.integrate
>>> scipy.integrate.quad(lambdify(x, atan(gamma(x))), 0, 1)
(1.1020657425550973, 2.3166346669288508e-14)
Zadatak 7
Izračunajte integral
simbolički i numerički i usporedite rezultate.
Naputak: oo
je simbolička beskonačnost, a za potrebe numeričke
integracije, beskonačnost je reprezentirana kao np.inf
.