Polinomi u pythonu

In [1]:
import platform
In [2]:
platform.platform()
Out[2]:
'Linux-5.4.143-1-MANJARO-x86_64-with-glibc2.33'
In [3]:
platform.python_version()
Out[3]:
'3.9.6'

Polinomi u numpy modulu

In [4]:
import numpy as np
In [5]:
np.__version__
Out[5]:
'1.20.3'
In [6]:
from pylab import *

S polinomima jedne varijable unutar numpy modula najjednostavnije je raditi preko poly1d klase koja olakšava rad s polinomima što se tiče pisanja koda.

$f(x)=x^5-3x^3-5x,\quad g(x)=x^2-x+1$

In [7]:
f=np.poly1d([1,0,-3,0,-5,0])
g=np.poly1d([1,-1,1])
In [8]:
print(f)
   5     3
1 x - 3 x - 5 x
In [9]:
print(g)
   2
1 x - 1 x + 1

Ako želimo neku drugu varijablu kod ispisa, onda to navedemo kod definiranja polinoma.

In [10]:
g1=np.poly1d([1,-1,1],variable='u')
In [11]:
print(g1)
   2
1 u - 1 u + 1

Koeficijenti polinoma

In [12]:
f.c
Out[12]:
array([ 1,  0, -3,  0, -5,  0])
In [13]:
g.c
Out[13]:
array([ 1, -1,  1])

f[k] je koeficijent uz potenciju $x^k$

In [14]:
f[3]
Out[14]:
-3
In [15]:
f[2]
Out[15]:
0
In [16]:
g[0]
Out[16]:
1

Stupanj polinoma

In [17]:
f.o
Out[17]:
5
In [18]:
g.o
Out[18]:
2

Računanje vrijednosti polinoma u točki

In [19]:
f(3)
Out[19]:
147
In [20]:
g(3)
Out[20]:
7
In [21]:
g(3.21)
Out[21]:
8.094100000000001

Derivacija polinoma

In [22]:
f.deriv()
Out[22]:
poly1d([ 5,  0, -9,  0, -5])
In [23]:
print(f.deriv())
   4     2
5 x - 9 x - 5
In [24]:
g.deriv()
Out[24]:
poly1d([ 2, -1])
In [25]:
print(g.deriv())
 
2 x - 1

Derivacije višeg reda

In [26]:
f.deriv(2)
Out[26]:
poly1d([ 20,   0, -18,   0])
In [27]:
print(f.deriv(2))
    3
20 x - 18 x
In [28]:
f.deriv(3)
Out[28]:
poly1d([ 60,   0, -18])
In [29]:
print(f.deriv(3))
    2
60 x - 18

Integral polinoma

In [30]:
f.integ()
Out[30]:
poly1d([ 0.16666667,  0.        , -0.75      ,  0.        , -2.5       ,
        0.        ,  0.        ])
In [31]:
print(f.integ())
        6        4       2
0.1667 x - 0.75 x - 2.5 x
In [32]:
g.integ()
Out[32]:
poly1d([ 0.33333333, -0.5       ,  1.        ,  0.        ])
In [33]:
print(g.integ())
        3       2
0.3333 x - 0.5 x + 1 x

Zbrajanje polinoma

In [34]:
f+g
Out[34]:
poly1d([ 1,  0, -3,  1, -6,  1])
In [35]:
print(f+g)
   5     3     2
1 x - 3 x + 1 x - 6 x + 1
In [36]:
(f+g)(3)
Out[36]:
154

Oduzimanje polinoma

In [37]:
f-g
Out[37]:
poly1d([ 1,  0, -3, -1, -4, -1])
In [38]:
print(f-g)
   5     3     2
1 x - 3 x - 1 x - 4 x - 1

Množenje polinoma

In [39]:
f*g
Out[39]:
poly1d([ 1, -1, -2,  3, -8,  5, -5,  0])
In [40]:
print(f*g)
   7     6     5     4     3     2
1 x - 1 x - 2 x + 3 x - 8 x + 5 x - 5 x

Potenciranje polinoma

In [41]:
f**3
Out[41]:
poly1d([   1,    0,   -9,    0,   12,    0,   63,    0,  -60,    0, -225,
          0, -125,    0,    0,    0])
In [42]:
print(f**3)
   15     13      11      9      7       5       3
1 x  - 9 x  + 12 x  + 63 x - 60 x - 225 x - 125 x

Polinom $f^3g+2f$

In [43]:
H=f**3*g+2*f
H
Out[43]:
poly1d([   1,   -1,   -8,    9,    3,  -12,   75,  -63,    3,   60, -285,
        225, -348,  125, -131,    0,  -10,    0])
In [44]:
print(H)
   17     16     15     14     13      12      11      10     9      8
1 x  - 1 x  - 8 x  + 9 x  + 3 x  - 12 x  + 75 x  - 63 x  + 3 x + 60 x
        7       6       5       4       3
 - 285 x + 225 x - 348 x + 125 x - 131 x - 10 x

suma koeficijenata polinoma $f^3g+2f$

In [45]:
H(1)
Out[45]:
-357

Dijeljenje polinoma

In [46]:
kvocijent, ostatak = f/g
In [47]:
kvocijent
Out[47]:
poly1d([ 1.,  1., -3., -4.])
In [48]:
print(kvocijent)
   3     2
1 x + 1 x - 3 x - 4
In [49]:
ostatak
Out[49]:
poly1d([-6.,  4.])
In [50]:
print(ostatak)
 
-6 x + 4
In [51]:
f/g
Out[51]:
(poly1d([ 1.,  1., -3., -4.]), poly1d([-6.,  4.]))

Nultočke polinoma

In [52]:
f.r
Out[52]:
array([-2.04757965e+00+0.j        ,  2.04757965e+00+0.j        ,
       -1.38777878e-17+1.09205421j, -1.38777878e-17-1.09205421j,
        0.00000000e+00+0.j        ])
In [53]:
g.r
Out[53]:
array([0.5+0.8660254j, 0.5-0.8660254j])

Dobivanje samo realnih nultočaka

In [54]:
nul_real = np.extract(f.r.imag == 0, f.r)
nul_real
Out[54]:
array([-2.04757965+0.j,  2.04757965+0.j,  0.        +0.j])

Ljepši zapis bez člana 0.j

In [55]:
only_real = lambda x: x.real
vector_real = np.vectorize(only_real)
In [56]:
vector_real(nul_real)
Out[56]:
array([-2.04757965,  2.04757965,  0.        ])

1. zadatak

Zadane su točke $(-2,0),(-1,1),(1,2),(2,3.89)$. Odredite polinom najmanjeg stupnja čiji graf prolazi kroz zadane točke.

Rješenje

In [57]:
import scipy.interpolate as scip
In [58]:
xkor=[-2,-1,1,2]
ykor=[0,1,2,3.89]
In [59]:
pol=scip.lagrange(xkor,ykor)
pol
Out[59]:
poly1d([0.1575    , 0.14833333, 0.3425    , 1.35166667])

Pazite, u print ispisu neki koeficijenti mogu biti ispisani s manjom preciznošću.

In [60]:
print(pol)
        3          2
0.1575 x + 0.1483 x + 0.3425 x + 1.352
In [61]:
pol.c
Out[61]:
array([0.1575    , 0.14833333, 0.3425    , 1.35166667])

slika

In [62]:
xp=np.arange(-2.5,2.5,0.01)
yp=pol(xp)
In [63]:
figure(figsize=(6,5))
grid(True)
plot(xp,yp,'b-',xkor,ykor,'ro',markersize=8,linewidth=2);

2. zadatak

Odredite sve nultočke polinoma $p(x)=-2x^7+3x^6+4x^5-5x^4+x^3+2x^2+8x+12.$

Rješenje

In [64]:
p=np.poly1d([-2,3,4,-5,1,2,8,12])

sve nultočke u polju $\mathbb{C}$

In [65]:
p.r
Out[65]:
array([ 2.13930159+0.j        ,  1.0936878 +0.92373329j,
        1.0936878 -0.92373329j, -0.24213151+0.97254029j,
       -0.24213151-0.97254029j, -1.26767181+0.j        ,
       -1.07474237+0.j        ])

samo realne nultočke

In [66]:
nul_real=np.extract(p.r.imag==0, p.r)
nul_real
Out[66]:
array([ 2.13930159+0.j, -1.26767181+0.j, -1.07474237+0.j])

ljepši zapis bez člana 0.j

In [67]:
only_real = lambda x: x.real
vector_real = np.vectorize(only_real)
In [68]:
nul_real=vector_real(nul_real)
nul_real
Out[68]:
array([ 2.13930159, -1.26767181, -1.07474237])

najveća realna nultočka

In [69]:
max(nul_real)
Out[69]:
2.1393015909951143

najmanja realna nultočka

In [70]:
min(nul_real)
Out[70]:
-1.267671807727639

slika

In [71]:
x1=np.arange(-1.5,2.2,0.04)
y1=p(x1)
In [72]:
figure(figsize=(7,6))
grid(True)
xlim(-1.6,2.3)
ylim(-15,45)
hlines(0,-1.6,2.3)
vlines(0,-15,45)
plot(x1,y1,'b-',linewidth=2)
plot(nul_real,[0,0,0],c='yellow',marker='h',ls='',ms=7,markeredgecolor='k');

3. zadatak

Razvijte polinom $p(x)=-2x^7+3x^6+4x^5-5x^4+x^3+2x^2+8x+12$ po potencijama od $x+5.$

Rješenje

In [73]:
import math
In [74]:
p=np.poly1d([-2,3,4,-5,1,2,8,12])

S obzirom da imamo dostupnu naredbu za traženje derivacija polinoma, možemo brzo dobiti koeficijente u razvoju koristeći formulu $c_k=\frac{p(k)(a)}{k!}$ pri čemu je $c_k$ koeficijent uz potenciju $(x-a)^k$.

In [75]:
razvoj=[p.deriv(k)(-5)/math.factorial(k) for k in range(p.o+1)]
razvoj
Out[75]:
[187397.0, -259937.0, 153612.0, -50149.0, 9770.0, -1136.0, 73.0, -2.0]

Element s indeksom $k$ u dobivenoj listi daje koeficijent $c_k$.

koeficijent uz potenciju $(x+5)^3$
In [76]:
razvoj[3]
Out[76]:
-50149.0
koeficijent uz potenciju $(x+5)^0$, tj. slobodni član
In [77]:
razvoj[0]
Out[77]:
187397.0

Također možemo koristiti i Hornerov algoritam

In [78]:
kv=p
lin=np.poly1d([1,5])
raz=[]
for k in range(p.o+1):
    kv,ost=kv/lin
    raz.append(ost[0])
In [79]:
raz
Out[79]:
[187397.0, -259937.0, 153612.0, -50149.0, 9770.0, -1136.0, 73.0, -2.0]

Možemo implementirati vlastite funkcije za brže rješavanje zadataka

Funkcije se nalaze u datoteci MMZI.py

Hornerov algoritam je brži od algoritma preko derivacija.

In [80]:
import sys
sys.path.append("..")
import MMZI
In [81]:
%time
MMZI.razvoj_der(p,-5)
CPU times: user 4 µs, sys: 0 ns, total: 4 µs
Wall time: 8.11 µs
Out[81]:
[187397.0, -259937.0, 153612.0, -50149.0, 9770.0, -1136.0, 73.0, -2.0]
In [82]:
%time
MMZI.razvoj_horner(p,-5)
CPU times: user 3 µs, sys: 0 ns, total: 3 µs
Wall time: 6.68 µs
Out[82]:
[187397.0, -259937.0, 153612.0, -50149.0, 9770.0, -1136.0, 73.0, -2.0]

4. zadatak

Odredite Ferrarijevu rezolventu algebarske jednadžbe 4. reda $-5x^4+2x^3-7x^2+4x-2=0.$

Rješenje

Implementirana funkcija se nalazi u datoteci MMZI.py

In [83]:
rez=MMZI.Ferrari_rezolventa([-5,2,-7,4,-2])
rez
Out[83]:
poly1d([-8.   ,  5.6  ,  2.56 , -1.536])
In [84]:
print(rez)
    3       2
-8 x + 5.6 x + 2.56 x - 1.536

U ovom slučaju rezolventa ima sva rješenja realna.

In [85]:
rez.r
Out[85]:
array([-0.54244289,  0.8       ,  0.44244289])

slika

In [86]:
x2=np.arange(-1,1.1,0.02)
y2=rez(x2)
In [87]:
q=np.poly1d([-5,2,-7,4,-2])
x3=np.arange(-1,1.5,0.02)
y3=q(x3)

Promatrani polinom 4. stupnja nema niti jednu realnu nultočku.

In [88]:
q.r
Out[88]:
array([-0.14494897+1.12644917j, -0.14494897-1.12644917j,
        0.34494897+0.43716388j,  0.34494897-0.43716388j])
In [89]:
figure(figsize=(14,6))
subplot(1,2,1)
title('Ferrarijeva rezolventa')
grid(True)
xlim(-1.1,1.1)
ylim(-2.3,10)
hlines(0,-1.1,1.1)
vlines(0,-2.3,10)
plot(x2,y2,'b-',linewidth=2)
plot(rez.r,[0,0,0],c='yellow',marker='h',ls='',ms=7,markeredgecolor='k')
subplot(1,2,2)
title('$f(x)=-5x^4+2x^3-7x^2+4x-2$')
grid(True)
xlim(-1.1,1.4)
ylim(-20,2)
hlines(0,-1.1,1.4)
vlines(0,-20,2)
plot(x3,y3,'b-',linewidth=2);

Polinomi u sympy modulu

In [90]:
import sympy as sp
In [91]:
sp.__version__
Out[91]:
'1.8'
In [92]:
sp.init_printing()
In [93]:
import matplotlib.pyplot as plt

Unutar sympy modula možemo raditi s polinomima kao simboličkim izrazima ili preko klase Poly prilagođene za rad s polinomima. Ovdje navodimo samo nekoliko osnovnih stvari koristeći klasu Poly.

In [94]:
x=sp.Symbol('x')
In [95]:
f=sp.Poly(x**5-3*x**3-5*x)
g=sp.Poly(x**2-x+1)
In [96]:
f
Out[96]:
$\displaystyle \operatorname{Poly}{\left( x^{5} - 3 x^{3} - 5 x, x, domain=\mathbb{Z} \right)}$
In [97]:
g
Out[97]:
$\displaystyle \operatorname{Poly}{\left( x^{2} - x + 1, x, domain=\mathbb{Z} \right)}$
In [98]:
f.as_expr()
Out[98]:
$\displaystyle x^{5} - 3 x^{3} - 5 x$
In [99]:
g.as_expr()
Out[99]:
$\displaystyle x^{2} - x + 1$

Koeficijenti polinoma

In [100]:
f.all_coeffs()
Out[100]:
$\displaystyle \left[ 1, \ 0, \ -3, \ 0, \ -5, \ 0\right]$
In [101]:
g.all_coeffs()
Out[101]:
$\displaystyle \left[ 1, \ -1, \ 1\right]$

na poziciji s indeksom $-(k+1)$ je koeficijent uz potenciju $x^k$

In [102]:
f.all_coeffs()[-4]
Out[102]:
$\displaystyle -3$
In [103]:
f.all_coeffs()[-3]
Out[103]:
$\displaystyle 0$
In [104]:
g.all_coeffs()[-1]
Out[104]:
$\displaystyle 1$

Stupanj polinoma

In [105]:
f.degree()
Out[105]:
$\displaystyle 5$
In [106]:
g.degree()
Out[106]:
$\displaystyle 2$

Računanje vrijednosti polinoma u točki

In [107]:
f(3)
Out[107]:
$\displaystyle 147$
In [108]:
g(3)
Out[108]:
$\displaystyle 7$
In [109]:
g(3.21)
Out[109]:
$\displaystyle 8.0941$

Derivacija polinoma

In [110]:
f.diff(x)
Out[110]:
$\displaystyle \operatorname{Poly}{\left( 5 x^{4} - 9 x^{2} - 5, x, domain=\mathbb{Z} \right)}$
In [111]:
f.diff(x).as_expr()
Out[111]:
$\displaystyle 5 x^{4} - 9 x^{2} - 5$
In [112]:
g.diff(x)
Out[112]:
$\displaystyle \operatorname{Poly}{\left( 2 x - 1, x, domain=\mathbb{Z} \right)}$
In [113]:
g.diff(x).as_expr()
Out[113]:
$\displaystyle 2 x - 1$

Derivacije višeg reda

In [114]:
f.diff((x,2))
Out[114]:
$\displaystyle \operatorname{Poly}{\left( 20 x^{3} - 18 x, x, domain=\mathbb{Z} \right)}$
In [115]:
f.diff((x,2)).as_expr()
Out[115]:
$\displaystyle 20 x^{3} - 18 x$
In [116]:
f.diff((x,3))
Out[116]:
$\displaystyle \operatorname{Poly}{\left( 60 x^{2} - 18, x, domain=\mathbb{Z} \right)}$
In [117]:
f.diff((x,3)).as_expr()
Out[117]:
$\displaystyle 60 x^{2} - 18$

Integral polinoma

In [118]:
f.integrate(x)
Out[118]:
$\displaystyle \operatorname{Poly}{\left( \frac{1}{6} x^{6} - \frac{3}{4} x^{4} - \frac{5}{2} x^{2}, x, domain=\mathbb{Q} \right)}$
In [119]:
f.integrate(x).as_expr()
Out[119]:
$\displaystyle \frac{x^{6}}{6} - \frac{3 x^{4}}{4} - \frac{5 x^{2}}{2}$
In [120]:
g.integrate(x)
Out[120]:
$\displaystyle \operatorname{Poly}{\left( \frac{1}{3} x^{3} - \frac{1}{2} x^{2} + x, x, domain=\mathbb{Q} \right)}$
In [121]:
g.integrate(x).as_expr()
Out[121]:
$\displaystyle \frac{x^{3}}{3} - \frac{x^{2}}{2} + x$

Zbrajanje polinoma

In [122]:
f+g
Out[122]:
$\displaystyle \operatorname{Poly}{\left( x^{5} - 3 x^{3} + x^{2} - 6 x + 1, x, domain=\mathbb{Z} \right)}$
In [123]:
(f+g).as_expr()
Out[123]:
$\displaystyle x^{5} - 3 x^{3} + x^{2} - 6 x + 1$
In [124]:
(f+g)(3)
Out[124]:
$\displaystyle 154$

Oduzimanje polinoma

In [125]:
f-g
Out[125]:
$\displaystyle \operatorname{Poly}{\left( x^{5} - 3 x^{3} - x^{2} - 4 x - 1, x, domain=\mathbb{Z} \right)}$
In [126]:
(f-g).as_expr()
Out[126]:
$\displaystyle x^{5} - 3 x^{3} - x^{2} - 4 x - 1$

Množenje polinoma

In [127]:
f*g
Out[127]:
$\displaystyle \operatorname{Poly}{\left( x^{7} - x^{6} - 2 x^{5} + 3 x^{4} - 8 x^{3} + 5 x^{2} - 5 x, x, domain=\mathbb{Z} \right)}$
In [128]:
(f*g).as_expr()
Out[128]:
$\displaystyle x^{7} - x^{6} - 2 x^{5} + 3 x^{4} - 8 x^{3} + 5 x^{2} - 5 x$

Potenciranje polinoma

In [129]:
f**3
Out[129]:
$\displaystyle \operatorname{Poly}{\left( x^{15} - 9 x^{13} + 12 x^{11} + 63 x^{9} - 60 x^{7} - 225 x^{5} - 125 x^{3}, x, domain=\mathbb{Z} \right)}$
In [130]:
(f**3).as_expr()
Out[130]:
$\displaystyle x^{15} - 9 x^{13} + 12 x^{11} + 63 x^{9} - 60 x^{7} - 225 x^{5} - 125 x^{3}$

Polinom $f^3g+2f$

In [131]:
H=f**3*g+2*f
H
Out[131]:
$\displaystyle \operatorname{Poly}{\left( x^{17} - x^{16} - 8 x^{15} + 9 x^{14} + 3 x^{13} - 12 x^{12} + 75 x^{11} - 63 x^{10} + 3 x^{9} + 60 x^{8} - 285 x^{7} + 225 x^{6} - 348 x^{5} + 125 x^{4} - 131 x^{3} - 10 x, x, domain=\mathbb{Z} \right)}$
In [132]:
H.as_expr()
Out[132]:
$\displaystyle x^{17} - x^{16} - 8 x^{15} + 9 x^{14} + 3 x^{13} - 12 x^{12} + 75 x^{11} - 63 x^{10} + 3 x^{9} + 60 x^{8} - 285 x^{7} + 225 x^{6} - 348 x^{5} + 125 x^{4} - 131 x^{3} - 10 x$

suma koeficijenata polinoma $f^3g+2f$

In [133]:
H(1)
Out[133]:
$\displaystyle -357$

Dijeljenje polinoma

In [134]:
sp.div(f,g)
Out[134]:
$\displaystyle \left( \operatorname{Poly}{\left( x^{3} + x^{2} - 3 x - 4, x, domain=\mathbb{Z} \right)}, \ \operatorname{Poly}{\left( -6 x + 4, x, domain=\mathbb{Z} \right)}\right)$
In [135]:
kvocijent,ostatak=sp.div(f,g)
In [136]:
kvocijent.as_expr()
Out[136]:
$\displaystyle x^{3} + x^{2} - 3 x - 4$
In [137]:
ostatak.as_expr()
Out[137]:
$\displaystyle 4 - 6 x$

S obzirom da za polinome s koeficijentima iz nekog prstena ne vrijedi općenito teorem o dijeljenju, sympy po potrebi polinome s cjelobrojnim koeficijentima gleda kao na polinome s racionalnim koeficijentima prilikom dijeljenja.

In [138]:
h=sp.Poly(3*x**2-x+5)
h.as_expr()
Out[138]:
$\displaystyle 3 x^{2} - x + 5$
In [139]:
sp.div(f,h)
Out[139]:
$\displaystyle \left( \operatorname{Poly}{\left( \frac{1}{3} x^{3} + \frac{1}{9} x^{2} - \frac{41}{27} x - \frac{56}{81}, x, domain=\mathbb{Q} \right)}, \ \operatorname{Poly}{\left( \frac{154}{81} x + \frac{280}{81}, x, domain=\mathbb{Q} \right)}\right)$

Možemo prisiliti sympy da dijeljenje obavi nad prstenom cijelih brojeva, međutim vidimo da onda ne vrijedi teorem o dijeljenju polinoma, tj. stupanj ostatka nije strogo manji od stupnja polinoma s kojim se dijelilo.

In [140]:
sp.div(f,h,domain='ZZ')
Out[140]:
$\displaystyle \left( \operatorname{Poly}{\left( 0, x, domain=\mathbb{Z} \right)}, \ \operatorname{Poly}{\left( x^{5} - 3 x^{3} - 5 x, x, domain=\mathbb{Z} \right)}\right)$

Nultočke polinoma

Egzaktno općenito nije moguće uvijek pronaći sve nultočke.

In [141]:
f.all_roots()
Out[141]:
$\displaystyle \left[ \operatorname{CRootOf} {\left(x^{4} - 3 x^{2} - 5, 0\right)}, \ 0, \ \operatorname{CRootOf} {\left(x^{4} - 3 x^{2} - 5, 1\right)}, \ \operatorname{CRootOf} {\left(x^{4} - 3 x^{2} - 5, 2\right)}, \ \operatorname{CRootOf} {\left(x^{4} - 3 x^{2} - 5, 3\right)}\right]$

Numeričkim putem možemo pronaći sve nultočke polinoma.

In [142]:
f.nroots()
Out[142]:
$\displaystyle \left[ -2.04757964523172, \ 0.0, \ 2.04757964523172, \ - 1.09205421274186 i, \ 1.09205421274186 i\right]$

Samo realne nultočke

In [143]:
list(filter(lambda x: sp.im(x)==0, f.nroots()))
Out[143]:
$\displaystyle \left[ -2.04757964523172, \ 0.0, \ 2.04757964523172\right]$

Pomoću solve naredbe moguće je egzaktno riješiti algebarsku jednadžbu 4. reda i u ovom slučaju egzaktno pronaći sve nultočke polinoma $f$.

In [144]:
sp.solve(f.as_expr(),x)
Out[144]:
$\displaystyle \left[ 0, \ - i \sqrt{- \frac{3}{2} + \frac{\sqrt{29}}{2}}, \ i \sqrt{- \frac{3}{2} + \frac{\sqrt{29}}{2}}, \ - \sqrt{\frac{3}{2} + \frac{\sqrt{29}}{2}}, \ \sqrt{\frac{3}{2} + \frac{\sqrt{29}}{2}}\right]$

Ako želimo samo realne nultočke

In [145]:
y=sp.Symbol('y',real=True)
In [146]:
sp.solve(f.as_expr(y),y)
Out[146]:
$\displaystyle \left[ 0, \ - \sqrt{\frac{3}{2} + \frac{\sqrt{29}}{2}}, \ \sqrt{\frac{3}{2} + \frac{\sqrt{29}}{2}}\right]$

Najveća zajednička mjera polinoma

In [147]:
f=x**4+x**3+2*x**2+x+1
g=x**3-2*x**2+x-2
f=f.as_poly()
g=g.as_poly()
In [148]:
f.as_expr()
Out[148]:
$\displaystyle x^{4} + x^{3} + 2 x^{2} + x + 1$
In [149]:
g.as_expr()
Out[149]:
$\displaystyle x^{3} - 2 x^{2} + x - 2$

$M(f,g)=x^2+1$

In [150]:
sp.gcd(f,g)
Out[150]:
$\displaystyle \operatorname{Poly}{\left( x^{2} + 1, x, domain=\mathbb{Z} \right)}$
In [151]:
sp.gcd(f,g).as_expr()
Out[151]:
$\displaystyle x^{2} + 1$

Prošireni Euklidov algoritam

$f(x)\cdot f_1(x)+g(x)\cdot g_1(x)=M(f,g)$

In [152]:
sp.gcdex(f,g)
Out[152]:
$\displaystyle \left( \operatorname{Poly}{\left( \frac{1}{7}, x, domain=\mathbb{Q} \right)}, \ \operatorname{Poly}{\left( - \frac{1}{7} x - \frac{3}{7}, x, domain=\mathbb{Q} \right)}, \ \operatorname{Poly}{\left( x^{2} + 1, x, domain=\mathbb{Q} \right)}\right)$
In [153]:
f1,g1,mjera=sp.gcdex(f,g)
In [154]:
f1.as_expr()
Out[154]:
$\displaystyle \frac{1}{7}$
In [155]:
g1.as_expr()
Out[155]:
$\displaystyle - \frac{x}{7} - \frac{3}{7}$
In [156]:
mjera.as_expr()
Out[156]:
$\displaystyle x^{2} + 1$

5. zadatak

Zadane su točke $(-2,0),(-1,1),(1,2),(2,3.89)$. Odredite polinom najmanjeg stupnja čiji graf prolazi kroz zadane točke.

Rješenje

Prikazani su različiti načini unosa za dobivanje željenog rezultata.

In [157]:
sp.interpolate([(-2,0),(-1,1),(1,2),(2,3.89)],x)
Out[157]:
$\displaystyle 0.1575 x^{3} + 0.148333333333333 x^{2} + 0.3425 x + 1.35166666666667$
In [158]:
sp.interpolate([(-2,0),(-1,1),(1,2),(2,sp.Rational(389,100))],x)
Out[158]:
$\displaystyle \frac{63 x^{3}}{400} + \frac{89 x^{2}}{600} + \frac{137 x}{400} + \frac{811}{600}$
In [159]:
sp.interpolate({-2:0,-1:1,1:2,2:3.89},x)
Out[159]:
$\displaystyle 0.1575 x^{3} + 0.148333333333333 x^{2} + 0.3425 x + 1.35166666666667$
In [160]:
sp.interpolate({-2:0,-1:1,1:2,2:sp.Rational(389,100)},x)
Out[160]:
$\displaystyle \frac{63 x^{3}}{400} + \frac{89 x^{2}}{600} + \frac{137 x}{400} + \frac{811}{600}$

Sympy modul nudi plot funkciju pomoću koje možemo brzo nacrtati graf neke funkcije. Na slici je prikazan graf interpolacijskog polinoma. Ako želimo dodati na sliku i početne točke, tada je bolje da koristimo matplotlib modul direktno kako je ranije pokazano.

In [161]:
f=sp.interpolate([(-2,0),(-1,1),(1,2),(2,3.89)],x)
sp.plot(f,(x,-2.5,2.5));

6. zadatak

Odredite sve nultočke polinoma $p(x)=-2x^7+3x^6+4x^5-5x^4+x^3+2x^2+8x+12.$

Rješenje

In [162]:
p=-2*x**7+3*x**6+4*x**5-5*x**4+x**3+2*x**2+8*x+12
p=p.as_poly()

sve nultočke u polju $\mathbb{C}$

In [163]:
p.nroots()
Out[163]:
$\displaystyle \left[ -1.26767180772764, \ -1.07474236732802, \ 2.13930159099512, \ -0.242131509213649 - 0.972540285478488 i, \ -0.242131509213649 + 0.972540285478488 i, \ 1.09368780124392 - 0.923733294950994 i, \ 1.09368780124392 + 0.923733294950994 i\right]$

samo realne nultočke

In [164]:
samo_realne=list(filter(lambda x: sp.im(x)==0, p.nroots()))
samo_realne
Out[164]:
$\displaystyle \left[ -1.26767180772764, \ -1.07474236732802, \ 2.13930159099512\right]$

najveća realna nultočka

In [165]:
max(samo_realne)
Out[165]:
$\displaystyle 2.13930159099512$

najmanja realna nultočka

In [166]:
min(samo_realne)
Out[166]:
$\displaystyle -1.26767180772764$

slika

In [167]:
plt.rcParams['figure.figsize'] = 10,7
In [168]:
sp.plot(p.as_expr(),(x,-1.5,2.2),adaptive=False,nb_of_points=150);

7. zadatak

Razvijte polinom $p(x)=-2x^7+3x^6+4x^5-5x^4+x^3+2x^2+8x+12$ po potencijama od $x+5.$

Rješenje

In [169]:
p=-2*x**7+3*x**6+4*x**5-5*x**4+x**3+2*x**2+8*x+12
razvoj=p.series(x,-5,8)
razvoj
Out[169]:
$\displaystyle - 259937 x - 2 \left(x + 5\right)^{7} + 73 \left(x + 5\right)^{6} - 1136 \left(x + 5\right)^{5} + 9770 \left(x + 5\right)^{4} - 50149 \left(x + 5\right)^{3} + 153612 \left(x + 5\right)^{2} - 1112288$

U gornjem zapisu je nezgodno što nije posebno izdvojen član $x+5$. Možemo tome doskočiti jednostavnim trikom sa supstitucijom.

In [170]:
u=sp.Symbol('u')
raz=razvoj.subs({x:u-5})
raz
Out[170]:
$\displaystyle - 2 u^{7} + 73 u^{6} - 1136 u^{5} + 9770 u^{4} - 50149 u^{3} + 153612 u^{2} - 259937 u + 187397$

Član uz $(x+5)^1$

In [171]:
raz.coeff(u,1)
Out[171]:
$\displaystyle -259937$

Član uz $(x+5)^0$

In [172]:
raz.coeff(u,0)
Out[172]:
$\displaystyle 187397$

Član uz $(x+5)^4$

In [173]:
raz.coeff(u,4)
Out[173]:
$\displaystyle 9770$

8. zadatak

Odredite $a,b\in\mathbb{R}$ tako da $-2$ bude dvostruka nultočka polinoma $f(x)=x^4+2x^3+ax^2+(a+b)x+2.$

Rješenje

In [174]:
a,b=sp.symbols('a b')
f=x**4+2*x**3+a*x**2+(a+b)*x+2
f=f.as_poly()
In [175]:
f1=f.diff(x)
f1.as_expr()
Out[175]:
$\displaystyle 2 a x + a + b + 4 x^{3} + 6 x^{2}$

$f(-2)=0,\ f'(-2)=0$

In [176]:
eq1=f(-2).as_expr()
eq2=f1(-2).as_expr()
eq1,eq2
Out[176]:
$\displaystyle \left( 2 a - 2 b + 2, \ - 3 a + b - 8\right)$

$a=-\frac{7}{2},\ b=-\frac{5}{2}$

In [177]:
sp.linsolve([eq1,eq2],[a,b])
Out[177]:
$\displaystyle \left\{\left( - \frac{7}{2}, \ - \frac{5}{2}\right)\right\}$

Graf dobivenog polinoma

In [178]:
f_rj=f.subs({a:sp.Rational(-7,2),b:sp.Rational(-5,2)})
f_rj.as_expr()
Out[178]:
$\displaystyle x^{4} + 2 x^{3} - \frac{7 x^{2}}{2} - 6 x + 2$
In [179]:
sp.plot(f_rj.as_expr(),(x,-3,2.5));

nultočke

In [180]:
f_rj.nroots()
Out[180]:
$\displaystyle \left[ -2.0, \ -1.99999999999999, \ 0.292893218813452, \ 1.70710678118655\right]$
In [ ]: