Polynomdivisjon II

<div class="alert alert-block alert-warning">

Mål for opplæringa er at eleven skal kunne

  • formulere og løyse problem ved hjelp av algoritmisk tenking, ulike problemløysingsstrategiar, digitale verktøy og programmering
  • forklare polynomdivisjon og bruke det til å omskrive algebraiske uttrykk, drøfte funksjonar og løyse likningar og ulikskapar
  • utforske og beskrive eigenskapane ved polynomfunksjonar, rasjonale funksjonar, eksponentialfunksjonar og potensfunksjonar

Numerisk faktorisering av polynom

Vi fortsetter her med koden fra Polynomdivisjon I, men ser på et eksempel med ingen heltallsfaktorer.

[30]: 
1 
2
3
4
5
6
7
8
9
10
11
12
def P(x):
    y = 0.25*x**3 + 0.5*x**2 - 13*x - 10     # Polynomet vi ønsker å finne faktorene til
    return y

for i in range(-10, 11):
    if P(i) == 0:
        if i < 0:
            print("En faktor er x +",abs(i))
        elif i == 0:
            print("En faktor er x")
        else:
            print("En faktor er x -",i)

Hvis vi kjører programmet over får vi ikke ut noe svar, så hvordan kan vi endre programmet slik at vi kan finne faktorene?

<div class="alert alert-block alert-info">

Oppgave 1

a) Hva er det faktorene forteller oss om polynomet?

b) Hvordan hjelper faktorene oss hvis vi skal lage en skisse av funksjonen P(x)=14x3+12x213x10P(x) = \frac{1}{4}x^3 + \frac{1}{2}x^2 - 13x - 10?

Vi legger for til en kort kodebit som plotter grafen tin P(x)P(x) for intervallet vi ser på, her [10,10][-10, 10].

[31]: 
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from numpy import linspace
from matplotlib.pyplot import plot, axhline, axvline

def P(x):
    y = 0.25*x**3 + 0.5*x**2 - 13*x - 10     # Polynomet vi ønsker å finne faktorene til
    return y

x = linspace(-10, 10, 100)                  # Lager x-verdier i intervallet
y = P(x)                                    # Regner ut de tilhørende y-verdiene

axhline(y = 0, color = "k")                 # Tegner inn x-aksen
axvline(x = 0, color = "k")                 # Tegner inn y-aksen
plot(x, y)                                  # Plotter grafen til P(x)

for i in range(-10, 11):
    if P(i) == 0:
        if i < 0:
            print("En faktor er x +",abs(i))
        elif i == 0:
            print("En faktor er x")
        else:
            print("En faktor er x -",i)

Vi ser av grafen over at P(x)P(x) har tre nullpunkter, men ingen av dem er heltall.

<div class="alert alert-block alert-info">

Oppgave 2

a) Studer grafen over og diskuter med makkeren din hva som skjer med funksjoneverdien for og etter hvert nullpunkt.

b) Hvordan kan vi bruke informasjonen fra a) til å endre programmet vårt slik at det vil finne nullpunktene?

Finne nullpunkter til polynomet

Fra oppgave 2 så dere at ved nullpunktene over så skfitet fortegnet til funksjonsverdien, enten fra ++ til - eller fra - til ++.

Koden under er endret noe, se siste tre linjene.


from numpy import linspace
from matplotlib.pyplot import plot, axhline, axvline

def P(x):
    y = 0.25*x**3 + 0.5*x**2 - 13*x - 10     # Polynomet vi ønsker å finne faktorene til
    return y

x = linspace(-10, 10, 100)                  # Lager x-verdier i intervallet
y = P(x)                                    # Regner ut de tilhørende y-verdiene

axhline(y = 0, color = "k")                 # Tegner inn x-aksen
axvline(x = 0, color = "k")                 # Tegner inn y-aksen
plot(x, y)                                  # Plotter grafen til P(x)

presisjon = 3
delta = 10**-presisjon
start = -10
slutt = 10

while start <= slutt:
    if P(start) * P(start + delta) < 0:
        print("Et nullpunkt er ved x =", round((2*start + delta) / 2 ,  presisjon))
    start = start + delta
<div class="alert alert-block alert-info">

Oppgave 3

a) Diskuter med makkeren din hvorfor vi har laget en ny variabel som vi har kalt for presisjon og hva denne variabelen gjør?

b) Diskuter med makkeren din hvorfor vi sjekker både P(start)P(\text{start}) og P(start+presisjon)P(\text{start} + \text{presisjon}) i if-setningen.

c) Diskuter med makkeren din hvordan vi raskt kan sjekke om to tall har forskjellig fortegn ved hjelp av en enkel regneoperasjon og en betingelse. Forslå deretter hva man kan erstatte de tre ??? med i if-setningen.

d) Diksuter hva dere tror skal stå i print()kommandoen?

<div class="alert alert-block alert-danger">

Løsning:

a) Presisjonsvariabelen er nøyaktigheten på nullpunktet vårt

b) Vi sjekker to nærliggende funksjonsverdier for å se om de har forskjellig fortegn.

c) Vi kan enkelt sjekke fortenget ved å multiplisere dem og deretter sjekke om svaret er positivt eller negativt. if-setningen bli da seende slik ut

if P(x) * P(x + funksjonsverdi) < 0:
    

d) print-kommandoen kan inneholde et setning om at et nullpunkt er funnet og skrive ut verdien til det.

</div>
[45]: 
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from numpy import linspace
from matplotlib.pyplot import plot, axhline, axvline

def P(x):
    y = 0.25*x**3 + 0.5*x**2 - 13*x - 10     # Polynomet vi ønsker å finne faktorene til
    return y

x = linspace(-10, 10, 100)                  # Lager x-verdier i intervallet
y = P(x)                                    # Regner ut de tilhørende y-verdiene

axhline(y = 0, color = "k")                 # Tegner inn x-aksen
axvline(x = 0, color = "k")                 # Tegner inn y-aksen
plot(x, y)                                  # Plotter grafen til P(x)

presisjon = 3
delta = 10**-presisjon
start = -10
slutt = 10

while start <= slutt:
    if P(start) * P(start + delta) < 0:
        n = (2*start + delta) / 2
        n = round(n, presisjon)
        print("Et nullpunkt er ved x =", n)
    start = start + delta
Et nullpunkt er ved x = -7.925
Et nullpunkt er ved x = -0.756
Et nullpunkt er ved x = 6.681
<div class="alert alert-block alert-info">

Oppgave 4

Kjør koden over et par ganger for ulike polynomfunksjoner

a) Hvorfor regner vi ut nullpunktet, nn, slik det vises i linje 22?

b) Er det noen polynomer der programmet ikke finner nullpunktene? Hva kjennetegner disse nullpunktene?

c) Utvid programmet til å skriv ut faktorene til polynomet også.

<div class="alert alert-block alert-danger">

Løsning:

a) Siden vi ikke vet hvor i intervallet [n,n+delta][n, n + delta] nullpunktet ligger, bruker vi gjennomsnittsverdien.

b) Programmet vil ikke finne nullpunkter som også er et ekstremalpunkt. Et slikt nullpunkt skifter ikke fortegn, og dermed vil ikke programmet finne det.

c) Må legge til en kode tilsvarende det vi gjorde i Polynomvdivisjon I.

<div>
[48]: 
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Fullstendig kode

from numpy import linspace
from matplotlib.pyplot import plot, axhline, axvline

def P(x):
    y = 0.25*x**3 + 0.5*x**2 - 13*x - 10     # Polynomet vi ønsker å finne faktorene til
    return y

x = linspace(-10, 10, 100)                  # Lager x-verdier i intervallet
y = P(x)                                    # Regner ut de tilhørende y-verdiene

axhline(y = 0, color = "k")                 # Tegner inn x-aksen
axvline(x = 0, color = "k")                 # Tegner inn y-aksen
plot(x, y)                                  # Plotter grafen til P(x)

presisjon = 3
delta = 10**-presisjon
start = -10
slutt = 10

while start <= slutt:
    if P(start) * P(start + delta) < 0:
        n = (2*start + delta) / 2
        n = round(n, presisjon)
        print("Et nullpunkt er ved x =", n)
        if n < 0:
            print("En faktor er x +", abs(n))
        elif n == 0:
            print("En faktor er x")
        else:
            print("En faktor er x -",n)
    start = start + delta
Et nullpunkt er ved x = -7.925
En faktor er x + 7.925
Et nullpunkt er ved x = -0.756
En faktor er x + 0.756
Et nullpunkt er ved x = 6.681
En faktor er x - 6.681