9.4 Numeriske metoder og simulering
Finne nullpunkter ved fortegnsskifte, tilnærme areal med rektangler, løse likninger ved prøving og simulere utvikling steg for steg.
Når regning for hånd ikke strekker til
Mange likninger kan ikke løses eksakt med metodene vi har, og mange størrelser er for tungvinte å regne ut for hånd. Med et program kan vi i stedet
- prøve oss fram systematisk til vi har et svar med ønsket nøyaktighet
- dele et problem opp i mange små biter og legge sammen
- simulere en utvikling steg for steg
Slike metoder kalles numeriske metoder. Svaret blir en tilnærming, og vi må alltid si hvor nøyaktig det er.
Hvis grafen til henger sammen på intervallet og og har ulikt fortegn, har minst ett nullpunkt mellom og .
I et program sjekker vi ulikt fortegn med f(a) * f(b) < 0: produktet av et positivt og et negativt tall er negativt.
Finn nullpunktet til med to desimalers nøyaktighet. Bruk at og .
def f(x):
return x ** 3 + x - 3
for i in range(100, 200):
x = i / 100
if f(x) * f(x + 0.01) < 0:
print("Nullpunkt mellom",
x, "og", x + 0.01)Nullpunkt mellom 1.21 og 1.22Vi bruker x = i / 100 i stedet for å legge til 0,01 i hver runde, slik at avrundingsfeil ikke hoper seg opp.
Svar: Nullpunktet ligger mellom 1,21 og 1,22.
I halveringsmetoden deler vi intervallet i to i hver runde og beholder den halvdelen der fortegnet skifter. Hva skriver programmet ut?
def f(x):
return x ** 3 + x - 3
a = 1
b = 2
for runde in range(20):
m = (a + b) / 2
if f(a) * f(m) <= 0:
# nullpunktet er i [a, m]
b = m
else:
# nullpunktet er i [m, b]
a = m
print(a, b)Intervallet starter med lengde 1 og halveres 20 ganger.
1.2134113311767578 1.2134122848510742Svar: Nullpunktet ligger i et intervall med lengde omtrent rundt .
Hva skriver programmet ut? Hva kan du si om nullpunktet til ?
def f(x):
return x ** 2 - 7
print(f(2), f(3))Programmet skriver ut en verditabell for . Mellom hvilke heltall ligger nullpunktene?
def f(x):
return x ** 2 - 4 * x + 1
for x in range(0, 6):
print(x, f(x))Lag et program som finner nullpunktet til mellom 2 og 3 med én desimals nøyaktighet.
Endre programmet i eksempel 2 slik at det finner som nullpunktet til mellom 2 og 3. Hvor mange desimaler kan du stole på etter 20 runder?
Areal under en graf med rektangler
Arealet mellom grafen til og -aksen fra til kan vi tilnærme med rektangler som er like brede:
- bredden er
- rektangel nummer (fra 0) starter i
- høyden er funksjonsverdien i venstre endepunkt
Jo flere rektangler, desto nærmere kommer summen det eksakte arealet.
Arealet under grafen til fra til skal tilnærmes med rektangler.
a) Regn ut summen av arealene av 6 rektangler med bredde 1.
b) Lag et program, og finn arealet med 6, 60, 600 og 6000 rektangler.
a) , , , , ,
def f(x):
return (-0.5 * x ** 2
+ 2 * x + 6)
a = 0
b = 6
# antall rektangler
n = 6
bredde = (b - a) / n
areal = 0
for i in range(n):
# venstre endepunkt
x = a + i * bredde
areal = areal + f(x) * bredde
print(n, areal)6 38.5Svar: Summen av de 6 rektanglene er 38,5.
b)
def f(x):
return (-0.5 * x ** 2
+ 2 * x + 6)
def areal(n):
bredde = 6 / n
s = 0
for i in range(n):
h = f(i * bredde)
s = s + h * bredde
return s
for n in [6, 60, 600, 6000]:
print(n, areal(n))6 38.5
60 36.295
600 36.02995000000001
6000 36.002999500000016Svar: Summene nærmer seg 36 når antallet rektangler øker. Arealet er omtrent 36.
Arealet under grafen til fra til skal tilnærmes med rektangler med høyde i venstre endepunkt.
Regn ut summen med 4 rektangler for hånd.
Lag et program som regner ut summen med 4 og med 1000 rektangler.
Endre programmet i forrige oppgave slik at høyden i hvert rektangel er funksjonsverdien i høyre endepunkt. Sammenlikn med resultatene i forrige oppgave, og forklar forskjellen.
Systematisk prøving
Likninger som kan vi løse grafisk, i CAS (NLøs(1.05^x = 2)) eller ved systematisk prøving: vi øker i små steg til venstre side blir minst like stor som høyre side.
Et beløp vokser med 5 % per år. Finn med to desimaler hvor mange år det tar før beløpet er doblet, altså løs .
i = 0
while 1.05 ** (i / 100) < 2:
i = i + 1
print(i / 100)14.21Kontroll: og
Svar: . Beløpet er doblet etter omtrent 14,2 år.
Lag et program som løser likningen ved systematisk prøving med to desimaler.
Simulering steg for steg
Når vi vet hvordan en størrelse endrer seg fra ett år (eller ett minutt) til det neste, kan programmet regne ut utviklingen steg for steg. Det kalles å simulere utviklingen. En while-løkke finner når størrelsen passerer en grense.
Det er 2000 fisk i et vann. Hvert år øker bestanden med 8 %, og så fiskes 120 fisk. Hvor mange år tar det før det er mer enn 3000 fisk?
Bestanden neste år:
bestand = 2000
år = 0
while bestand <= 3000:
bestand = bestand * 1.08 - 120
år = år + 1
print(år, round(bestand))15 3086Svar: Etter 15 år er det mer enn 3000 fisk (omtrent 3086).
Verdiene fra et program kan framstilles grafisk med biblioteket matplotlib. Programmet lagrer - og -verdiene i to lister og tegner grafen:
import matplotlib.pyplot as plt
def f(x):
return x ** 3 + x - 3
xverdier = []
yverdier = []
for i in range(0, 21):
x = i / 10
xverdier.append(x)
yverdier.append(f(x))
plt.plot(xverdier, yverdier)
plt.grid()
plt.show()Grafen viser at krysser -aksen litt over , slik vi fant i eksempel 1.
Endre programmet i eksempel 5 slik at bestanden starter på 1400 fisk. Finn hvor mange år det tar før det er færre enn 1000 fisk.
Oppgaver i eksamensform
Funksjonen er gitt ved . Thea vil finne arealet av området mellom grafen til og -aksen fra til .
Thea deler området i 8 rektangler med bredde 1 og høyde i venstre endepunkt. Regn ut summen av arealene.
Lag et program Thea kan bruke når hun skal øke antallet rektangler.
Bruk programmet til å finne arealet med 8000 rektangler.
Funksjonen har tre nullpunkter mellom og .
def f(x):
return x ** 3 - 6 * x + 2
for i in range(-300, 300):
x = i / 100
if f(x) * f(x + 0.01) < 0:
print(round(x, 2),
round(x + 0.01, 2))Forklar hvordan programmet finner nullpunktene.
Hva skriver programmet ut?
Hvorfor bruker programmet round?
En kopp kaffe holder 90 °C i et rom der det er 20 °C. Hvert minutt synker temperaturen med 10 % av forskjellen mellom kaffen og rommet.
Forklar at temperaturen etter ett minutt er 83 °C.
Lag et program som finner hvor mange hele minutter det tar før kaffen er under 40 °C.
Lag en tabell over temperaturen hvert minutt de 12 første minuttene, og kontroller svaret i b).
Oppsummering
- Ulikt fortegn: f(a) * f(b) < 0 betyr at et nullpunkt ligger mellom og .
- Små steg gir et intervall med nullpunktet; halveringsmetoden halverer intervallet i hver runde.
- Areal under en graf: summen av over mange smale rektangler.
- Systematisk prøving løser likninger som med så mange desimaler vi ønsker.
- Simulering: regn ut neste verdi fra den forrige i en løkke, og stopp ved en grense.
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.