Implementere integrasjonsalgoritmer i Python.
Maskinen overtar regnearbeidet
I forrige kapittel regnet du trapessummer for hånd og kjente på hvor fort det blir slitsomt — fire delintervaller er greit, fire hundre er utenkelig. Men metodene er jo bare oppskrifter: del opp, regn funksjonsverdier, summer med riktige vekter. Og oppskrifter er nøyaktig det datamaskiner er laget for å følge.
I dette kapittelet oversetter vi rektangel-, trapes- og Simpsons metode til Python — hver av dem blir en funksjon på under ti linjer — og slipper dem løs med tusenvis av delintervaller. Vi måler feilene og ser konvergensordenene fra teorien dukke opp i utskriftene: faktor 4 for trapes, faktor 16 for Simpson. Deretter åpner vi proffverktøyene i NumPy og SciPy, der én linje kode integrerer med maskinpresisjon, og avslutter med en metode som er like overraskende som den er nyttig: Monte Carlo-integrasjon, der tilfeldige tall beregner arealer — og estimerer .
Metodene blir kode
La oss starte der forrige kapittel sluttet: venstre rektangelmetode. Som Python-funksjon:
def rektangelmetoden(f, a, b, n):
h = (b - a) / n
total = 0
for i in range(n):
total += f(a + i * h)
return h * totalMønsteret er metoden selv: steglengde , en løkke som summerer funksjonsverdier, og multiplikasjon med til slutt. Med f = lambda x: x**2 og gir den for — feil , omtrent .
Trapesmetoden er nesten lik; bare endepunktene behandles spesielt (vekt ):
def trapesmetoden(f, a, b, n):
h = (b - a) / n
total = (f(a) + f(b)) / 2
for i in range(1, n):
total += f(a + i * h)
return h * totalOg Simpson krever partall og to løkker — én for vekt (odde indekser), én for vekt (indre like indekser):
def simpson(f, a, b, n):
if n % 2 != 0:
raise ValueError("n må være et partall")
h = (b - a) / n
total = f(a) + f(b)
for i in range(1, n, 2):
total += 4 * f(a + i * h)
for i in range(2, n, 2):
total += 2 * f(a + i * h)
return (h / 3) * totalStyrkeprøven: . Med bare gir trapesmetoden feil , mens Simpson gir — over to tusen ganger mer nøyaktig for samme arbeid. Ti linjer kode gjenskaper hele forrige kapittels teori.
Konvergens du kan se — og proffverktøyene
Teorien lovet at trapesfeilen går som . Med en liten testløkke kan vi se det. For skriver vi ut feilen for og forholdet mellom påfølgende feil:
n Feil Faktor
10 3.87e-05 -
20 9.68e-06 4.00
40 2.42e-06 4.00
80 6.05e-07 4.00Faktoren er nøyaktig hver gang dobles — konvergensorden , eksperimentelt bekreftet. For Simpson ville tilsvarende tabell vist faktor . Slik feilanalyse er god praksis hver gang du bruker numerikk: kjør med økende , og se at svaret stabiliserer seg.
I praksis slipper du ofte å skrive metodene selv. SciPy har ferdige, optimaliserte rutiner:
from scipy import integrate
resultat, feil = integrate.quad(f, 0, np.inf)quad velger punkter adaptivt, håndterer til og med uendelige grenser, og returnerer både svaret og et feilestimat — for treffer den fasiten med feil under . For måledata finnes numpy.trapz: har du tidspunkter t = [0, 1, 2, 3, 4, 5] og målte hastigheter v = [0, 5, 8, 10, 9, 6], gir np.trapz(v, t) tilbakelagt strekning meter direkte fra tabellen — trapesmetoden på ekte data, én linje.
Arbeidsdelingen er typisk for beregningsorientert matematikk: skriv metodene selv én gang for å forstå dem, bruk biblioteket etterpå for å anvende dem.
Monte Carlo: tilfeldigheten som regner
Til slutt en metode fra en helt annen planet. Monte Carlo-integrasjon — oppkalt etter kasinobyen — bruker tilfeldige tall: trekk tilfeldige -verdier uniformt fra , regn gjennomsnittet av funksjonsverdiene, og gang med intervallbredden:
Logikken: integralet er gjennomsnittsverdien av ganget med bredden, og et tilfeldig utvalg estimerer gjennomsnittet. I kode:
def monte_carlo(f, a, b, N):
x = np.random.uniform(a, b, N)
return (b - a) * np.mean(f(x))Morsomste anvendelse: estimere . Halvsirkelen over har areal , så Monte Carlo-estimatet . Med får vi kanskje ; med rundt . (Beslektet er «dartskive-varianten»: kast tilfeldige punkter i kvadratet og tell andelen som lander i enhetssirkelen — andelen ganger estimerer .)
Konvergensen er ærlig talt treg: feilen går som , så fire ganger flere punkter gir bare halvert feil — langt bak Simpsons . Hvorfor bry seg, da? Fordi Monte Carlo har to superkrefter: feilordenen er uavhengig av dimensjonen (gull verdt for integraler i mange variabler, der rutenettmetoder kollapser), og metoden er robust og latterlig enkel å implementere. SciPy byr for øvrig også på dblquad for dobbeltintegraler — og verktøykassen vokser med behovet: adaptive metoder som forfiner seg selv der funksjonen varierer mest, Romberg-ekstrapolasjon som pumper opp trapesresultater, og Gauss-kvadratur med optimalt plasserte punkter. Prinsippet bak dem alle har du nå: summer smarte stikkprøver av funksjonen.
Oppsummering: ti linjer kode, tusen rektangler
Numerisk integrasjon gikk i dette kapittelet fra håndarbeid til maskinkraft. De tre klassiske metodene ble Python-funksjoner på under ti linjer hver: rektangelmetoden som en ren sum-løkke, trapesmetoden med halve vekter på endepunktene, og Simpson med vekslende vekter og (og partallskrav på ). Eksperimentene bekreftet teorien i sanntid: trapesfeilen falt med faktor per dobling av (), og Simpson slo trapes med en faktor over på allerede ved .
Proffverktøyene tar over derfra: scipy.integrate.quad integrerer adaptivt med feilestimat på kjøpet — også over uendelige intervaller — og np.trapz integrerer rene måledata. Og Monte Carlo viste numerikkens ville side: tilfeldige punkter som estimerer integraler (og ), med treg, men dimensjonsuavhengig konvergens som gjør metoden uunnværlig i mange dimensjoner.
Arbeidsregelen du tar med videre: forstå metoden ved å skrive den selv, bruk biblioteket i produksjon, og verifiser alltid mot kjente integraler eller økende . Med både analytiske og numeriske verktøy i kassen er du klar for integralregningens mest håndgripelige anvendelse: å regne ut volumet av ting — fra vinglass til planeter.
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.
