Splain

**Splain** on sile, ühesuguse struktuuriga tükiti polünomiaalne funktsioon, mis liitepunktides rahuldab teatud sileduse tingimusi. Interpolatsiooniprobleemides eelistatakse tihtipeale splain-interpolatsiooni polünomiaalsele interpolatsioonile, kuna see annab sarnaseid tulemusi, isegi kui kasutada madala astme polünoome.

Mõiste "splain" pärineb painduvatest spiraalsetest seadmetest, mida laevaehitajad jajoonestajad kasutavad siledate kujundite saamiseks.

## Sissejuhatus
Mõistet "splain" kasutatakse viitamiseks laiale funktsioonide klassile, mis tegeleb andmete interpoleerimise ja/või silumisega. Andmed võivad olla kas ühe- või mitmemõõtmelised. Splainidega lähendamine on tükiti interpoleerimine ühe ja sama astme polünoomiga.

Splain-funktsioonid on olemuselt piiratud mõõtmed, mis on peamine põhjus nende kasulikkuseks arvutustes ja esitustes. Ülejäänud artiklis on keskendutud täielikult ühemõõtmelistele, polünoomsetele splainidele ja kasutatud terminit "splain" selles piiratud tähenduses.

## Definitsioon
Lihtsaim splain on tükiti polünomiaalne funktsioon, kus igal polünoomil on üks muutuja. Splain S võtab väärtused vahemikust \left [ a,b \right ] ja määrab need \R reaalarvude hulka:

S\colon [a,b]\rightarrow \R.

Kuna S on tükiti määratletud, valime k lõiku vahemikus \left [ a,b \right ]: 
: [t_i, t_{i+1}], i=0,...,k-1

: [a,b]=[t_0,t_1]\cup [t_1,t_2]\cup ...\cup [t_{k-1},t_{k-1}]\cup [t_{k-1},t_k]
: a=t_0\le t_1\le ...\le t_{k-1}\le t_k=b
Kõik need lõigud on seotud polünoomiga P_i,
: P_i\colon [t_i,t_{i+1}]\rightarrow \R.
i*-*ndas lõigus vahemikus \left [ a,b \right ] on S määratletud P_i abil,
: S(t)=P_0(t), t_0\le t\le t_1,

: S(t)=P_1(t), t_1\le t\le t_2,
: ...
: S(t)=P_{k-1}(t), t_{k-1} \le t\le t_k.

Antud k+1 punkti t_j(0\le j\le k) nimetatakse **sõlmedeks**. Vektorit t=(t_0,...,t_k) nimetatakse splaini **sõlme vektoriks**.
Kui sõlmed on ühtlaselt jaotatud vahemikus \left [ a,b \right ] siis splaini nimetatakse **ühtlaseks**, vastasel juhul nimetatakse splaini **ebaühtlaseks**.

Kui k*-*nda polünoomi tükkidel P_i on iga aste vähemalt n, siis splain on** astmega** \le n (või \le n+1).

Kui 1\le i\le k-1\colon S\in C^{\tau_i} kehtib k-1 punkti t_i* *naabruses, siis on splain sile (vähemalt) C^{\tau_i} kohal t_i. See tähendab, et kohal t_i jagavad P_{i-1} ja P_i ühist tuletisväärtust astmest 0 (funktsiooni väärtusest) kuni astmeni r_i (teisisõnu, kahe kõrvuti asetseva polünoomi tükki ühendavad kõige rohkem n-r_i sileduse kaotust).

Vektorit r=(r_1,...,r_{k-1}) kus splainil on siledus C^{\tau_i} kohal  t_i, i=1,...,k-1 nimetatakse splaini **sileduse vektoriks**.
## Näited
Oletame, et intervall [a,b] on [0,3] ja alamintervallid on[0,1],[1,2],[2,3]. Oletame, et polünoomi tükid peavad olema astmega 2 ja tükid vahemikus [0,1] ja [1,2] peavad ühinema väärtuse ja esimese tuletisega (t=1 korral) samal ajal kui tükid vahemikus [1,2] ja [2,3] ühinevad lihtsalt väärtusega (t=2 korral). See määrab splaini S(t) tüübi, mille kohaselt

: S(t) = P_0 (t) = -1+4t-t^2 \mbox{ , } 0 \le t 
: S(t) = P_1 (t) = 2t \mbox{ , } 1 \le t 
: S(t) = P_2 (t) = 2-t+t^2 \mbox{ , } 2 \le t \le 3
oleks selle tüübi liige ja ka
: S(t) = P_0 (t) = -2-2t^2 \mbox{ , } 0 \le t 
: S(t) = P_1 (t) = 1-6t+t^2 \mbox{ , } 1 \le t 
: S(t) = P_2 (t) = -1+t-2t^2 \mbox{ , } 2 \le t \le 3

oleks selle tüübi liige. (Märkus: kuigi polünoomi tükk 2t ei ole ruutpolünoom, siis tulemust kutsutakse ikka ruutsplainiks. See näitab, et splaini astmeks on polünoom-osade maksimaalne aste.) Sellist tüüpi splaini pikendatud sõlme vektor oleks (0,1,2,2,3).

Kõige lihtsam splain on astmega 0. Seda nimetatakse ka astmeliseks funktsiooniks. Järgmine kõige lihtsam splain on astmega 1. Seda kutsutakse ka **lineaarsplainiks**. Kinnine lineaarsplain (st esimene ja viimane sõlm langevad kokku) on lihtsalt hulknurk.

Tavaline splain on naturaalne 3. astme **kuupsplain**. Sõna "naturaalne" tähendab, et splaini polünoomi teine tuletis on interpoleerimise intervalli lõpp-punktides võrdne nulliga:
: S*(a) \, = S*(b) = 0.

### Algoritm kuupsplainide arvutamiseks
Kuupsplainid on kujul {S}_{j} \left ( x  \right ) =  a_j + b_j \left ( x-x_j \right ) +  c_j  {\left ( x-x_j \right ) }^{2} + d_j {\left ( x-x_j \right ) }^{3}.
Arvestades koordinaatide komplektiC=  \left[    \left ( {x}_{0},{y}_{0}  \right ) ,  \left ( {x}_{1},{y}_{1}   \right ) , .... ,  \left ( {x}_{n},{y}_{n}  \right ) \right ] soovime leida hulga n \, splainiga {S}_{i} \left ( x  \right )   i = 0 , \ldots , n-1.

Need peavad rahuldama:
*  S_i \left (x_i \right) = y_i = S_{i-1}\left (x_i \right ), i = 1 , \ldots , n-1.
* {S^'}_i \left (x_i \right) = {S^'}_{i-1}\left (x_i \right ), i = 1 , \ldots , n-1.
* {S^{*}}_i \left (x_i \right) = {S^{*}}_{i-1}\left (x_i \right ), i = 1 , \ldots , n-1.
* {S^{*}}_0 \left (x_0 \right) = {S^{*}}_{n-1} \left (x_n \right ) =0.
Defineerime ühe kuupsplaini S \, 5-ennikuna (a,b,c,d,x_t) \, kus a,b,c \, ja d \, vastavad varem näidatud kujule ja x_t \, on võrdne parameetriga x_j. \,

**Algoritm kuupsplaini arvutamiseks:**
Sisend: koordinaatide hulk C \,, kus \left | C  \right | =n+1
Väljund: splainide hulk, mis koosneb n-ist 5-ennikust. 
# Loo uus massiiv a suurusega n+1 ja iga i = 0 , \ldots , n korral seadista a_i = y_i \,
# Loo uued massiivid b ja d mõlemad suurusega n.
# Loo uus massiiv h suurusega n ja iga i = 0 , \ldots , n-1 seadista h_i = x_{i+1} - x_i \,
# Loo uus massiiv \alphasuurusega n ja iga i = 0 , \ldots , n-1 seadista { \alpha }_{i}= \frac{3 }{{h}_{i} }  \left (  {a}_{i+1}-{a}_{i} \right )  -  \frac{3 }{{l}_{i} } .
# Seadista  l_n = 1; z_n = c_n = 0. \,
#  j = n-1 , n-2 , \ldots , 0 
##  c_j = z_j - {\mu}_j c_{j+1} \,
##  b_j = \frac{{a}_{j+1}-{a}_{j} }{{h}_{j} } -  \frac{ {h}_{j} \left ( {c}_{j+1} +2{c}_{j}  \right ) }{ 3} 
##  d_j = \frac{{c}_{j+1}-{c}_{j} }{3{h}_{j} } 
# Loo uus splainide komplekt ja nimeta see valjund_komplekt. Paiguta sinna n splaini S.
# Iga i = 0 , \ldots , n-1
## S_{i,a}=a_i
## S_{i,b}=b_i
## S_{i,c}=c_i
## S_{i,d}=d_i
## S_{i,x}=x_i
# Väljund valjund_komplekt

## Viited

## Välislingid
**Teooria**
* Kuuplsplain moodul Prof. John H. Mathews California State University, Fullerton
* Interaktiivne sissejuhatus splainidesse, ibiblio.org
**Exceli funktsioon**
* XLL Excel Addin Funktsioon kuupsplaini rakendamiseks
**Võrguteenuste pakkujad**
* Online kuupsplain-interpolatsiooni keskkond
* Õppimine simulatsioonide abil Erinevate kuupsplainide interaktiivne simulatsioon
* Sümmeetrilised splaini kõverad, Theodore Gray animatsioon, The Wolfram Demonstrations Project, 2007.
* Bezieri ja Splaini Kõverate uurimine, interaktiivne veebirakendus
**Arvutikood**
* Notes, PPT, Mathcad, Maple, Mathematica, Matlab, *Holistic Numerical Methods Institute*
* mitmesugused rutiinid, NTCC
* Sisl: Opensource C-library for NURBS, SINTEF
* VBA splain-interpolatsioon, vbnumericalmethods.com