20. Wielomiany i ich własności
Treści kształcenia. Wielomiany: dzielenie pisemne wielomianów, schemat Hornera i jego zastosowanie do wyliczania wartości w punkcie i dzielenia przez dwumian, schemat Hornera jako algorytm - zapis w pseudokodzie. Pierwiastek wielomianu i jego krotność, wzory Viete’a i ich wykorzystanie w obliczeniach komputerowych (zamiast wzorów na oba pierwiastki - “zero maszynowe”).
Efekty kształcenia. Student potrafi wykonywać podstawowe operacje na wielomianach, w szczególności niezbędne w informatyce (np. schemat Hornera). Potrafi wykorzystać wzory Vieta.
Podczas zajęć 20 przypomnimy sobie i nieco rozszerzymy informacje o wielomianach i ich znaczeniu w informatyce. Pełnią one tam bardzo ważną rolę z prostego powodu: wartość wielomianu można obliczyć wykonując tylko mnożenie i dodawanie, możemy to zatem zrobić za pomocą komputera. Później na analizie matematycznej dowiemy się, że bardzo wiele funkcji można ,,przybliżać’’ wielomianami i ponadto kontrolować przy tym błąd, jaki popełniamy podczas takiego przybliżania.
Wielomiany¶
Definicja wielomianu jednej zmiennej rzeczywistej¶
Funkcję nazywamy wielomianem jednej zmiennej rzeczywistej (w skrócie wielomianem), gdy istnieją oraz takie, że
Liczby nazywamy współczynnikami wielomianu .
Dwa wielomiany uznajemy za równe wtedy i tylko wtedy, gdy są one równe jako funkcje (co sprowadza się do tego, że mają takie same współczynniki).
Uwaga:
Wielomiany to funkcje o pewnej szczególnej postaci, możemy zatem wykonywać na nich wszystkie operacje, jakie umiemy wykonywać na funkcjach. W szczególności wielomiany możemy do siebie dodawać i przez siebie mnożyć. Łatwo jest się przekonać, że suma i iloczyn dwóch wielomianów (a nawet ich złożenie) jest również wielomianem.
Definicja stopnia wielomianu¶
Niech będzie wielomianem
Jeśli dla wszystkich , to nazywamy wielomianem zerowym i mówimy, że jego stopień jest równy .
Jeśli nie jest wielomianem zerowym, to największą liczbę taką, że , nazywamy stopniem tego wielomianu.
Stopień wielomianu będziemy oznaczać symbolem
Uwaga:
Napis czytamy jako minus nieskończoność. Umawiamy się, że dla dowolnej liczby rzeczywistej mamy, że jest mniejsze od i piszemy .
Przykład: działania na wielomianach¶
Niech i będą dane wzorami:
Wtedy i .
Ponadto wielomian dany jest wzorem
a wielomian dany jest wzorem
Przykład: uwaga na stopień!¶
Niech oraz będą wielomianami. Wtedy
Może się ponadto zdarzyć, że nierówność ta jest ostra. Istotnie, jeśli i , to .
Wielomiany stopnia mniejszego bądź równego niż jeden¶
Definicja
Funkcję nazywamy funkcją liniową (dwumianem), gdy istnieją takie, że
Liczbę nazywamy współczynnikiem kierunkowym funkcji liniowej .
Uwaga:
Wykresem funkcji liniowej jest prosta. Poniżej znajduje się kod pozwalający narysować jej wykres w zależności od parametrów oraz . Warto zauważyć, że wykres funkcji liniowej zawsze przechodzi przez punkt , oraz że dla każdego mamy
Zatem zwiększając argument funkcji liniowej o 1 zmieniamy jej wartość o . Obserwacje te pozwalają szybko rysować wykresy funkcji liniowej.
import matplotlib.pyplot as plt
import numpy as np
a = 2
b = 1
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
x = np.linspace(-5,5,100)
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.plot(x, a*x+b,'--r', label='y=ax+b')
plt.show()
Miejsca zerowe funkcji liniowej¶
Fakt
Niech będzie funkcją liniową daną wzorem .
Jeśli oraz , to każda liczba rzeczywista jest miejscem zerowym funkcji .
Jeśli oraz , to nie ma miejsc zerowych.
Jeśli , to liczba jest jedynym miejscem zerowym funkcji .
Przykłady do samodzielnego rozwiązania¶
Wyznacz wzór funkcji liniowej , której wykres przechodzi przez punkty i .
Wyznacz miejsca zerowe funkcji .
Liczba 2 jest jedynym miejscem zerowym funkcji liniowej , której wykres przechodzi przez punkt . Wyznacz jej wzór.
Wielomiany stopnia dwa¶
Definicja
Funkcję nazywamy funkcją kwadratową (lub trójmianem kwadratowym), gdy istnieje oraz takie, że
import matplotlib.pyplot as plt
import numpy as np
a = 1
b = 0
c = 0
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
x = np.linspace(-5,5,100)
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.plot(x, a*x**2+b*x+c,'--r')
plt.show()
Miejsca zerowe funkcji kwadratowej¶
Fakt:
Niech będzie funkcją daną wzorem , gdzie . Niech
Jeśli , to funkcja nie ma miejsca zerowego.
Jeśli , to funkcja posiada dokładnie jedno miejsce zerowe, które wyraża się wzorem .
Jeśli , to funkcja posiada dokładnie dwa miejsca zerowe i , które wyrażają się wzorami:
Uwagi:
Liczbę nazywamy wyróżnikiem trójmianu kwadratowego .
Jeśli , to
Jeśli , to
Jest to tak zwana postać iloczynowa funkcji kwadratowej.
Mamy
Jest to tak zwana postać wierzchołkowa funkcji kwadratowej.
Przykład¶
Niech . Miejscami zerowymi tej funkcji są 2 oraz 4. Zatem . Funkcja w postaci wierzchołkowej wyraża się wzorem .
Przykłady do samodzielnego rozwiązania¶
Wyznacz miejsca zerowe poniższych funkcji i przedstaw je w postaci wierzchołkowej.
;
;
;
.
Zadanie
Nie wyznaczając rozwiązań równania oblicz
;
.
Znaczenie wzorów Viete’a
Poniżej znajduje się kod, w którym są zaimplementowane wzory na miejsca zerowe funkcji kwadratowej.
import math
# function for finding roots
def roots(a, b, c):
dis= b * b - 4 * a * c # delta
if dis> 0:
print(" real and different roots ")
print((-b + math.sqrt(dis)) / (2 * a))
print((-b - math.sqrt(dis)) / (2 * a))
elif dis == 0:
print(" real and same roots")
print(-b / (2 * a))
else:
print(" no real roots")
a = 1
b = 2**28
c = 1
roots(a, b, c) real and different roots
0.0
-268435456.0
W przypadku funkcji kwadratowej otrzymujemy za jego pomocą dwa miejsca zerowe: 0 oraz -268435456.0. Zauważmy, jak bardzo pomylił się komputer: . Problem bierze się stąd, że
i pierwiastek z tej liczby to dla komputera (który oblicza jego przybliżenie), to 228.
math.sqrt(2**56-4)268435456.02**28268435456Aby poprawić dokładność naszego algorytmu, zastosujemy wzory Viete’a. Jedno z miejsc zerowych (to, które jest dalej od zera) obliczamy za pomocą tradycyjnego wzoru, drugie obliczamy stosując wzór Viete’a.
import math
# function for finding roots using Viete'a formulas
def viete_roots(a, b, c):
dis= b * b - 4 * a * c # delta
if dis > 0 and b <= 0 :
print(" real and different roots ")
x_1 = (-b + math.sqrt(dis)) / (2 * a)
x_2 = c / (a*x_1)
print(x_1)
print(x_2)
elif dis > 0 and b > 0 :
print(" real and different roots ")
x_1 = (-b - math.sqrt(dis)) / (2 * a)
x_2 = c / (a*x_1)
print(x_1)
print(x_2)
elif dis == 0:
print(" real and same roots")
print(-b / (2 * a))
else:
print(" no real roots")
a = 1
b = 2**28
c = 1
viete_roots(a, b, c) real and different roots
-268435456.0
-3.725290298461914e-09
Tym razem jest lepiej.
x_2 =-3.725290298461914e-09
a*x_2**2+b*x_2+c0.0Wielomiany stopnia większego niż dwa.¶
Dla wielomianów stopnia 1 i 2 znamy wzory pozwalające obliczać nam ich miejsca zerowe. Takie wzory istnieją również dla wielomianów stopnia 3 i 4, ale ich stosowanie jest trudne. O wzorach tych można poczytać tutaj: https://pl.wikipedia.org/wiki/Równanie_sześcienne https://pl.wikipedia.org/wiki/Równanie_czwartego_stopnia
Dla wielomianów o stopniu większym bądź równym niż 5 takich wzorów nie ma i być nie może (jest to Twierdzenie Abela - Ruffiniego).
Dzielenie wielomianów¶
Twierdzenie
Niech oraz będą wielomianami, przy czym wielomian nie jest wielomianem zerowym. Istnieją jednoznacznie wyznaczone wielomiany oraz takie, że spełnione są warunki
Wielomian nazywamy ilorazem, a wielomian resztą z dzielenia wielomianu przez .
Jeżeli jest wielomianem zerowym, to mówimy, że wielomian jest podzielny przez wielomian .
Przykład
Wykonamy dzielenie wielomianu
przez wielomian
Korzystając z algorytmu dzielenia pisemnego omawianego w szkole otrzymujemy:

Stąd
Przykład
Podzielimy wielomian przez wielomian . Zastosujemy tym razem inną metodę niż w powyższym przykładzie. Wiemy, że ilorazem jest wielomian stopnia dwa, a reszta jest stopnia co najwyżej jeden. Musimy zatem znaleźć liczby takie, że
Stąd po wymnożeniu dostajemy
Porównując odpowiednie współczynniki dostajemy kolejno, że , oraz . Stąd
Przykład do samodzielnego rozwiązania¶
Podziel wielomian przez wielomian .
Schemat Hornera¶
W przypadku dzielenia wielomianów przez dwumian niezwykle użyteczne jest następujące twierdzenie.
Twierdzenie
Niech będzie wielomianem danym wzorem
Ilorazem z dzielenia tego wielomianu przez dwumian
jest wielomian dany wzorem
gdzie
a reszta z tego dzielenia jest równa
Przykład¶
Podzielimy wielomian
przez dwumian
Mamy
Z powyższego twierdzenia kolejno otrzymujemy, że
Zatem
Zauważmy ponadto, że
Uwaga
Reszta z dzielenia wielomianu przez dwumian jest zawsze wielomianem stopnia co najwyżej zero (tzn. jest funkcją stałą) zawsze równym . Istotnie, z twierdzenia o dzieleniu wielomianów wynika, że istnieje wielomian oraz wielomian stopnia co najwyżej zero takie, że
Podstawiając do tego równania za liczbę dostajemy, że .
Znaczenie schematu Hornera¶
Aby obliczyć wartość wielomianu
dla liczby rzeczywistej metodą naiwną, potrzeba wykonać mnożeń i dodawań. Schemat Hornera pozwala nam znacznie to przyspieszyć! Istotnie, z uwagi powyżej wynika, że aby obliczyć wartość , wystarczy policzyć resztę z dzielenia przez dwumian . A to wymaga mnożeń i dodawań.
# function to calculte the value of a polynomial (given as a list of coefficients) at a
def value(a, poly):
n = len(poly)
b = poly[n-1]
for i in range(n-1):
b = poly[n-i-2]+a*b
return b
poly = [1,0,0,0,1] # 1+x^4
a=2
print(value(a,poly))
17