Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Code Session 1: Raízes de polinômios

import numpy as np, matplotlib.pyplot as plt 

Determinação de raízes de polinômios

roots

A função roots computa as raízes de uma função dentro de um intervalo dado usando o método de Hörner. O único argumento de entrada desta função é

  1. o array p com os coeficientes dos termos do polinômio.

P(x)=pnxn+pn1xn1++p1x+p0P(x) = p_n x^n + p_{n-1} x^{n-1} + \ldots + p_1x + p_0

O argumento de saída é:

  • x: array com as raízes de P(x)P(x).

Problema 1

Determine as raízes de P(x)=3x3+7x236x+20P(x) = 3x^3 +7x^2 - 36x + 20.

Resolução

Para tornar claro, em primeiro lugar, vamos inserir os coeficientes de P(x)P(x) em um array chamado p.

p = np.array([9,8,7,5,3,2,-1,-3.2,-4/5,])

Em seguida, fazemos:

x = np.roots(p)

Podemos imprimir as raízes da seguinte forma:

for (i, v) in enumerate(x):
    print(f'Raiz {i}: {v}')
Raiz 0: (0.426649114634354+0.8028394391214162j)
Raiz 1: (0.426649114634354-0.8028394391214162j)
Raiz 2: (0.6712830069677376+0j)
Raiz 3: (-0.3125768604422944+0.8705110785366041j)
Raiz 4: (-0.3125768604422944-0.8705110785366041j)
Raiz 5: (-0.7511803685416445+0.3009598192701512j)
Raiz 6: (-0.7511803685416445-0.3009598192701512j)
Raiz 7: (-0.28595566715745535+0j)

polyval

Podemos usar a função polyval do numpy para avaliar P(x)P(x) em x=x0x = x_0. Verifiquemos, analiticamente, se as raízes anteriores satisfazem realmente o polinômio dado.

for i in x: 
    v = np.polyval(p,i)
    print(f'P(x) = {v}')
P(x) = (1.4876988529977098e-14+2.2641699942273092e-14j)
P(x) = (1.4876988529977098e-14-2.2641699942273092e-14j)
P(x) = (1.7763568394002505e-15+0j)
P(x) = (-3.219646771412954e-15+5.5914131963424615e-15j)
P(x) = (-3.219646771412954e-15-5.5914131963424615e-15j)
P(x) = (1.4432899320127035e-15-1.1174243801115226e-15j)
P(x) = (1.4432899320127035e-15+1.1174243801115226e-15j)
P(x) = 0j

Note que as duas últimas raízes são “muito próximas” de zero, mas não exatamente zero.

Podemos também fazer uma verificação geométrica plotando o polinômio e suas raízes.

xx = np.linspace(np.min(x)-0.5,np.max(x)+0.5)
plt.plot(xx,np.polyval(p,xx));
for i in x:
    plt.plot(i,np.polyval(p,i),'or')
<Figure size 640x480 with 1 Axes>

Problema 2

Determine as raízes de P(x)=x43x2+3xP(x) = x^4 - 3x^2 + 3x.

Resolução

Resolvendo diretamente com roots e usando polyval para verificação, temos:

# coeficientes e raízes
p = np.array([1,0,-3,3,0])
x = np.roots(p)
# imprimindo as raizes
for i, v in enumerate(x):
    print(f'Raiz {i}: {v}')
Raiz 0: (-2.1038034027355375+0j)
Raiz 1: (1.0519017013677685+0.5652358516771713j)
Raiz 2: (1.0519017013677685-0.5652358516771713j)
Raiz 3: 0j

Note que, neste caso, as raízes são complexas.

Problema 3

Determine as raízes de P(x)=x530x4+361x32178x2+6588x7992P(x) = x^5 - 30x^4 + 361x^3 - 2178x^2 + 6588x - 7992.

Resolução

# coeficientes e raízes
p = np.array([1,-30,361,-2178,6588,-7992])
x = np.roots(p)
# imprimindo as raizes
for i, v in enumerate(x):
    print(f'Raiz {i}: {v}')
Raiz 0: (5.999999999988843+0.9999999999938864j)
Raiz 1: (5.999999999988843-0.9999999999938864j)
Raiz 2: (6.000144446431264+0.0002502131793303477j)
Raiz 3: (6.000144446431264-0.0002502131793303477j)
Raiz 4: (5.999711107159799+0j)