6.16. Krivulje i integracija

Matematičke stranice pokrivale su operacije koje uzimaju polje i proizvode polje (ili skalar) – aritmetiku, redukcije, proširivanje. Ova stranica pokriva drugačiju klasu operacija: one koje polje tretiraju kao uzorkovanu funkciju i postavljaju pitanja o samoj funkciji. Interpolaciju između uzoraka, prilagodbu krivulje njima, integraciju ispod njih, konvoluciju s drugim međuspremnikom.

Sve one prihvaćaju ndarray ulaze i vraćaju ili float skalar ili float ndarray.

6.16.1. Interpolacija

interp() radi jednodimenzionalnu linearnu interpolaciju. xp je monotono rastuće 1-D polje nezavisnih vrijednosti; fp su odgovarajuće zavisne vrijednosti; x je mjesto na kojem interpolant treba evaluirati:

xp = np.array([0.0, 1.0, 2.0, 3.0])
fp = np.array([10.0, 20.0, 25.0, 30.0])
x  = np.array([0.5, 1.5, 2.5])

np.interp(x, xp, fp)
# array([15.0, 22.5, 27.5])

Izvan raspona [xp[0], xp[-1]] rezultat se ograničava na fp[0] odnosno fp[-1]; ključne riječi left= i right= nadjačavaju te krajnje točke.

Koristi se na kameri za preslikavanje kalibracijske tablice na proizvoljne pozicije uzoraka – tablice temperature-u-napon termistora, nelinearne krivulje odziva piksela, gama pretraživanja po kanalu. Jedan poziv biblioteke, jedan prolaz kroz ulaze, bez Python petlje.

6.16.2. Prilagodba i evaluacija polinoma

polyfit() prilagođava polinom stupnja deg podatkovnim točkama (x, y) metodom najmanjih kvadrata i vraća koeficijente (najviši stupanj prvi):

x = np.array([0.0, 1.0, 2.0, 3.0, 4.0])
y = np.array([0.0, 1.1, 3.9, 9.1, 15.8])

coeffs = np.polyfit(x, y, 2)
# array([1.0, 0.0, 0.0])  (approximately)

Kada se x izostavi, koristi se range(len(y)) – korisno za brzu prilagodbu polinoma redovito uzorkovanom međuspremniku bez pridružene x-osi:

np.polyfit(y, 2)

polyval() evaluira polinom čiji su koeficijenti p u točki x. Ulaz x može biti skalar (vraća float) ili ndarray (vraća ndarray):

p = np.polyfit(x, y, 2)
fitted = np.polyval(p, x)

Prirodno uparivanje je pozvati polyfit jednom u vrijeme kalibracije, pohraniti koeficijente, i pozivati polyval za evaluaciju dobivene krivulje za svaku sličicu. Korak evaluacije polinoma šačica je float operacija po uzorku, što je jeftino čak i na najmanjim kamerama.

6.16.3. Konvolucija

convolve() vraća diskretnu linearnu konvoluciju pune duljine dvaju 1-D polja. Implementiran je samo full način; duljina izlaza je len(a) + len(v) - 1. Izrežite rezultat za isti učinak kao kod same i valid načina koje nudi desktop numpy

a = np.array([1.0, 2.0, 3.0])
v = np.array([0.5, 0.5])

np.convolve(a, v)
# array([0.5, 1.5, 2.5, 1.5])

Korisno za kratke FIR filtre i jezgre izglađivanja (box, trokut, gaussovska) gdje je postavljanje SOS lanca pretjerano. Vrijeme izvođenja proporcionalno je umnošku duljina dvaju polja – u redu za kratke jezgre, ali brzo postaje skuplje od FFT konvolucije za duge.

6.16.4. Trapezna integracija

trapz() integrira uzorkovanu funkciju složenim trapeznim pravilom:

x = np.linspace(0, np.pi, num=128)
y = np.sin(x)
np.trapz(y, x)             # ~ 2.0

Proslijedite dx= kada je razmak uzoraka uniforman i bitan je samo korak; proslijedite x= kada uzorci nisu ravnomjerno raspoređeni. Pravi poziv za integriranje već uhvaćenih podataka senzora, gdje analitički oblik nije dostupan.

Za podatke uzoraka koji su ograničeni pojasom (audio međuspremnik nakon filtra protiv aliasinga, na primjer), trapezno pravilo konvergira kao kvadrat broja uzoraka, što znači da udvostručenje duljine međuspremnika smanjuje pogrešku za faktor četiri.

Kada integrand nije međuspremnik uzoraka nego Python funkcija koju aplikacija može evaluirati u proizvoljnim točkama, pravi poziv je druga obitelj rješavača.