Numeriske metoder

Numeriske metoder#

Numeriske metoder handler om å finne tilnærmede løsninger (eller approksimasjoner ☝️🤓).

Vi skal se på to enkle algoritmer

  • … en algoritme for å finne nullpunkter

  • … og en algoritme for å finne topp- eller bunnpunkter

Finner vi nullpunkter, kan vi også løse likninger!

Vi ønsker å løse likningen \(x^2 = 3x - 2\).

Vi skriver den om til \(x^2 - 3x + 2 = 0\)

Deretter kan vi løse likningen ved å finne nullpunktene til funksjonen \(f(x)=x^2 - 3x + 2\).

Dersom vi kan finne nullpunkter, kan vi også løse likninger!

Nullpunkter#

For å finne nullpunkter kan vi bruke et kult fortegnstriks!

Algoritmen

Først bestemmer vi oss for to punkter på en funksjon med en fast avstand \(d\) fra hverandre, f.eks \(A=(x, f(x))\) og \(B=(x + d, f(x + d))\). Deretter gjentar vi stegene:

  1. Gang sammen funksjonsverdiene \(f(x)\cdot f(x+d)\)

  2. Hvis resultatet blir et negativt tall, eller null, er \(x\)-verdien rett ved et nullpunkt. Skriv ut \(x\)-verdien.

  3. Øk \(x\)-verdien med et lite steg.

Vi kan minske avstanden mellom punktene, og stegene vi tar, for å få et enda mer nøyaktig svar.

Her er en demo i GeoGebra for å vise hvordan denne algoritmen fungerer.

La oss programmere denne algoritmen i Python 🐍.

# Funksjonen vi skal sjekke
def f(x):
    return x**2 - 3*x + 2

# x-verdien vi skal starte på
x = 0
# Steglengden og avstanden mellom punktene
d = 0.0001

while x <= 4:
    if f(x) * f(x + d) <= 0:
        print(x)
    x += d
0.9999999999999062
1.9999999999997962

Vi ser at vi får nullpunkter ved \(x\approx 1\) og \(x\approx 2\).

Valg av steglengde

Vi må velge \(d\) til å være tilstrekkelig liten. Hvis \(d\) er for stor (f.eks \(d=0.1\)), kan programmet ende opp med å skrive ut samme nullpunkt flere ganger, eller gi oss et veldig unøyaktig svar.

Topp- eller bunnpunkter#

Toppunkter er punkter hvor funksjonen går fra å stige til å synke. Bunnpunkter er punkter hvor funksjonen går fra å synke til å stige. Vi kan lage en algoritme for å finne disse.

Algoritmen

Finn en \(x\)-verdi til venstre for topp eller bunnpunktet. Finn ut om \(f\) stiger eller synker i \(x\). Bestem deg også for en liten verdi \(d\).

  • Hvis du vet at funksjonen stiger i \(x\), så øker du \(x\) med \(d\) så lenge \(f(x) \leq f(x + d)\).

  • Hvis du vet at funksjonen synker i \(x\), så øker du \(x\) med \(d\) så lenge \(f(x) \geq f(x + d)\).

Skriv ut \(x\)-verdien og \(y\)-verdien. Dette er et topp- eller bunnpunkt.

La oss prøve å finne bunnpunktet til funksjonen fra de tidligere eksemplene. Denne funksjonen synker ved \(x=0\) fordi det er positivt fortegn før \(x^2\).

# Funksjonen vi skal sjekke
def f(x):
    return x**2 - 3*x + 2

x = 0 # Setter x til venstre for ekstremalpunktet
d = 0.0001 # En liten d-verdi

# Flytter x mot høyre (med øvre grense)
while f(x) >= f(x + d) and x < 4:
    x += d

print("Bunnpunkt ved:")
print("x =", round(x, 3))
print("y =", round(f(x), 3))
Bunnpunkt ved:
x = 1.5
y = -0.25

Lokale maksimum/minimum

Algoritmen vår finner topp- eller bunnpunkter. Disse er ekstremalpunkter, men de er ikke nødvendigvis de største eller minste verdiene som funksjonen kan ha. Vi skiller mellom lokale ekstremalpunkter og globale ekstremalpunkter (minima/maksima).

graf som viser forskjellen mellom lokale og globale ekstremalpunkt

Litt avhengig av hvor vi starter kan vi finne forskjellige ekstremalpunkter.


Oppgaver#

Oppgave 1

Finn nullpunktene til funksjonen \(f(x)=x^4-10x^3+35x^2-50x+24, D_f=[0, 5]\) ved å bruke den numeriske metoden.

Oppgave 2

Finn nullpunktene til funksjonen \(f(x)=x^2-\frac{1}{4}\), \(D_f=[-1,1]\)

  1. Ved å regne for hånd.

  2. Ved å bruke den numeriske metoden.

Oppgave 3

Janis prøver å finne nullpunktene til funksjonen \(f(x)=x^2-x-2\) med programmet under.

def f(x):
    return x**2 - x - 2

x = 0
d = 0.0001
while x <= 5:
    if f(x) * f(x + d) <= 0:
        print(x)
    x += d

Han vet det skal finnes to nullpunkter, men han finner bare ett. Forklar hvorfor, og hva han kan gjøre for å fikse det!

Oppgave 4

Klaudia prøver å finne nullpunktene til funksjonen \(f(x)=x^2-3x+2, D_f=[0, 3]\) med programmet under.

def f(x):
    return x**2 - 3*x + 2

x = 0

while f(x) * f(x + 0.1) > 0:
    x += 0.1

print(x)
  1. Hva finner hun? Forsøk å svare uten å lage programmet.

  2. Modifiser programmet slik at det fungerer som Klaudia ønsker.