Forover eller sentral differanse?

Når du ikke har en formel, men bare tall – fra en måling, en tabell eller en datamaskin – må den deriverte anslås numerisk. Begge metodene her bruker to funksjonsverdier for å anslå stigningstallet til tangenten. Dra i Δx eller trykk «Spill av», og se hvilken sekant som treffer tangenten best.

Det viktigste

Forover (definisjonen)

f′(a) ≈ f(a+Δx) − f(a)Δx

Sekant fra a til a+Δx. Ser bare til høyre.

Sentral (symmetrisk)

f′(a) ≈ f(a+Δx) − f(a−Δx)2Δx

Sekant fra a−Δx til a+Δx. Like langt på hver side.

I GeoGebra og på kalkulatoren er det nettopp slike metoder som ligger bak når du ber om den deriverte i et punkt fra tall. I Python skriver du det selv: (f(a + dx) - f(a - dx)) / (2*dx) – se Python-delen lenger ned.

UtforskHvilken sekant ligger nærmest tangenten?

0,8

Hvor fort krymper feilen – og hvorfor?

Feilen på logaritmiske akser

Begge aksene er logaritmiske. Hvert rutesteg mot venstre gjør Δx ti ganger mindre.

  • Forover: Δx ti ganger mindre gir omtrent 10 ganger mindre feil. Feilen er proporsjonal med Δx.
  • Sentral: Δx ti ganger mindre gir omtrent 100 ganger mindre feil. Feilen er proporsjonal med (Δx)².
ΔxForover-feilSentral-feil

Regn på x³

Med f(x) = x³ kan vi regne ut begge brøkene for hånd. Bruk (a+Δx)³ = a³ + 3a²Δx + 3a(Δx)² + (Δx)³.

Forover: (a+Δx)³ − a³Δx = 3a² + 3aΔx + (Δx)²
Sentral: (a+Δx)³ − (a−Δx)³2Δx = 3a² + (Δx)²

Det riktige svaret er 3a². I den sentrale differansen forsvinner leddet 3aΔx, fordi det kommer med pluss fra høyre side og minus fra venstre side. Igjen står bare (Δx)², som blir veldig lite når Δx er lite.

Geometrisk: grafen krummer seg. Forover-sekanten måler bare krummingen på én side og blir skjev. Den sentrale sekanten får like mye krumming på begge sider, og skjevhetene veier hverandre opp. Derfor er den nesten parallell med tangenten.

Prøv x²: Der er den sentrale differansen helt eksakt for alle Δx. Klarer du å vise det?

For de nysgjerrige: den generelle forklaringen
f(a+Δx) ≈ f(a) + f′(a)Δx + ½f″(a)(Δx)² + ⅙f‴(a)(Δx)³
Forover-feil ≈ ½ f″(a) · Δx
Sentral-feil ≈ ⅙ f‴(a) · (Δx)²

Dette er Taylor-rekker, som kommer senere i matematikken. Leddene med f″ har samme fortegn på begge sider av a og kanselleres når vi trekker fra.

Numerisk derivasjon i Python5 programmer og 6 oppgaver: forover, sentral, Δx mot 0, avrundingsfeil og fart fra GPS-data

Kopier programmene inn i Thonny, VS Code, Jupyter eller verktøyet dere bruker – og endre på dem.

Hvorfor programmere dette? Læreplanen sier at du skal kunne bestemme den deriverte numerisk og bruke algoritmisk tenkning. I programmene under heter Δx dx, fordi Python ikke tillater Δ i variabelnavn. Formlene er de samme som øverst på siden.

Program 1 · forover-differanse (definisjonen)

Anslå f ′(1) for f(x) = x³ med Δx = 0,1

def f(x):
    return x**3

a = 1
dx = 0.1

stigning = (f(a + dx) - f(a)) / dx
print("Forover-differanse:", stigning)
print("Eksakt verdi:      ", 3 * a**2)
Forover-differanse: 3.310000000000004
Eksakt verdi:       3

Legg merke til: Svaret er 3,31, ikke 3 – feilen 0,31 kommer av at sekanten bare ser til høyre. At Python skriver 3.310000000000004 og ikke 3.31, skyldes at datamaskinen lagrer tall i totallsystemet, der 0,1 ikke kan skrives eksakt.

Program 2 · sentral differanse

Samme funksjon og samme Δx, men med et punkt på hver side

def f(x):
    return x**3

a = 1
dx = 0.1

stigning = (f(a + dx) - f(a - dx)) / (2 * dx)
print("Sentral differanse:", stigning)
print("Eksakt verdi:      ", 3 * a**2)
Sentral differanse: 3.0100000000000016
Eksakt verdi:       3

Legg merke til: Bare én linje er endret, men feilen er 0,01 i stedet for 0,31 – tretti ganger mindre, med like mye regnearbeid.

Program 3 · la Δx gå mot 0

Funksjoner og en løkke sammenligner de to metodene

Nå er metodene skrevet som funksjoner, slik at vi kan bruke dem om og om igjen. Løkka gjør Δx ti ganger mindre for hver runde – akkurat som grenseverdien i definisjonen.

def f(x):
    return x**3

def forover(f, a, dx):
    return (f(a + dx) - f(a)) / dx

def sentral(f, a, dx):
    return (f(a + dx) - f(a - dx)) / (2 * dx)

a = 1
eksakt = 3 * a**2          # f'(x) = 3x², så f'(1) = 3

print("     dx     forover-feil   sentral-feil")
for k in range(1, 6):
    dx = 10**(-k)          # 0.1, 0.01, 0.001, ...
    feil_f = abs(forover(f, a, dx) - eksakt)
    feil_s = abs(sentral(f, a, dx) - eksakt)
    print(f"{dx:8.0e}   {feil_f:12.2e}   {feil_s:12.2e}")
     dx     forover-feil   sentral-feil
   1e-01       3.10e-01       1.00e-02
   1e-02       3.01e-02       1.00e-04
   1e-03       3.00e-03       1.00e-06
   1e-04       3.00e-04       1.00e-08
   1e-05       3.00e-05       9.74e-11

Legg merke til: Forover-feilen blir ti ganger mindre for hver runde, sentral-feilen hundre ganger mindre. Det er det samme som den logaritmiske grafen over viser.

Program 4 · for liten Δx er også dumt!

Hva skjer når Δx blir veldig liten?

from math import exp

def sentral(f, a, dx):
    return (f(a + dx) - f(a - dx)) / (2 * dx)

# f(x) = e^x har f'(0) = 1. Hvor nær kommer vi?
print("     dx       feil")
for k in range(1, 16, 2):
    dx = 10**(-k)
    feil = abs(sentral(exp, 0, dx) - 1)
    print(f"{dx:8.0e}   {feil:.1e}")
     dx       feil
   1e-01   1.7e-03
   1e-03   1.7e-07
   1e-05   1.2e-11
   1e-07   5.3e-10
   1e-09   2.7e-08
   1e-11   8.3e-08
   1e-13   2.4e-04
   1e-15   5.5e-02

Legg merke til: Feilen er minst rundt Δx = 10⁻⁵ og blir så større igjen. Datamaskinen regner med omtrent 16 gjeldende sifre. Når f(a + Δx) og f(a − Δx) er nesten like, forsvinner de fleste sifrene når vi trekker dem fra hverandre – og så deler vi på et bitte lite tall. I matematikken går Δx mot 0. På en datamaskin må vi stoppe i tide.

Program 5 · den deriverte av måledata

Fart fra GPS-målinger, uten noen formel

Ofte har vi ikke en funksjon, bare målinger. Da er sentral differanse ekstra nyttig: Vi bruker målingen før og målingen etter hvert punkt.

# GPS-målinger fra en sprintstart
t = [0, 1, 2, 3, 4, 5]                 # tid i sekunder
s = [0, 2.1, 7.9, 17.8, 31.5, 49.2]    # posisjon i meter

# Sentral differanse i alle punkter som har et nabopunkt på hver side
for i in range(1, len(t) - 1):
    v = (s[i + 1] - s[i - 1]) / (t[i + 1] - t[i - 1])
    print(f"t = {t[i]} s:  v ≈ {v:.2f} m/s")
t = 1 s:  v ≈ 3.95 m/s
t = 2 s:  v ≈ 7.85 m/s
t = 3 s:  v ≈ 11.80 m/s
t = 4 s:  v ≈ 15.70 m/s

Legg merke til: Farten øker med omtrent 4 m/s hvert sekund, så akselerasjonen er omtrent 4 m/s². Første og siste punkt mangler en nabo på én side – der må vi bruke forover- eller bakover-differanse. (Sammenlign med 2.9 Fart og akselerasjon.)

Øv på Python

Endre program 1 slik at a = 2. Hva skriver programmet ut (avrundet til to desimaler)?

Programmet regner ut (2,1³ − 2³) / 0,1. Du kan regne det for hånd eller kjøre programmet.
(9,261 − 8)/0,1 = 12,61. Eksakt er f ′(2) = 3 · 2² = 12.

Endre program 2 slik at a = 2. Hva skriver programmet ut (avrundet til to desimaler)?

(2,1³ − 1,9³) / 0,2
(9,261 − 6,859)/0,2 = 12,01. For x³ er sentral-feilen alltid nøyaktig (Δx)² = 0,01.

I program 4 ga Δx = 10⁻⁵ minst feil. Hvorfor blir feilen større igjen for enda mindre Δx?

  • Den sentrale differansen er en dårlig metode for små Δx
  • Avrundingsfeil i datamaskinen blir forstørret når vi deler på et veldig lite tall
  • Funksjonen eˣ er ikke deriverbar i 0

Bruk GPS-målingene i program 5. Regn ut farten ved t = 3 s med sentral differanse for hånd, og sjekk mot utskriften.

Bruk målingene ved t = 2 og t = 4.
31,5 − 7,94 − 2 = 11,8 m/s

Skriv en Python-funksjon bakover(f, a, dx) som bruker punktet til venstre for a. Bruk den på f(x) = x³ i a = 1 med dx = 0,1. Er feilen større eller mindre enn med forover-differanse?

Bakover-differansen er (f(a) − f(a − Δx)) / Δx.
def f(x):
    return x**3

def bakover(f, a, dx):
    return (f(a) - f(a - dx)) / dx

print(bakover(f, 1, 0.1))

Programmet skriver ut omtrent 2,71. Feilen er 0,29 – litt mindre enn forover (0,31), men samme størrelsesorden. Gjennomsnittet av forover og bakover er nøyaktig den sentrale differansen!

Utfordring: Bruk funksjonen sentral fra program 3 og en løkke til å skrive ut et anslag for f ′(x) for f(x) = x³ − 3x når x = −2; −1,5; … ; 2. Hvor har grafen vannrett tangent?

Lag x-verdiene med for k in range(-4, 5): og x = k / 2.
def f(x):
    return x**3 - 3*x

def sentral(f, a, dx):
    return (f(a + dx) - f(a - dx)) / (2 * dx)

for k in range(-4, 5):
    x = k / 2
    print(f"x = {x:5.1f}   f'(x) ≈ {sentral(f, x, 0.001):7.3f}")

Anslagene er 0 (med tre desimaler) for x = −1 og x = 1. Der har grafen vannrett tangent – akkurat som i eksempel 3 i 2.8, der vi fant det med derivasjonsreglene.

Øv selvBruk kalkulator der det trengs

La f(x) = x². Bruk forover-differanse med Δx = 0,1 til å anslå f ′(2).

Regn ut (f(2,1) − f(2)) / 0,1.
(4,41 − 4)/0,1 = 4,1. Eksakt er f ′(2) = 4, så feilen er 0,1.

Samme funksjon, men med sentral differanse og Δx = 0,1. Hva blir anslaget for f ′(2)?

(f(2,1) − f(1,9)) / 0,2
(4,41 − 3,61)/0,2 = 4 – helt eksakt, akkurat som siden lovet for x².

Feilen i forover-differansen er 0,03 når Δx = 0,01. Omtrent hvor stor blir den når Δx = 0,001?

  • 0,003
  • 0,0003
  • 0,03

En GPS-klokke logger posisjonen til en skiløper: 9,0 m ved t = 1,5 s og 15,0 m ved t = 2,5 s. Anslå farten ved t = 2 s med sentral differanse.

Δx er 0,5 s på hver side av t = 2.
15,0 − 9,02 · 0,5 = 6 m/s

Lær med KI

Jeg går i R1 og vil skrive et lite Python-program som anslår f′(a) med forover- og sentral differanse for Δx = 0,1, 0,01 og 0,001, og skriver ut feilen. Ikke skriv programmet for meg. Gi meg en plan i punkter, og hjelp meg å feilsøke når jeg viser deg koden min.

Elevenes hjørne