2. Interpolációs görbék¶
2.1. Az interpolációs feladat¶
Legyenek adottak a \(\textbf{p}_0, \textbf{p}_1, \ldots, \textbf{p}_n \in \mathbb{R}^D, n, D \in \mathbb{N}, n > 0\)! Keresünk egy olyan \(\textbf{r}(u)\) függvényt, amely esetében találhatunk olyan \(u_0, u_1, \ldots, u_n \in \mathbb{R}\) paraméterértékeket, amelyek esetében teljesül, hogy \(\textbf{r}(u_i) = \textbf{p}_i, \forall i \in [0, n]\).
Megjegyzés
A \(D\) a tér dimenzióját jelöli, amelyben a görbét keressük.
Az indexelést lehetne 1-től is kezdeni. Általánosságban nincs jelentősége. Itt azért 0 kezdőindex szerepelt, mert a továbbiakban is az lesz a jellemző.
Az interpolációs feladat általánosságban nem követeli meg, hogy paraméteres görbét keressünk. A következőkben is paraméteres görbékkel foglalkozunk, ez az oka, hogy így került felírásra az általános eset is.
A modellező szempontjából az interpoláció praktikusan azt jelenti, hogy a modellezendő alakzat néhány pontját adjuk meg, és azok alapján, az interpolációs függvény segítségével számíthatjuk ki a többit.
A szakirodalomban az interpoláló görbét, és az interpolációs pontokat elég gyakran egyaránt \(\textbf{p}\)-vel jelölik. Félreértést abban az esetben nem okoz, hogy ha tudjuk, hogy
a \(\textbf{p}_i\) egy pontsorozat \(i\) indexű elemét jelöli, míg
a \(\textbf{p}(u)\) egy vektor értékű függvény \(u\) pontban felvett értéke.
2.2. Lagrange interpoláció¶
Ebben az esetben a \(\textbf{p}(u)\) egy legfeljebb \(n\)-ed fokú polinomként keressük, vagyis az alábbi alakban:
vagy röviden:
Tétel
Mindig van egyértelmű megoldása a problémának, hogy ha az interpolációs pontokhoz különböző \(u_i\) értékeket választunk.
Bizonyítás (konstruktív)
Adjunk meg a \(\textbf{p}_i\) interpolációs pontokhoz egy-egy \(u_i\) értéket! Ezen \(u_i\) értékekből felírhatunk
vektorokat. Vegyük észre, hogy \(\textbf{p}_i = \textbf{u}_i \cdot \textbf{a}\) teljesül \(\forall i \in [0, n]\)!
Ezek alapján felírható a következő mátrixos alak:
ahol az együtthatómátrix sorai az \(\textbf{u}_i\) vektorok.
Ahhoz, hogy létezzen, és egyértelmű megoldásunk legyen, az együtthatómátrix determinánsa nem lehet nulla. Vegyük észre, hogy az együtthatómátrix egy Vandermonde mátrix, amelynek a determinánsa
formában számítható!
Abban az esetben, hogy ha minden interpolációshoz ponthoz választott \(u\) értékünk különböző, akkor a determináns biztosan nem lesz 0, így van egyértelmű megoldásunk. \(\square\)
Lásd még
2.2.1. Lagrange féle interpolációs polinom¶
Legyenek adottak \(u_i, i \in [0, n]\) egymástól különböző értékek! Az ezekből képzett
polinomokat \(n\)-ed fokú Lagrange féle interpolációs polinomoknak nevezzük.
Ezek segítségével a Lagrange interpolációs görbét a
formában is felírhatjuk.
Az \(L_i^n(u)\) értékek így a pontok egy \(u\) paraméter szerinti konvex kombinációját adják, vagyis teljesül, hogy
A paraméterezéshez használt \(u_i, i \in [0, n]\) pontokban teljesül, hogy \(L_i^n(u_j) = \delta_{ij}\) (Kronecker delta), vagyis
Megjegyzés
Előnye, hogy aránylag könnyen számítható.
Tervezésnél problémát okozhat, hogy a görbe csak globálisan vezérelhető.
A Lagrange interpolációt ilyen formában nem túl gyakran használják, mert hajlamos oszcillálni.
A töröttvonalas közelítés a Lagrange interpoláció egy speciális eseteként is tekinthető.
2.3. Hermit ív¶
Tegyük fel, hogy két pontot szeretnénk interpolálni úgy, hogy ismertek a görbe végpontjaihoz tartozó érintővektorok.
Jelölje \(\textbf{p}_0\) és \(\textbf{p}_1\) az érintővektorokat, a \(\textbf{t}_0\) és \(\textbf{t}_1\) pedig az ezekhez tartozó érintővektorokat!
A görbét az
alakban keressük, amelyre teljesül, hogy
Az ezen feltételek alapján létrejött egyenletrendszer megoldása az együtthatókra:
\(\rhd\) Ellenőrízzük, hogy valóban ez az egyenletrendszer megoldása!
Behelyettesítve és átrendezve:
A számítást átírhatjuk az
Ennek az alaknak megvan az a nagy előnye, hogy általában a görbe kirajzolásához azonos végpontok és az irányvektorok mellett kell a számítást több különböző \(u\) értékre meghatározni, amely így egy \(\mathbb{R}^{4 \times 4}\) mátrixszal való szorzást eredményez az \(u\) értékekből számított vektorral.
Az interpolációt felírhatjuk Hermite polinomok segítségével is az
alakban, melyben a harmadfokú Hermite polinomok
Megjegyzés
Az érintővektorok mellett magasabb fokú deriváltakat is megadhatunk. Ekkor az interpolációs polinom fokszáma is nagyobb lesz.
Általánosságban Hermite ívnek neveznek minden olyan görbét, melyet a végpontok és az azokban adott valamilyen rendű deriváltak alapján határozunk meg.
2.4. Interpoláló spline-ok¶
A tervezéshez a Hermite ív esetében megadott 2 interpolációs pont kevés lehet, illetve a Lagrange interpolációnál tapasztalható oszcilláció és globális vezérelhetőség is problémát jelenthet. Érdemes tehát olyan módszereket használni, melynél
tetszőleges számú interpolációs pontot használhatunk,
meg tudunk maradni a polinomos interpolációnál,
a fokszámot alacsonyan tudjuk tartani.
Erre a megoldást az interpoláló spline-ok, mint több, alacsonyabb fokszámú polinomiális ív összekapcsolása jelenti.
2.4.1. Hermite ívek összekapcsolása¶
Legyenek adottak a \(\textbf{p}_0, \textbf{p}_1, \ldots, \textbf{p}_n\) interpolációs pontok, a hozzájuk rendelt, egymástól különböző \(u_0, u_1, \ldots, u_n\) pontok, továbbá a \(\textbf{t}_0, \textbf{t}_1, \ldots, \textbf{t}_n\) érintővektorok.
Keressük azt a \(\textbf{c}\) görbét, melyre teljesül, hogy
A görbe meghatározása harmadfokú Hermite ívek összekapcsolásával kézenfekvő módon megoldható.
2.4.2. Bessel-féle érintők¶
Tegyük fel, hogy harmadfokú, egymáshoz folytonosan kapcsolódó ívekből szeretnénk egy spline-t létrehozni, viszont a pontokban az érintővektorokat nem szeretnénk megadni, hanem származtatnánk a csomópontokból. Ezt például a Bessel-féle érintők felhasználásával tehetjük meg.
Tegyük fel, hogy egy \(\textbf{p}_i\) ponthoz tartozó érintőt szeretnénk meghatározni, ahol \(i \in [1, n - 1]\). Illesszünk egy másodfokú görbét ezekre, melynek általános alakja:
Teljesülnie kell, hogy
Az összefüggés mátrixos alakban felírva az alábbi:
Az \(\textbf{a}_0\), \(\textbf{a}_1\) és \(\textbf{a}_2\) együtthatókat így tehát a lineáris egyenletrendszer megoldásaként kapjuk.
Ezek alapján az \(u_i\) paraméterhez tartozó érintőt a
számításból kapjuk.
2.4.3. Érintők számítása a szomszédos pontokból¶
Megtehetjük, hogy egy \(\textbf{p}_i\) ponthoz tartozó érintőt kizárólag a \(\textbf{p}_{i-1}\) és \(\textbf{p}_{i+1}\) pontokból számítunk ki, például az
összefüggéssel. A \(\textbf{t}_0\) és \(\textbf{t}_n\) vektorok meghatározásához ekkor más módszert kell alkalmaznunk. (Lehet például Bessel parabola alapján számolni azokat.)
2.4.4. Catmull-Rom spline¶
A Catmull-Rom spline esetében a \(\textbf{t}_i, i \in [1, n-1]\) érintővektorokat a
számíthatjuk, ahol \(\tau \in \mathbb{R}, \tau > 0\). A kezdő és a végpont esetében:
használható.
Leggyakrabban a \(\tau = 0.5\) paramétert használják hozzá.
2.4.5. Overhauser spline¶
Az Overhauser spline esetében is csak a \(\textbf{p}_0, \textbf{p}_1, \ldots, \textbf{p}_n\) pontokat, és a hozzájuk tartozó, egymástól különböző \(u_0, u_1, \ldots, u_n\) paraméterértékeket tekintjük ismertnek.
Jelöljük \(\textbf{a}_i\)-vel a \(\textbf{p}_0\) és a \(\textbf{p}_1\) pontok közé tartozó ívet. Ennek a meghatározásához számítsuk ki (az említett két ponthoz tartozó) \(\textbf{c}_i\) és \(\textbf{c}_{i+1}\) Bessel parabolaíveket.
A spline ez esetben tulajdonképpen a két görbe pontonkénti konvex kombinációját számolja \(u\) függvényében változó súlyozással, vagyis:
ahol \(u \in [u_i, u_{i+1}], i = 1, 2, \ldots, n - 2\).
A spline első és utolsó ívén közvetlenül a Bessel parabola kerül felhasználásra.
2.4.6. Ferguson spline¶
Tegyük fel, hogy egy olyan spline-t szeretnénk kapni, amelyik
harmadrendű ívekből épül fel, és
a csomópontokban másodrendben is folytonosan kapcsolódik (vagyis \(\ddot{\textbf{r}}_{i-1}(u_i) = \ddot{\textbf{r}}_{i}(u_i)\)).
Ezt úgy érhetjük el, hogy ha kiszámítjuk, hogy Hermite ívek esetében milyen érintővektorok lehetnek megfelelőek.
A Hermite ív második deriváltját az \(\ddot{\textbf{r}}(u) = 2 \textbf{a}_2 + 6 \textbf{a}_3(u)\) alakban írhatjuk föl. Ennek az együtthatóit az ívet meghatározó vektorok függvényében ismerjük, vagyis
A 0 és az 1 itt egyetlen ívhez tartozó indexek, amelyekről ez esetben tudjuk, hogy
az \(\ddot{\textbf{r}}_{i-1}(u)\) ív esetében a 0 helyett \((i-1)\), az 1 helyett pedig \(i\) szerepel, míg
az \(\ddot{\textbf{r}}_{i}(u)\) ív esetében a 0 helyett \(i\), az 1 helyett pedig \((i+1)\).
Az \(\ddot{\textbf{r}}_{i-1}(u_i) = \ddot{\textbf{r}}_{i}(u_i)\) egyenletbe az előbbieket visszahelyettesítve, majd átrendezve kapjuk, hogy:
Vegyük észre, hogy a jobb oldalon csak ismert értékek szerepelnek!
Vezessük be a
jelölést!
Ezzel így egy \((n+1)\) darab egyenletet és ugyanennyi ismeretlent tartalmazó lineáris egyenletrendszert kapunk. Hiányoznak viszont belőle az első és utolsó pontra vonatkozó peremfeltételek. Ezek megadására például az alábbi lehetőségek állnak rendelkezésre.
Rögzített (clamped): A végpontokban hiányzó érintőket mi magunk megadhatjuk.
Természetes (natural): A kezdő és végpontban a görbületet nullának tekinthetjük.
Kvadratikus (quadratic): Az első és utolsó ív esetében az ív kezdő és végpontjában a deriváltak megegyeznek.
Harmadrendű folytonosság (not-a-knot): Az \(u_1\) és \(u_{n-1}\) paraméterekhez tartozó pontokban feltételezhetünk harmadrendű folytonosságot.
Bessel: A kezdő és végpontban a Bessel-féle parabola érintőit használhatjuk.
Parabola érintője: Az első és utolsó ívre azok ismert érintőit felhasználva szerkeszthetünk parabolát, melynek érintőjét használhatjuk a végpontok érintőjeként.
2.5. Paraméterezés¶
A korábbiakban adottnak tekintettük, hogy ismertek az \(u_i\) értékek (legegyszerűbb esetben például \(u_i = i\) formában). Ezek megválasztására azonban különféle lehetőségek vannak, melyeket a következőkben tekintünk át.
2.5.1. Egyenközű paraméterezés¶
Egyenközű, vagy uniform paraméterezésről beszélünk, hogy ha az \((u_{i+1} - u_i)\) kifejezés egy konstans érték (bármilyen \(i\) esetén).
Legegyszerűbb esetben használhatjuk az \(u_i = i\) összefüggést.
Hogy ha a görbénkent \(n \in \mathbb{N}\) egyenlő részre bontjuk fel, úgy a paraméterezést megadhatjuk az \(u \in [0, 1]\) intervallumon az \(u_i = i / n, i = 0, 1, \ldots, n\) választással.
A paraméterezési mód előnye, hogy
egyszerű,
invariáns a pontok affin transzformációjára.
Hátránya, hogy
nem veszi számításba az egymást követő pontok távolságát, a távoli pontok között gyorsabban mozog a paraméter, ami kihat a görbület alakjára.
2.5.2. Húrhosszal arányos paraméterezés¶
Az ívhossz szerinti paraméterezés közelítése. Számítása:
ahol \(i = 1, 2, \ldots, n\).
Előnye, hogy egyenletesebb sebességű bejárást tesz lehetővé.
2.5.3. Centripetális paraméterezés¶
Arra törekszünk, hogy a görbe bejárása során a centripetális gyorsulás legyen minél kisebb. Számítása:
ahol \(i = 1, 2, \ldots, n\).
2.5.4. Exponenciális paraméterezés¶
Egy \(e\)-vel jelölt kitevő segítségével az egyenközű, a húrhosszal arányos és a centripetális paraméterezést egy paraméterezési módban általánosíthatjuk. Számítása:
ahol \(e \in [0, 1], i = 1, 2, \ldots, n\).
Láthatjuk, hogy
az \(e = 0\) az egyenközű paraméterezés,
az \(e = 0.5\) a centripetális paraméterezés,
az \(e = 1\) a húrhosszal arányos paraméterezés.
2.6. Kérdések, elméleti feladatok¶
Mi az interpolációs (alap)feladat?
Hogyan számítható a Lagrange interpoláció? Melyek az előnyei és hátrányai?
Mit nevezünk Hermite ívnek? Hogyan számítható?
Melyek a harmadfokú Hermite polinomok?
Melyek a spline-ok használatának az előnyei?
Hogyan adhatunk meg spline-okat Hermite ívek segítségével?
Mit nevezünk Bessel parabolának?
Spline-ok esetében hogyan használhatjuk a Bessel parabolákat?
Spline-ok esetében hogyan számolhatjuk az érintőket csak a szomszédos pontokat felhasználva?
Mi az a Catmull-Rom spline? Hogyan számíthatjuk ki?
Mi az az Overhauser spline? Milyen számítások tartoznak hozzá?
Mit nevezünk Ferguson spline-nak? Milyen peremfeltételek tartoznak hozzá?
Milyen paraméterezési módok állnak rendelkezésre interpolációs spline-ok esetében?
2.7. Számítási feladatok¶
Adott a térben 4 pont, és hozzá 4 paraméterérték. Írjuk fel azt a Lagrange interpolációs görbét, amely ezeken a pontokon áthalad!
Adott a síkban 2 pont, és a hozzá tartozó érintővektorok. Írjuk fel az ezek által meghatározott Hermit ívet!
Adott 4 pont a síkon. Spline interpolációhoz határozzuk meg Bessel parabolák segítségével az érintő vektorokat!
Adott 6 pont a síkon. Határozzuk meg Catmull-Rom spline esetében az ezekhez tartozó érintővektorokat!
Adott a síkon 4 pont. Írjuk fel az Overhauser spline-t!
Adott a síkon 6 pont. Határozzuk meg a húrhosszal arányos paraméterezést!
2.8. Programozási feladatok¶
2.8.1. Keretrendszer összerakása¶
Vizsgáljuk meg, hogy milyen API-k jöhetnek szóba a preferált programozási nyelvhez!
Készítsünk egy keretrendszert, amelyben a kontrollpontokat lehet mozgatni!
Nézzük meg példaként a https://gitlab.com/imre-piller/me-courses repositoriban szereplő keretrendszereket!
2.8.2. Lagrange interpoláció¶
Írjuk fel a Lagrange interpolációs polinomokat másod- és harmadfokú polinomokra!
Ábrázoljuk azokat \(u\) paraméter függvényében!
Készítsünk egy programot, amelyben 4 pontot lehet mozgatni, és kirajzolásra kerül a hozzájuk tartozó Lagrange interpolációs görbe!
2.8.3. Hermite ív¶
Ábrázoljuk a harmadfokú Hermite polinomokat!
Készítsünk egy programot, amelyben meg lehet adni 2 pontot, a hozzájuk tartozó érintőket, és megjelenítésre kerül ezek alapján a Hermite ív!
2.8.4. Bessel parabola¶
Készítsünk egy programot, amely 3 pontra meghatározza a hozzájuk tartozó Bessel parabolát!
Jelenítsük is meg a parabolát!
Jelenítessük meg a középső ponthoz tartozó érintőt!
Készítsünk egy programot, amely a Bessel érintők alapján állít össze Hermite ívekből egy spline-t! (Használjunk hozzá legalább 4 pontot!)
Definiáljunk egy spline-t, amely a Bessel-féle parabolák helyett a 3 pontra írható körök alapján számítja ki a pontbeli érintőket!
2.8.5. Érintők számítása a szomszédos pontokból¶
Jelenítsük meg, hogy ilyen érintőket kapunk, hogy ha azokat a szomszédos pontok alapján határozzuk meg!
Ezek alapján rajzoljuk meg Hermite ívekből a spline-t!
2.8.6. Catmull-Rom spline¶
Számítsuk ki, és jeleníttessük meg a Catmull-Rom spline-t!
Vizsgáljuk meg a \(\tau\) paraméter hatását!
2.8.7. Overhauser spline¶
Egy spline pontjaihoz jeleníttessük meg a Bessel parabolákat!
Ezek alapján rajzoljuk meg az Overhauser spline-t!
2.8.8. Paraméterezési módok¶
Implementáljuk a különféle paraméterezési módokat, és vizsgáljuk meg a hatásukat!