A Northstar rendeléseihez tartozó szimulációban egy kiszállító cég azt vizsgálja, hogy egy új útvonalon mennyi időt tölt a furgon, és mekkora utat tesz meg. A sebesség nem állandó: a furgon először lassan halad, majd a forgalom ritkulásával gyorsul. Legyen a sebesség időfüggvénye szemléltetésként
ahol a percben mért idő, pedig km/percben mért sebesség. A teljes megtett utat a sebesség alatti terület adja a 0 és 60 perc közötti intervallumon. Ebben az alfejezetben a kérdés: hogyan lehet ezt a területet számítógéppel, rácsfinomítással közelíteni, és honnan tudjuk, hogy a közelítés milyen hibájú?
Az induló gyakorlás egy még egyszerűbb, kézzel ellenőrizhető matematikai modellen futtatjuk le:
A megoldás előtt becsüld meg a területet egyetlen téglalappal: a függvény mindenütt legfeljebb 1 magas, ezért 0 és 1 között van. Egy jobb geometriai érvelés szerint az görbe a háromszög alatt fut, ezért a terület kisebb, mint ; a pontos ehhez közeli, de a numerikus rácsnak meg kell mutatnia, mennyire.
A Riemann-szumma egy véges összeg, amely a területet téglalapokkal közelíti. Osszuk az intervallumot darab, nem feltétlenül egyenlő részintervallumra:
A -edik részintervallum szélessége
és ebből a részintervallumból választunk egy pontot, ahol a téglalap magasságát leolvassuk. A Riemann-szumma
A jelölések:
x tömb egy eleme,
float64 szám, mértékegysége az
tengely egysége (itt például perc vagy dimenziótlan);Ha minden intervallum azonos
szélességű, és a mintapont a bal végpont, akkor a bal
oldali téglalapösszeget kapjuk; ha a jobb végpont, akkor a
jobb oldalit. Az x = np.linspace(a,b,n+1)
tömb alakja
,
mert
intervallumhoz
csomópont kell.
A trapezoid-szabály téglalapok helyett egyenes szakaszokkal köti össze a pontokat, tehát minden részintervallumon egy kis trapéz területét számítja:
Egyenletes rácson ez éppen a bal és jobb oldali összeg átlaga:
A terület tehát egy mértékegységgel rendelkező mennyiség: ha sebesség km/percben és idő percben, akkor a terület km. Ha később valószínűségi sűrűség lesz, akkor a mértékegysége egység, ezért a szorzat dimenziótlan valószínűség — de erről majd a Sűrűség és eloszlásfüggvény alfejezetben.
A határ fogalma itt ugyanaz, mint amit a deriváltnál láttunk: rögzített szabályú közelítési folyamatot vizsgálunk. Az integrált úgy definiáljuk, hogy a legnagyobb részintervallum-szélesség nullához tart:
feltéve, hogy ez a határérték létezik, és nem függ a felosztás módjától vagy a mintapont választásától. A folytonos, szelíd függvényekre ez teljesül; a későbbi szakaszos vagy szinguláris függvényeknél elővigyázatosság kell.
A kiinduló feladat pontos értéke a hatványfüggvény elemi integrálási szabályából:
A Riemann-szumma finomodását az alábbi NumPy-kóddal mutathatjuk meg. A kódban a trapezoid-összeget számítjuk, és összehasonlítjuk a zárt képletből adódó értékkel. Az esetén ez a képlet pontosan megadja a trapezoid-közelítést egyenletes rácson:
import numpy as np
def f(x):
return x * x
a, b = 0.0, 1.0
for n in (4, 16, 64):
x = np.linspace(a, b, n + 1) # shape (n+1,), float64
h = (b - a) / n
trap = 0.5 * np.sum((f(x[:-1]) + f(x[1:])) * h)
expected = (2 * n * n + 1) / (6 * n * n)
print(f"n={n:2d} trap={trap:.12f} expected={expected:.12f} diff={trap - expected:.2e}")A kód kimenete ebben az írásmódban nem lefuttatott eredményjegyzékből származik; az alábbi táblázat a fenti képletekből közvetlenül számított, elméletileg várt érték. A sort rögtön a táblázat után kézzel is ellenőrizzük:
| n | trap | expected | különbség |
|---|---|---|---|
| 4 | 0,343750000000 | 0,343750000000 | 0 |
| 16 | 0,333984375000 | 0,333984375000 | 0 |
| 64 | 0,333374023438 | 0,333374023438 | 0 |
Az görbe szemléltetése:
A kézi ellenőrzés N=4-re. A rács: , . A bal oldali téglalapok magassága: ; a szélesség mindig . A bal összeg:
A jobb oldali összeg a jobb végpontokat veszi: , szorozva -val: . A trapezoid az átlaguk:
A pontos értékhez képesti hiba tehát
Ez a
képletből is látszik:
,
illetve
,
tehát a hiba elméletileg
.
A fenti táblázat diff oszlopa azért 0, mert a kódban a
kitevőhatvány-rácson a választott rácson a numerikus összeg és az
analitikus képlet lebegőpontos értéke az adott végrehajtásban
egybeeshet; általános feladathoz inkább np.isclose vagy
1e-12 tolerancia javasolt.
A gyakorlati munkához a scipy.integrate modul adaptív,
nem egyenletes rácsot használó megoldókat is kínál; ezek a fajta
egyszerű esetben sokkal kisebb hibával dolgoznak, mint a rögzített
trapezoid. A pontos hívásformát és a lokális verzió számát a laborban a
SciPy integrációs dokumentációjával érdemes ellenőrizni.
Négy tanulságot érdemes kiemelni:
A bal és jobb oldali összeg keretezi az integrált egy monoton függvénynél. Mivel növekvő -en, a bal téglalapok alábecsülik, a jobb téglalapok felülbecsülik a területet: . A trapezoid ezek átlaga, ezért a hiba részben kiegyenlítődik.
A trapezoid hibája . Az -példán a hiba pontosan , mert . Amikor -t négyszerezzük, a hiba durván tizenhatodolódik. Ez a sima függvények esetén szokásos viselkedés; a szakaszos függvényekre csak marad, ahogy az egyik feladat mutatja.
A görbe magassága és a görbe alatti terület két külön mennyiség. Az magasság nem azt jelenti, hogy a terület 1; a terület , mert a magasság az intervallum nagy részén kisebb 1-nél. Az egységek is különböznek: a magasság mértékegysége az egysége, a területé az egysége szorozva az egységével.
A határátmenet finomabb és finomabb rácson ellenőrizhető. A a valódi értéktől körülbelül -tel tér el; négy tizedesjegyre még nem azonos a szokásos kerekítésnél; a határozott integrál ezt a folyamatot jelenti, akkor is, ha a gyakorlatban véges rácson állunk meg.
A kompozit trapézszabály másodrendű hibabecslése elegendő simasági feltétel mellett, például korlátos második derivált esetén adható. Szakadásoknál vagy nem sima integrandusnál a konvergenciarend eltérhet; a rácsfinomítás önmagában nem bizonyít helyességet.
A kiszállító furgon sebessége km/perc, ahol perc. Indokold saját szóval, miért adja a megtett utat, és mi a kapott terület mértékegysége! Ezután számítsd ki a trapezoid-közelítést egyetlen részintervallummal, -gyel, vagyis a két végpontot összekötő egyenes alatti területként. Hasonlítsd össze a pontos km értékkel! Miért kapható itt -gyel is pontos eredmény?
Módosítsd a példakódot úgy, hogy az függvényt integrálja a intervallumon, , és mellett! A pontos érték . Számítsd ki a trapezoid-közelítéseket, ellenőrizd, hogy a hibák közelítőleg négydelődnek-e! Hogyan változik a hibaelőjel?
Egy tanuló az függvényt integrálja a intervallumon. Az alábbi numerikus adatokkal rendelkezünk:
x = np.linspace(0, 1, 17)
h = (1 - 0) / 16
wrong = 0.5 * np.sum(np.exp(-x[:-1]) + np.exp(-x[1:])) # hibásA wrong kimenet körülbelül 10,1, a pontos terület pedig
.
Mi a hiba? Add meg a javított egy sort, és becsüld meg, miért ad a
javított verzió 0,6321-hez közeli értéket!
Legyen
és integráljuk -en, a pontos terület . Számítsd ki a trapezoid-közelítést és esetén! Mit tapasztalsz a hibával kapcsolatban, ha az -t megduplázod? Miért nem érvényes itt az osztályozás?
A sebesség az út idő szerinti változási rátája: ha rövid időt nézünk, a megtett út közelítőleg km. Az összegzés a kis lépéseket teszi teljessé, ezért a teljes út. A mértékegység: (km/perc) · perc = km.
Az trapezoid a két végpont közötti szakasz alatti terület:
Pontos eredményt kapunk, mert a trapezoid két pont között egyenest feltételez, és a sebesség itt lineáris: az egyenes alatti terület valóban a két végpontmagasság átlaga szorozva a szélességgel. Ez egy fontos érvényességi korlát: a trapezoid lineáris függvényen a rácstól függetlenül egzakt, görbe függvényen viszont rácsfüggő hibát hagy.
A kód módosítása:
def g(x):
return np.sin(x)
a, b, exact = 0.0, np.pi, 2.0
for n in (4, 8, 16):
x = np.linspace(a, b, n + 1)
h = (b - a) / n
trap = 0.5 * np.sum((g(x[:-1]) + g(x[1:])) * h)
print(f"n={n:2d} trap={trap:.6f} error={trap - exact:.6f}")Az elméletileg várt értékek:
Az egymás utáni hibák aránya közelítőleg és , tehát az viselkedés igazolódik. A hiba negatív: a szinusz -n konvex módon görbül lefelé, a trapéz a húr alatti területet adja, amely kisebb a görbe alatti területnél.
A hibás kód elfelejtette a
szorzót. A wrong összeg a trapézmagasságok összege, vagyis
egy hosszúság jellegű mennyiség, nem terület; mert
tagjai
mértékegységűek, hiányzik a · h. Emiatt az eredmény
körülbelül a 16-szorosa a területnek, hiszen
.
A javítás:
correct = 0.5 * np.sum((np.exp(-x[:-1]) + np.exp(-x[1:])) * h)A várt eredmény a értékhez közel lesz, a maradék hiba nagyságú. A hibaforrás azonos azzal a hibával, amikor hisztogrammagasságokat összegzünk oszlopszélesség nélkül: az összeg nem terület.
esetén , a rács: . A függvényértékek: , és . A trapézösszeg:
Tehát a hiba .
esetén , a rács . A belső csomópontok közül az pontok: , ez 5 darab nulla; a maradék belső pontok –tól -ig 14 darab egyes. A trapézösszeg:
A hiba . A rács finomításakor a hiba feleződött, nem negyedelődött: a szakadás körüli két részintervallumon a trapéz mindig a valódi ugrás felét adja, és ez a járulék -val arányos. Ezért a trapezoid konvergenciája csak kellően sima függvényekre támaszkodhat; ugrás vagy csúcs esetén a hiba -ra romlik.
Gyakori tévedés: a görbe magassága helyett a görbe alatti területet tévesen a végponti magassággal azonosítják. Ellenpélda: -re , tehát valaki azt mondhatná, hogy a terület ; a fenti számítás mutatja, hogy a terület . A magasság pillanatnyi érték, a terület az összes magasság súlyozott összege az intervallumon.
Visszautalás Meredekség és numerikus derivált alfejezetre: a deriváltnál a differenciahányados a változási ráta volt, és a mértékegység a kimenet/bemenet hányadosa. Az integrál ennek a fordított iránya: a rátából visszanyert teljes mennyiség, amelynek mértékegysége a kimenet·bemenet szorzat. A két fogalom nem ugyanaz a szám, hanem egymás inverz műveletei.
Visszautalás CSV-től Parquet-ig: séma és partíció alfejezetre: a Parquet-fájlok ellenőrzésénél a sorösszeg fejezte ki a teljes minor unit értéket, és a duplikálódás miatt a join után a teljes összeg megnőtt. Az integrál ugyanennek az összegzési gondolatnak a folytonos megfelelője: véges sorösszeg helyett végtelenül sok, nullához tartó szélességű járulékot adunk össze.
Önellenőrzés:
A válaszok a fenti szövegben ellenőrizhetők; ha bármelyik nem világos, érdemes újra elvégezni a kézi N=4 számítást.
A Riemann-szumma téglalapokkal, a trapezoid-szabály trapézokkal közelíti a görbe alatti területet; mindkettő véges összeg, amelynek határértéke a finomabb rácson a határozott integrál. A terület mértékegysége az integrandus és a tengely mértékegységének szorzata, ezért például a sebesség-idő integrál út hosszúságot ad. Az területét három rácsfinomságon kiszámolva láttuk: a bal és jobb oldali összeg keretezi a pontos értéket, a trapezoid hibája pedig sima függvényre, míg szakadásos függvényre csak marad. A következő alfejezet ezt a területfogalmat a sűrűségre és eloszlásfüggvényre alkalmazza.