\(\newcommand{\footnotename}{footnote}\)
\(\def \LWRfootnote {1}\)
\(\newcommand {\footnote }[2][\LWRfootnote ]{{}^{\mathrm {#1}}}\)
\(\newcommand {\footnotemark }[1][\LWRfootnote ]{{}^{\mathrm {#1}}}\)
\(\newcommand \ensuremath [1]{#1}\)
\(\newcommand {\LWRframebox }[2][]{\fbox {#2}} \newcommand {\framebox }[1][]{\LWRframebox } \)
\(\newcommand {\setlength }[2]{}\)
\(\newcommand {\addtolength }[2]{}\)
\(\newcommand {\setcounter }[2]{}\)
\(\newcommand {\addtocounter }[2]{}\)
\(\newcommand {\cline }[1]{}\)
\(\newcommand {\directlua }[1]{\text {(directlua)}}\)
\(\newcommand {\luatexdirectlua }[1]{\text {(directlua)}}\)
\(\newcommand {\protect }{}\)
\(\def \LWRabsorbnumber #1 {}\)
\(\def \LWRabsorbquotenumber "#1 {}\)
\(\def \mathchar {\ifnextchar "\LWRabsorbquotenumber \LWRabsorbnumber }\)
\(\def \mathcode #1={\mathchar }\)
\(\let \delcode \mathcode \)
\(\let \delimiter \mathchar \)
\(\let \LWRref \ref \)
\(\renewcommand {\ref }{\ifstar \LWRref \LWRref }\)
\(\newcommand {\intertext }[1]{\text {#1}\notag \\}\)
\(\newcommand {\mathllap }[2][]{{#1#2}}\)
\(\newcommand {\mathrlap }[2][]{{#1#2}}\)
\(\newcommand {\mathclap }[2][]{{#1#2}}\)
\(\newcommand {\mathmbox }[1]{#1}\)
\(\newcommand {\clap }[1]{#1}\)
\(\newcommand {\LWRmathmakebox }[2][]{#2}\)
\(\newcommand {\mathmakebox }[1][]{\LWRmathmakebox }\)
\(\newcommand {\cramped }[2][]{{#1#2}}\)
\(\newcommand {\crampedllap }[2][]{{#1#2}}\)
\(\newcommand {\crampedrlap }[2][]{{#1#2}}\)
\(\newcommand {\crampedclap }[2][]{{#1#2}}\)
\(\newenvironment {crampedsubarray}[1]{}{}\)
\(\newcommand {\crampedsubstack }{}\)
\(\newcommand {\smashoperator }[2][]{#2\limits }\)
\(\newcommand {\adjustlimits }{}\)
\(\newcommand {\SwapAboveDisplaySkip }{}\)
\(\require {extpfeil}\)
\(\Newextarrow \xleftrightarrow {10,10}{0x2194}\)
\(\Newextarrow \xLeftarrow {10,10}{0x21d0}\)
\(\Newextarrow \xhookleftarrow {10,10}{0x21a9}\)
\(\Newextarrow \xmapsto {10,10}{0x21a6}\)
\(\Newextarrow \xRightarrow {10,10}{0x21d2}\)
\(\Newextarrow \xLeftrightarrow {10,10}{0x21d4}\)
\(\Newextarrow \xhookrightarrow {10,10}{0x21aa}\)
\(\Newextarrow \xrightharpoondown {10,10}{0x21c1}\)
\(\Newextarrow \xleftharpoondown {10,10}{0x21bd}\)
\(\Newextarrow \xrightleftharpoons {10,10}{0x21cc}\)
\(\Newextarrow \xrightharpoonup {10,10}{0x21c0}\)
\(\Newextarrow \xleftharpoonup {10,10}{0x21bc}\)
\(\Newextarrow \xleftrightharpoons {10,10}{0x21cb}\)
\(\newcommand {\LWRdounderbracket }[3]{\underset {#3}{\underline {#1}}}\)
\(\newcommand {\LWRunderbracket }[2][]{\LWRdounderbracket {#2}}\)
\(\newcommand {\underbracket }[1][]{\LWRunderbracket }\)
\(\newcommand {\LWRdooverbracket }[3]{\overset {#3}{\overline {#1}}}\)
\(\newcommand {\LWRoverbracket }[2][]{\LWRdooverbracket {#2}}\)
\(\newcommand {\overbracket }[1][]{\LWRoverbracket }\)
\(\newcommand {\LATEXunderbrace }[1]{\underbrace {#1}}\)
\(\newcommand {\LATEXoverbrace }[1]{\overbrace {#1}}\)
\(\newenvironment {matrix*}[1][]{\begin {matrix}}{\end {matrix}}\)
\(\newenvironment {pmatrix*}[1][]{\begin {pmatrix}}{\end {pmatrix}}\)
\(\newenvironment {bmatrix*}[1][]{\begin {bmatrix}}{\end {bmatrix}}\)
\(\newenvironment {Bmatrix*}[1][]{\begin {Bmatrix}}{\end {Bmatrix}}\)
\(\newenvironment {vmatrix*}[1][]{\begin {vmatrix}}{\end {vmatrix}}\)
\(\newenvironment {Vmatrix*}[1][]{\begin {Vmatrix}}{\end {Vmatrix}}\)
\(\newenvironment {smallmatrix*}[1][]{\begin {matrix}}{\end {matrix}}\)
\(\newenvironment {psmallmatrix*}[1][]{\begin {pmatrix}}{\end {pmatrix}}\)
\(\newenvironment {bsmallmatrix*}[1][]{\begin {bmatrix}}{\end {bmatrix}}\)
\(\newenvironment {Bsmallmatrix*}[1][]{\begin {Bmatrix}}{\end {Bmatrix}}\)
\(\newenvironment {vsmallmatrix*}[1][]{\begin {vmatrix}}{\end {vmatrix}}\)
\(\newenvironment {Vsmallmatrix*}[1][]{\begin {Vmatrix}}{\end {Vmatrix}}\)
\(\newenvironment {psmallmatrix}[1][]{\begin {pmatrix}}{\end {pmatrix}}\)
\(\newenvironment {bsmallmatrix}[1][]{\begin {bmatrix}}{\end {bmatrix}}\)
\(\newenvironment {Bsmallmatrix}[1][]{\begin {Bmatrix}}{\end {Bmatrix}}\)
\(\newenvironment {vsmallmatrix}[1][]{\begin {vmatrix}}{\end {vmatrix}}\)
\(\newenvironment {Vsmallmatrix}[1][]{\begin {Vmatrix}}{\end {Vmatrix}}\)
\(\newcommand {\LWRmultlined }[1][]{\begin {multline*}}\)
\(\newenvironment {multlined}[1][]{\LWRmultlined }{\end {multline*}}\)
\(\let \LWRorigshoveleft \shoveleft \)
\(\renewcommand {\shoveleft }[1][]{\LWRorigshoveleft }\)
\(\let \LWRorigshoveright \shoveright \)
\(\renewcommand {\shoveright }[1][]{\LWRorigshoveright }\)
\(\newenvironment {dcases}{\begin {cases}}{\end {cases}}\)
\(\newenvironment {dcases*}{\begin {cases}}{\end {cases}}\)
\(\newenvironment {rcases}{\begin {cases}}{\end {cases}}\)
\(\newenvironment {rcases*}{\begin {cases}}{\end {cases}}\)
\(\newenvironment {drcases}{\begin {cases}}{\end {cases}}\)
\(\newenvironment {drcases*}{\begin {cases}}{\end {cases}}\)
\(\newenvironment {cases*}{\begin {cases}}{\end {cases}}\)
\(\newcommand {\MoveEqLeft }[1][]{}\)
\(\def \LWRAboxed #1!|!{\fbox {\(#1\)}&\fbox {\(#2\)}} \newcommand {\Aboxed }[1]{\LWRAboxed #1&&!|!} \)
\( \newcommand {\LWRABLines }[1][\Updownarrow ]{#1 \notag \\}\newcommand {\ArrowBetweenLines }{\ifstar \LWRABLines \LWRABLines } \)
\(\newcommand {\shortintertext }[1]{\text {#1}\notag \\}\)
\(\newcommand {\vdotswithin }[1]{\hspace {.5em}\vdots }\)
\(\newcommand {\LWRshortvdotswithinstar }[1]{\vdots \hspace {.5em} & \\}\)
\(\newcommand {\LWRshortvdotswithinnostar }[1]{& \hspace {.5em}\vdots \\}\)
\(\newcommand {\shortvdotswithin }{\ifstar \LWRshortvdotswithinstar \LWRshortvdotswithinnostar }\)
\(\newcommand {\MTFlushSpaceAbove }{}\)
\(\newcommand {\MTFlushSpaceBelow }{\\}\)
\(\newcommand \lparen {(}\)
\(\newcommand \rparen {)}\)
\(\newcommand {\ordinarycolon }{:}\)
\(\newcommand {\vcentcolon }{\mathrel {\mathop \ordinarycolon }}\)
\(\newcommand \dblcolon {\vcentcolon \vcentcolon }\)
\(\newcommand \coloneqq {\vcentcolon =}\)
\(\newcommand \Coloneqq {\dblcolon =}\)
\(\newcommand \coloneq {\vcentcolon {-}}\)
\(\newcommand \Coloneq {\dblcolon {-}}\)
\(\newcommand \eqqcolon {=\vcentcolon }\)
\(\newcommand \Eqqcolon {=\dblcolon }\)
\(\newcommand \eqcolon {\mathrel {-}\vcentcolon }\)
\(\newcommand \Eqcolon {\mathrel {-}\dblcolon }\)
\(\newcommand \colonapprox {\vcentcolon \approx }\)
\(\newcommand \Colonapprox {\dblcolon \approx }\)
\(\newcommand \colonsim {\vcentcolon \sim }\)
\(\newcommand \Colonsim {\dblcolon \sim }\)
\(\newcommand {\nuparrow }{\mathrel {\cancel {\uparrow }}}\)
\(\newcommand {\ndownarrow }{\mathrel {\cancel {\downarrow }}}\)
\(\newcommand {\bigtimes }{\mathop {\Large \times }\limits }\)
\(\newcommand {\prescript }[3]{{}^{#1}_{#2}#3}\)
\(\newenvironment {lgathered}{\begin {gathered}}{\end {gathered}}\)
\(\newenvironment {rgathered}{\begin {gathered}}{\end {gathered}}\)
\(\newcommand {\splitfrac }[2]{{}^{#1}_{#2}}\)
\(\let \splitdfrac \splitfrac \)
\(\newcommand {\LWRoverlaysymbols }[2]{\mathord {\smash {\mathop {#2\strut }\limits ^{\smash {\lower 3ex{#1}}}}\strut }}\)
\(\newcommand{\alphaup}{\unicode{x03B1}}\)
\(\newcommand{\betaup}{\unicode{x03B2}}\)
\(\newcommand{\gammaup}{\unicode{x03B3}}\)
\(\newcommand{\digammaup}{\unicode{x03DD}}\)
\(\newcommand{\deltaup}{\unicode{x03B4}}\)
\(\newcommand{\epsilonup}{\unicode{x03F5}}\)
\(\newcommand{\varepsilonup}{\unicode{x03B5}}\)
\(\newcommand{\zetaup}{\unicode{x03B6}}\)
\(\newcommand{\etaup}{\unicode{x03B7}}\)
\(\newcommand{\thetaup}{\unicode{x03B8}}\)
\(\newcommand{\varthetaup}{\unicode{x03D1}}\)
\(\newcommand{\iotaup}{\unicode{x03B9}}\)
\(\newcommand{\kappaup}{\unicode{x03BA}}\)
\(\newcommand{\varkappaup}{\unicode{x03F0}}\)
\(\newcommand{\lambdaup}{\unicode{x03BB}}\)
\(\newcommand{\muup}{\unicode{x03BC}}\)
\(\newcommand{\nuup}{\unicode{x03BD}}\)
\(\newcommand{\xiup}{\unicode{x03BE}}\)
\(\newcommand{\omicronup}{\unicode{x03BF}}\)
\(\newcommand{\piup}{\unicode{x03C0}}\)
\(\newcommand{\varpiup}{\unicode{x03D6}}\)
\(\newcommand{\rhoup}{\unicode{x03C1}}\)
\(\newcommand{\varrhoup}{\unicode{x03F1}}\)
\(\newcommand{\sigmaup}{\unicode{x03C3}}\)
\(\newcommand{\varsigmaup}{\unicode{x03C2}}\)
\(\newcommand{\tauup}{\unicode{x03C4}}\)
\(\newcommand{\upsilonup}{\unicode{x03C5}}\)
\(\newcommand{\phiup}{\unicode{x03D5}}\)
\(\newcommand{\varphiup}{\unicode{x03C6}}\)
\(\newcommand{\chiup}{\unicode{x03C7}}\)
\(\newcommand{\psiup}{\unicode{x03C8}}\)
\(\newcommand{\omegaup}{\unicode{x03C9}}\)
\(\newcommand{\Alphaup}{\unicode{x0391}}\)
\(\newcommand{\Betaup}{\unicode{x0392}}\)
\(\newcommand{\Gammaup}{\unicode{x0393}}\)
\(\newcommand{\Digammaup}{\unicode{x03DC}}\)
\(\newcommand{\Deltaup}{\unicode{x0394}}\)
\(\newcommand{\Epsilonup}{\unicode{x0395}}\)
\(\newcommand{\Zetaup}{\unicode{x0396}}\)
\(\newcommand{\Etaup}{\unicode{x0397}}\)
\(\newcommand{\Thetaup}{\unicode{x0398}}\)
\(\newcommand{\Varthetaup}{\unicode{x03F4}}\)
\(\newcommand{\Iotaup}{\unicode{x0399}}\)
\(\newcommand{\Kappaup}{\unicode{x039A}}\)
\(\newcommand{\Lambdaup}{\unicode{x039B}}\)
\(\newcommand{\Muup}{\unicode{x039C}}\)
\(\newcommand{\Nuup}{\unicode{x039D}}\)
\(\newcommand{\Xiup}{\unicode{x039E}}\)
\(\newcommand{\Omicronup}{\unicode{x039F}}\)
\(\newcommand{\Piup}{\unicode{x03A0}}\)
\(\newcommand{\Varpiup}{\unicode{x03D6}}\)
\(\newcommand{\Rhoup}{\unicode{x03A1}}\)
\(\newcommand{\Sigmaup}{\unicode{x03A3}}\)
\(\newcommand{\Tauup}{\unicode{x03A4}}\)
\(\newcommand{\Upsilonup}{\unicode{x03A5}}\)
\(\newcommand{\Phiup}{\unicode{x03A6}}\)
\(\newcommand{\Chiup}{\unicode{x03A7}}\)
\(\newcommand{\Psiup}{\unicode{x03A8}}\)
\(\newcommand{\Omegaup}{\unicode{x03A9}}\)
\(\newcommand{\alphait}{\unicode{x1D6FC}}\)
\(\newcommand{\betait}{\unicode{x1D6FD}}\)
\(\newcommand{\gammait}{\unicode{x1D6FE}}\)
\(\newcommand{\digammait}{\mathit{\unicode{x03DD}}}\)
\(\newcommand{\deltait}{\unicode{x1D6FF}}\)
\(\newcommand{\epsilonit}{\unicode{x1D716}}\)
\(\newcommand{\varepsilonit}{\unicode{x1D700}}\)
\(\newcommand{\zetait}{\unicode{x1D701}}\)
\(\newcommand{\etait}{\unicode{x1D702}}\)
\(\newcommand{\thetait}{\unicode{x1D703}}\)
\(\newcommand{\varthetait}{\unicode{x1D717}}\)
\(\newcommand{\iotait}{\unicode{x1D704}}\)
\(\newcommand{\kappait}{\unicode{x1D705}}\)
\(\newcommand{\varkappait}{\unicode{x1D718}}\)
\(\newcommand{\lambdait}{\unicode{x1D706}}\)
\(\newcommand{\muit}{\unicode{x1D707}}\)
\(\newcommand{\nuit}{\unicode{x1D708}}\)
\(\newcommand{\xiit}{\unicode{x1D709}}\)
\(\newcommand{\omicronit}{\unicode{x1D70A}}\)
\(\newcommand{\piit}{\unicode{x1D70B}}\)
\(\newcommand{\varpiit}{\unicode{x1D71B}}\)
\(\newcommand{\rhoit}{\unicode{x1D70C}}\)
\(\newcommand{\varrhoit}{\unicode{x1D71A}}\)
\(\newcommand{\sigmait}{\unicode{x1D70E}}\)
\(\newcommand{\varsigmait}{\unicode{x1D70D}}\)
\(\newcommand{\tauit}{\unicode{x1D70F}}\)
\(\newcommand{\upsilonit}{\unicode{x1D710}}\)
\(\newcommand{\phiit}{\unicode{x1D719}}\)
\(\newcommand{\varphiit}{\unicode{x1D711}}\)
\(\newcommand{\chiit}{\unicode{x1D712}}\)
\(\newcommand{\psiit}{\unicode{x1D713}}\)
\(\newcommand{\omegait}{\unicode{x1D714}}\)
\(\newcommand{\Alphait}{\unicode{x1D6E2}}\)
\(\newcommand{\Betait}{\unicode{x1D6E3}}\)
\(\newcommand{\Gammait}{\unicode{x1D6E4}}\)
\(\newcommand{\Digammait}{\mathit{\unicode{x03DC}}}\)
\(\newcommand{\Deltait}{\unicode{x1D6E5}}\)
\(\newcommand{\Epsilonit}{\unicode{x1D6E6}}\)
\(\newcommand{\Zetait}{\unicode{x1D6E7}}\)
\(\newcommand{\Etait}{\unicode{x1D6E8}}\)
\(\newcommand{\Thetait}{\unicode{x1D6E9}}\)
\(\newcommand{\Varthetait}{\unicode{x1D6F3}}\)
\(\newcommand{\Iotait}{\unicode{x1D6EA}}\)
\(\newcommand{\Kappait}{\unicode{x1D6EB}}\)
\(\newcommand{\Lambdait}{\unicode{x1D6EC}}\)
\(\newcommand{\Muit}{\unicode{x1D6ED}}\)
\(\newcommand{\Nuit}{\unicode{x1D6EE}}\)
\(\newcommand{\Xiit}{\unicode{x1D6EF}}\)
\(\newcommand{\Omicronit}{\unicode{x1D6F0}}\)
\(\newcommand{\Piit}{\unicode{x1D6F1}}\)
\(\newcommand{\Rhoit}{\unicode{x1D6F2}}\)
\(\newcommand{\Sigmait}{\unicode{x1D6F4}}\)
\(\newcommand{\Tauit}{\unicode{x1D6F5}}\)
\(\newcommand{\Upsilonit}{\unicode{x1D6F6}}\)
\(\newcommand{\Phiit}{\unicode{x1D6F7}}\)
\(\newcommand{\Chiit}{\unicode{x1D6F8}}\)
\(\newcommand{\Psiit}{\unicode{x1D6F9}}\)
\(\newcommand{\Omegait}{\unicode{x1D6FA}}\)
\(\let \digammaup \Digammaup \)
\(\renewcommand {\digammait }{\mathit {\digammaup }}\)
\(\newcommand {\smallin }{\unicode {x220A}}\)
\(\newcommand {\smallowns }{\unicode {x220D}}\)
\(\newcommand {\notsmallin }{\LWRoverlaysymbols {/}{\unicode {x220A}}}\)
\(\newcommand {\notsmallowns }{\LWRoverlaysymbols {/}{\unicode {x220D}}}\)
\(\newcommand {\rightangle }{\unicode {x221F}}\)
\(\newcommand {\intclockwise }{\unicode {x2231}}\)
\(\newcommand {\ointclockwise }{\unicode {x2232}}\)
\(\newcommand {\ointctrclockwise }{\unicode {x2233}}\)
\(\newcommand {\oiint }{\unicode {x222F}}\)
\(\newcommand {\oiiint }{\unicode {x2230}}\)
\(\newcommand {\ddag }{\unicode {x2021}}\)
\(\newcommand {\P }{\unicode {x00B6}}\)
\(\newcommand {\copyright }{\unicode {x00A9}}\)
\(\newcommand {\dag }{\unicode {x2020}}\)
\(\newcommand {\pounds }{\unicode {x00A3}}\)
\(\newcommand {\iddots }{\unicode {x22F0}}\)
\(\newcommand {\utimes }{\overline {\times }}\)
\(\newcommand {\dtimes }{\underline {\times }}\)
\(\newcommand {\udtimes }{\overline {\underline {\times }}}\)
\(\newcommand {\leftwave }{\left \{}\)
\(\newcommand {\rightwave }{\right \}}\)
\(\newcommand {\toprule }[1][]{\hline }\)
\(\let \midrule \toprule \)
\(\let \bottomrule \toprule \)
\(\newcommand {\cmidrule }[2][]{}\)
\(\newcommand {\morecmidrules }{}\)
\(\newcommand {\specialrule }[3]{\hline }\)
\(\newcommand {\addlinespace }[1][]{}\)
\(\newcommand {\LWRsubmultirow }[2][]{#2}\)
\(\newcommand {\LWRmultirow }[2][]{\LWRsubmultirow }\)
\(\newcommand {\multirow }[2][]{\LWRmultirow }\)
\(\newcommand {\mrowcell }{}\)
\(\newcommand {\mcolrowcell }{}\)
\(\newcommand {\STneed }[1]{}\)
\( \newcommand {\multicolumn }[3]{#3}\)
\(\newcommand {\tothe }[1]{^{#1}}\)
\(\newcommand {\raiseto }[2]{{#2}^{#1}}\)
\(\newcommand {\ang }[2][]{(\mathrm {#2})\degree }\)
\(\newcommand {\num }[2][]{\mathrm {#2}}\)
\(\newcommand {\si }[2][]{\mathrm {#2}}\)
\(\newcommand {\LWRSI }[2][]{\mathrm {#1\LWRSInumber \,#2}}\)
\(\newcommand {\SI }[2][]{\def \LWRSInumber {#2}\LWRSI }\)
\(\newcommand {\numlist }[2][]{\mathrm {#2}}\)
\(\newcommand {\numrange }[3][]{\mathrm {#2\,\unicode {x2013}\,#3}}\)
\(\newcommand {\SIlist }[3][]{\mathrm {#2\,#3}}\)
\(\newcommand {\SIrange }[4][]{\mathrm {#2\,#4\,\unicode {x2013}\,#3\,#4}}\)
\(\newcommand {\tablenum }[2][]{\mathrm {#2}}\)
\(\newcommand {\ampere }{\mathrm {A}}\)
\(\newcommand {\candela }{\mathrm {cd}}\)
\(\newcommand {\kelvin }{\mathrm {K}}\)
\(\newcommand {\kilogram }{\mathrm {kg}}\)
\(\newcommand {\metre }{\mathrm {m}}\)
\(\newcommand {\mole }{\mathrm {mol}}\)
\(\newcommand {\second }{\mathrm {s}}\)
\(\newcommand {\becquerel }{\mathrm {Bq}}\)
\(\newcommand {\degreeCelsius }{\unicode {x2103}}\)
\(\newcommand {\coulomb }{\mathrm {C}}\)
\(\newcommand {\farad }{\mathrm {F}}\)
\(\newcommand {\gray }{\mathrm {Gy}}\)
\(\newcommand {\hertz }{\mathrm {Hz}}\)
\(\newcommand {\henry }{\mathrm {H}}\)
\(\newcommand {\joule }{\mathrm {J}}\)
\(\newcommand {\katal }{\mathrm {kat}}\)
\(\newcommand {\lumen }{\mathrm {lm}}\)
\(\newcommand {\lux }{\mathrm {lx}}\)
\(\newcommand {\newton }{\mathrm {N}}\)
\(\newcommand {\ohm }{\mathrm {\Omega }}\)
\(\newcommand {\pascal }{\mathrm {Pa}}\)
\(\newcommand {\radian }{\mathrm {rad}}\)
\(\newcommand {\siemens }{\mathrm {S}}\)
\(\newcommand {\sievert }{\mathrm {Sv}}\)
\(\newcommand {\steradian }{\mathrm {sr}}\)
\(\newcommand {\tesla }{\mathrm {T}}\)
\(\newcommand {\volt }{\mathrm {V}}\)
\(\newcommand {\watt }{\mathrm {W}}\)
\(\newcommand {\weber }{\mathrm {Wb}}\)
\(\newcommand {\day }{\mathrm {d}}\)
\(\newcommand {\degree }{\mathrm {^\circ }}\)
\(\newcommand {\hectare }{\mathrm {ha}}\)
\(\newcommand {\hour }{\mathrm {h}}\)
\(\newcommand {\litre }{\mathrm {l}}\)
\(\newcommand {\liter }{\mathrm {L}}\)
\(\newcommand {\arcminute }{^\prime }\)
\(\newcommand {\minute }{\mathrm {min}}\)
\(\newcommand {\arcsecond }{^{\prime \prime }}\)
\(\newcommand {\tonne }{\mathrm {t}}\)
\(\newcommand {\astronomicalunit }{au}\)
\(\newcommand {\atomicmassunit }{u}\)
\(\newcommand {\bohr }{\mathit {a}_0}\)
\(\newcommand {\clight }{\mathit {c}_0}\)
\(\newcommand {\dalton }{\mathrm {D}_\mathrm {a}}\)
\(\newcommand {\electronmass }{\mathit {m}_{\mathrm {e}}}\)
\(\newcommand {\electronvolt }{\mathrm {eV}}\)
\(\newcommand {\elementarycharge }{\mathit {e}}\)
\(\newcommand {\hartree }{\mathit {E}_{\mathrm {h}}}\)
\(\newcommand {\planckbar }{\mathit {\unicode {x210F}}}\)
\(\newcommand {\angstrom }{\mathrm {\unicode {x212B}}}\)
\(\let \LWRorigbar \bar \)
\(\newcommand {\bar }{\mathrm {bar}}\)
\(\newcommand {\barn }{\mathrm {b}}\)
\(\newcommand {\bel }{\mathrm {B}}\)
\(\newcommand {\decibel }{\mathrm {dB}}\)
\(\newcommand {\knot }{\mathrm {kn}}\)
\(\newcommand {\mmHg }{\mathrm {mmHg}}\)
\(\newcommand {\nauticalmile }{\mathrm {M}}\)
\(\newcommand {\neper }{\mathrm {Np}}\)
\(\newcommand {\yocto }{\mathrm {y}}\)
\(\newcommand {\zepto }{\mathrm {z}}\)
\(\newcommand {\atto }{\mathrm {a}}\)
\(\newcommand {\femto }{\mathrm {f}}\)
\(\newcommand {\pico }{\mathrm {p}}\)
\(\newcommand {\nano }{\mathrm {n}}\)
\(\newcommand {\micro }{\mathrm {\unicode {x00B5}}}\)
\(\newcommand {\milli }{\mathrm {m}}\)
\(\newcommand {\centi }{\mathrm {c}}\)
\(\newcommand {\deci }{\mathrm {d}}\)
\(\newcommand {\deca }{\mathrm {da}}\)
\(\newcommand {\hecto }{\mathrm {h}}\)
\(\newcommand {\kilo }{\mathrm {k}}\)
\(\newcommand {\mega }{\mathrm {M}}\)
\(\newcommand {\giga }{\mathrm {G}}\)
\(\newcommand {\tera }{\mathrm {T}}\)
\(\newcommand {\peta }{\mathrm {P}}\)
\(\newcommand {\exa }{\mathrm {E}}\)
\(\newcommand {\zetta }{\mathrm {Z}}\)
\(\newcommand {\yotta }{\mathrm {Y}}\)
\(\newcommand {\percent }{\mathrm {\%}}\)
\(\newcommand {\meter }{\mathrm {m}}\)
\(\newcommand {\metre }{\mathrm {m}}\)
\(\newcommand {\gram }{\mathrm {g}}\)
\(\newcommand {\kg }{\kilo \gram }\)
\(\newcommand {\of }[1]{_{\mathrm {#1}}}\)
\(\newcommand {\squared }{^2}\)
\(\newcommand {\square }[1]{\mathrm {#1}^2}\)
\(\newcommand {\cubed }{^3}\)
\(\newcommand {\cubic }[1]{\mathrm {#1}^3}\)
\(\newcommand {\per }{/}\)
\(\newcommand {\celsius }{\unicode {x2103}}\)
\(\newcommand {\fg }{\femto \gram }\)
\(\newcommand {\pg }{\pico \gram }\)
\(\newcommand {\ng }{\nano \gram }\)
\(\newcommand {\ug }{\micro \gram }\)
\(\newcommand {\mg }{\milli \gram }\)
\(\newcommand {\g }{\gram }\)
\(\newcommand {\kg }{\kilo \gram }\)
\(\newcommand {\amu }{\mathrm {u}}\)
\(\newcommand {\nm }{\nano \metre }\)
\(\newcommand {\um }{\micro \metre }\)
\(\newcommand {\mm }{\milli \metre }\)
\(\newcommand {\cm }{\centi \metre }\)
\(\newcommand {\dm }{\deci \metre }\)
\(\newcommand {\m }{\metre }\)
\(\newcommand {\km }{\kilo \metre }\)
\(\newcommand {\as }{\atto \second }\)
\(\newcommand {\fs }{\femto \second }\)
\(\newcommand {\ps }{\pico \second }\)
\(\newcommand {\ns }{\nano \second }\)
\(\newcommand {\us }{\micro \second }\)
\(\newcommand {\ms }{\milli \second }\)
\(\newcommand {\s }{\second }\)
\(\newcommand {\fmol }{\femto \mol }\)
\(\newcommand {\pmol }{\pico \mol }\)
\(\newcommand {\nmol }{\nano \mol }\)
\(\newcommand {\umol }{\micro \mol }\)
\(\newcommand {\mmol }{\milli \mol }\)
\(\newcommand {\mol }{\mol }\)
\(\newcommand {\kmol }{\kilo \mol }\)
\(\newcommand {\pA }{\pico \ampere }\)
\(\newcommand {\nA }{\nano \ampere }\)
\(\newcommand {\uA }{\micro \ampere }\)
\(\newcommand {\mA }{\milli \ampere }\)
\(\newcommand {\A }{\ampere }\)
\(\newcommand {\kA }{\kilo \ampere }\)
\(\newcommand {\ul }{\micro \litre }\)
\(\newcommand {\ml }{\milli \litre }\)
\(\newcommand {\l }{\litre }\)
\(\newcommand {\hl }{\hecto \litre }\)
\(\newcommand {\uL }{\micro \liter }\)
\(\newcommand {\mL }{\milli \liter }\)
\(\newcommand {\L }{\liter }\)
\(\newcommand {\hL }{\hecto \liter }\)
\(\newcommand {\mHz }{\milli \hertz }\)
\(\newcommand {\Hz }{\hertz }\)
\(\newcommand {\kHz }{\kilo \hertz }\)
\(\newcommand {\MHz }{\mega \hertz }\)
\(\newcommand {\GHz }{\giga \hertz }\)
\(\newcommand {\THz }{\tera \hertz }\)
\(\newcommand {\mN }{\milli \newton }\)
\(\newcommand {\N }{\newton }\)
\(\newcommand {\kN }{\kilo \newton }\)
\(\newcommand {\MN }{\mega \newton }\)
\(\newcommand {\Pa }{\pascal }\)
\(\newcommand {\kPa }{\kilo \pascal }\)
\(\newcommand {\MPa }{\mega \pascal }\)
\(\newcommand {\GPa }{\giga \pascal }\)
\(\newcommand {\mohm }{\milli \ohm }\)
\(\newcommand {\kohm }{\kilo \ohm }\)
\(\newcommand {\Mohm }{\mega \ohm }\)
\(\newcommand {\pV }{\pico \volt }\)
\(\newcommand {\nV }{\nano \volt }\)
\(\newcommand {\uV }{\micro \volt }\)
\(\newcommand {\mV }{\milli \volt }\)
\(\newcommand {\V }{\volt }\)
\(\newcommand {\kV }{\kilo \volt }\)
\(\newcommand {\W }{\watt }\)
\(\newcommand {\uW }{\micro \watt }\)
\(\newcommand {\mW }{\milli \watt }\)
\(\newcommand {\kW }{\kilo \watt }\)
\(\newcommand {\MW }{\mega \watt }\)
\(\newcommand {\GW }{\giga \watt }\)
\(\newcommand {\J }{\joule }\)
\(\newcommand {\uJ }{\micro \joule }\)
\(\newcommand {\mJ }{\milli \joule }\)
\(\newcommand {\kJ }{\kilo \joule }\)
\(\newcommand {\eV }{\electronvolt }\)
\(\newcommand {\meV }{\milli \electronvolt }\)
\(\newcommand {\keV }{\kilo \electronvolt }\)
\(\newcommand {\MeV }{\mega \electronvolt }\)
\(\newcommand {\GeV }{\giga \electronvolt }\)
\(\newcommand {\TeV }{\tera \electronvolt }\)
\(\newcommand {\kWh }{\kilo \watt \hour }\)
\(\newcommand {\F }{\farad }\)
\(\newcommand {\fF }{\femto \farad }\)
\(\newcommand {\pF }{\pico \farad }\)
\(\newcommand {\K }{\mathrm {K}}\)
\(\newcommand {\dB }{\mathrm {dB}}\)
\(\newcommand {\kibi }{\mathrm {Ki}}\)
\(\newcommand {\mebi }{\mathrm {Mi}}\)
\(\newcommand {\gibi }{\mathrm {Gi}}\)
\(\newcommand {\tebi }{\mathrm {Ti}}\)
\(\newcommand {\pebi }{\mathrm {Pi}}\)
\(\newcommand {\exbi }{\mathrm {Ei}}\)
\(\newcommand {\zebi }{\mathrm {Zi}}\)
\(\newcommand {\yobi }{\mathrm {Yi}}\)
\(\require {mhchem}\)
\(\require {cancel}\)
\(\newcommand {\fint }{âĺŊ}\)
\(\newcommand {\hdots }{\cdots }\)
\(\newcommand {\mathnormal }[1]{#1}\)
\(\newcommand {\vecs }[2]{\vec {#1}_{#2}}\)
\(\renewcommand {\O }{\ensuremath {\mathcal {O}}}\)
\(\renewcommand {\P }{\ensuremath {\mathbb {P}}}\)
\(\renewcommand {\i }{\ensuremath {\mathrm {i}}}\)
\(\newcommand {\area }{\ensuremath {\mathrm {area}}}\)
\(\newcommand {\name }[1]{\textsc {#1}}\)
\(\newcommand {\smallpmatrix }[1]{\left (\begin {smallmatrix}#1\end {smallmatrix}\right )}\)
\(\newcommand {\matlab }{{\fontfamily {bch}\scshape \selectfont {}Matlab}}\)
\(\newcommand {\innerproduct }[1]{\left \langle {#1}\right \rangle }\)
\(\newcommand {\norm }[1]{\left \Vert {#1}\right \Vert }\)
\(\renewcommand {\natural }{\mathbb {N}}\)
\(\newcommand {\integer }{\mathbb {Z}}\)
\(\newcommand {\rational }{\mathbb {Q}}\)
\(\newcommand {\real }{\mathbb {R}}\)
\(\newcommand {\complex }{\mathbb {C}}\)
\(\renewcommand {\d }{\mathop {}\!\mathrm {d}}\)
\(\newcommand {\dr }{\d {}r}\)
\(\newcommand {\ds }{\d {}s}\)
\(\newcommand {\dt }{\d {}t}\)
\(\newcommand {\du }{\d {}u}\)
\(\newcommand {\dv }{\d {}v}\)
\(\newcommand {\dw }{\d {}w}\)
\(\newcommand {\dx }{\d {}x}\)
\(\newcommand {\dy }{\d {}y}\)
\(\newcommand {\dz }{\d {}z}\)
\(\newcommand {\dsigma }{\d {}\sigma }\)
\(\newcommand {\dphi }{\d {}\phi }\)
\(\newcommand {\dvarphi }{\d {}\varphi }\)
\(\newcommand {\dtau }{\d {}\tau }\)
\(\newcommand {\dxi }{\d {}\xi }\)
\(\newcommand {\dtheta }{\d {}\theta }\)
\(\newcommand {\tp }{\mathrm {T}}\)
Kontrollpolygon
Spline-Kurve: Seien
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\tau \colon \tau _0 \le \dotsb \le \tau _n < \tau _{n+1} \le \dotsb \le \tau _{m-1} < \tau _m \le \dotsb \le \tau _{m+n}
\end{align*}
eine Knotenfolge mit Vielfachheiten \(\le n\) und \(D = [\tau _n, \tau _m]\) das Standard-Parameterintervall. Eine Spline-Kurve vom Grad \(\le n\) in \(\real ^d\) hat eine
Parametrisierung
\(\seteqnumber{0}{}{0}\)
\begin{align*}
t \mapsto (p_1(t), \dotsb , p_d(t)) = \sum _{k=0}^{m-1} c_k b_k(t),\quad t \in D,
\end{align*}
wobei die Komponenten \(p_\nu \) sich im Standard-Spline-Raum \(S_\tau ^n\) befinden.
Die Koeffizienten \(c_k = (c_{k,1}, \dotsc , c_{k,d})\) können in einer \((m \times d)\)-Matrix zusammengefasst werden. Sie heißen Kontrollpunkte und bilden
das Kontrollpolygon \(c\) von \(p\).
Beispiel (gebräuchliche Knotenfolgen): Es gibt zwei häufige Möglichkeiten für Knotenfolgen, wie Knoten außerhalb von \(D\) platziert werden:
\(\tau _n\) und \(\tau _m\) haben Vielfachheit \(1\) und \(\tau _0, \dotsc , \tau _{n+1}\) bzw. \(\tau _{m-1}, \dotsc , \tau _{m+n}\) sind äquidistant. In diesem Fall hat die Kurve zwar maximale
Glattheit, aber sie interpoliert nicht die Endpunkte.
\(\tau _1 = \dotsb = \tau _n\) und \(\tau _m = \dotsb = \tau _{m+n-1}\) haben die maximale Vielfachheit \(n\) sowie \(\tau _0 < \tau _1\) und \(\tau _{m+n-1} < \tau _{m+n}\). In diesem Fall ist zwar
Endpunktinterpolation vorhanden, aber die Kurve ist i. A. am Endpunkt nicht differenzierbar (nur einseitig).
geschlossene Spline-Kurve: Eine geschlossene Spline-Kurve vom Grad \(\le n\) in \(\real ^d\) hat eine Parametrisierung
\(\seteqnumber{0}{}{0}\)
\begin{align*}
t \mapsto (p_1(t), \dotsc , p_d(t)) = \sum _{k \in \integer } c_k b_k(t),\quad t \in \real ,
\end{align*}
wobei die Komponenten \(p_\nu \) stetige \(T\)-periodische Splines sind, d. h. \(p_\nu \in S_{\tau ,T}^n\) mit
\(\tau = (\tau _0, \dotsc , \tau _{M-1})\). Die B-Splines \(b_k\) entsprechen der periodisch erweiterten Knotenfolge
\((\dotsc , \tau - T, \tau , \tau + T, \dotsc )\).
Wegen der Periodizitätsbedingungen ist \(p\) bestimmt durch \(M\) aufeinanderfolgende Kontrollpunkte
\(\seteqnumber{0}{}{0}\)
\begin{align*}
C = \begin{pmatrix}c_0\\\vdots \\c_{M-1}\end {pmatrix},
\end{align*}
die das geschlossene Kontrollpolygon \(c\) von \(p\) bestimmen.
Beispiel (nicht-periodische Darstellung): Eine geschlossene Spline-Kurve kann auch nicht-periodisch parametrisiert werden. Dazu fügt man links von \(\tau = (\tau _0, \dotsc , \tau _{M-1})\) die \(n\)
Knoten \(\tau _{M-n} - T, \dotsc , \tau _{m-1} - T\) und rechts von \(\tau \) die \(n + 1\) Knoten \(\tau _0 + T, \dotsc , \tau _n + T\) an. Mit den entsprechenden Kontrollpunkten \(c_{M-n}, \dotsc ,
c_{M-1}, c_0, \dotsc , c_{M-1}\) erhält man eine Parametrisierung mit Komponenten im Standard-Spline-Raum.
rationale Parametrisierungen (NURBS): Eine nicht-uniforme rationale B-Spline-Parametrisierung (NURBS) \(r = p/q\) ist der Quotient einer Spline-Parametrisierung \(t
\mapsto p(t)\) mit gewichteten Kontrollpunkten
\(\seteqnumber{0}{}{0}\)
\begin{align*}
c_k w_k \in \real ^d,\quad w_k > 0
\end{align*}
und einer Spline-Funktion \(t \mapsto q(t)\) mit Koeffizienten \(w_k \in \real \).
Die Gewichte \(w_k\) ermöglichen zusätzliche Gestaltungsfreiheit. Das Erhöhen eines Gewichts „zieht“ die Kurve zum entsprechenden Kontrollpunkt. Man kann \(r\) mit einer Spline-Kurve in
homogenenen Koordinaten identifizieren, parametrisiert durch
\(\seteqnumber{0}{}{0}\)
\begin{align*}
t \mapsto (p(t), q(t)) = \sum _k (c_k w_k, w_k) b_k(t) \in \real ^{d+1}.
\end{align*}
Diese Interpretation ist vor allem für die Implementierung von Algorithmen nützlich, z. B. Knoteneinfügung, Auswertung und Differentiation.
Beispiel (Kreis als NURBS-Parametrisierung): Kegelschnitte können durch quadratische NURBS dargestellt werden. Beispielsweise hat der Viertelkreis im 1. Quadranten die Kontrollpunkte und Gewichte
\(\seteqnumber{0}{}{0}\)
\begin{align*}
(c_k, w_k)\colon \quad (1, 0, 1), (1, 1, 1/\sqrt {2}), (0, 1, 1).
\end{align*}
Entsprechend kann ein ganzer Kreis durch eine geschlossene rationale Spline-Kurve \(r\) in Bézier-Form mit doppelten Knoten
\(\seteqnumber{0}{}{0}\)
\begin{align*}
t_0 = 0, 0, 1, 1, 2, 2, 3, 3 = \tau _7,\quad \tau _{k+8} = \tau _k + 4
\end{align*}
dargestellt werden, wenn man die Kontrollpunkte und Gewichte analog zum Viertelkreis wählt.
Man kann zeigen, dass der Kreis durch eine geschlossene, rationale, quadratische Spline-Kurve mit einfachen, uniformen Knoten nicht dargestellt werden kann.
Eigenschaften von Spline-Kurven
Eigenschaften von Spline-Kurven: Die Form einer Spline-Kurve, parametrisiert durch
\(p = \sum _{k=0}^{m-1} c_k b_k\), \(p_\nu \in S_\tau ^n\), wird qualitativ durch ihr Kontrollpolygon \(c\) modelliert. Genauer gilt:
\(p(t)\) liegt in der konvexen Hülle von \(c_{\ell -n}, \dotsc , c_\ell \), falls \(t \in [\tau _\ell , \tau _{\ell +1})\).
Zusätzlich gilt, falls beide Endpunkte des Standard-Parameterintervalls \(D = [\tau _n, \tau _m]\) Knoten mit Vielfachheit \(n\) sind, dass
\(p(\tau _n) = c_0\) und \(p(\tau _m) = c_{m-1}\) sowie
\(p’(\tau _n^+) = \alpha _{1,\tau }^n (c_1 - c_0)\) und \(p’(\tau _m^-) = \alpha _{m-1,\tau }^n (c_{m-1} - c_{m-2})\)
mit \(\alpha _{k,\tau }^n := n/(\tau _{k+n} - \tau _k)\). Die letzten beiden Eigenschaften werden auch Endpunktinterpolation bezeichnet, da das Kontrollpolygon tangential
zur Spline-Kurve ist, was sehr nützlich für Design-Zwecke ist.
Die Parametrisierung einer Spline-Kurve ist stetig, die Ableitung kann jedoch Sprünge enthalten. Daher werden in der Formel für \(p’\) die hochgestellten Indizes \(+\) und \(-\) verwendet, um rechts- bzw.
linksseitige Ableitung zu bezeichnen.
Abstand zum Kontrollpolygon: Seien eine Spline-Kurve gegeben, die durch \(p = \sum _{k=0}^{m-1} c_k b_k\), \(p_\nu \in S_\tau ^n\), mit \(n > 1\) parametrisiert wird, und \(c\) eine stückweise
lineare Parametrisierung des Kontrollpolygons, die die \(c_k\) an den Knotenmitteln \(\tau _k^n = (\tau _{k+1} + \dotsb + \tau _{k+n})/n\) interpoliert.
Dann kann der Abstand von \(p\) zum Kontrollpolygon durch zweite gewichtete Differenzen der Kontrollpunkte abgeschätzt werden. Genauer gilt für \(t \in [\tau _\ell , \tau _{\ell +1})\)
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\norm {p(t) - c(t)}_\infty \le \frac {1}{2n} \max _{\ell -n \le k \le \ell } \sigma _k^2 \max _{\ell -n+2 \le k \le \ell } \norm {\nabla _\tau ^2 c_k}_\infty ,
\end{align*}
wobei
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\sigma _k^2 := \frac {1}{n - 1} \sum _{i=1}^n (\tau _{k+i} - \tau _k^n)^2
\end{align*}
und \(\nabla _\tau ^2 c_k\) den Kontrollpunkten der zweiten Ableitung \(p’’\), in expliziter Form
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\nabla _\tau ^2 c_k := \frac {n - 1}{\tau _{k+n-1} - \tau _k} \left (\frac {c_k - c_{k-1}}{\tau _k^n - \tau _{k-1}^n} - \frac {c_{k-1} - c_{k-2}}{\tau _{k-1}^n - \tau _{k-2}^n}\right ).
\end{align*}
Keiner der Nenner verschwindet, da die Differenzen mindestens so groß sind wie \(\tau _{\ell +1} - \tau _\ell \).
Die lokale Abschätzung impliziert eine globale Abschätzung, indem man auf der rechten Seite das Maximum über alle für das Parameterintervall \(D = [\tau _n, \tau _m]\) der
Spline-Kurve relevanten \(k\) nimmt. In diesem Fall wird \(\nabla _\tau ^2 c_k\) auf Null gesetzt, wenn \(\tau _k = \dotsb = \tau _{k+n-1}\).
Die Distanzabschätzung ist scharf, d. h. es gibt Fälle, in denen in der Ungleichung Gleichheit gilt. Dadurch ist die Abstandsabschätzung in den meisten Fällen (besonders bei
höherem Grad) besser möglich als mit der konvexen Hülle. Die \(\sigma _k^2\) stellen eine Art „geometrische Varianz“ dar, nämlich bis auf einen Faktor die Abstandsquadratsumme der
relevanten Knoten zu ihrem Knotenmittel. Das kann man sich auch im Fall \(\tau _{k+1} = \dotsb = \tau _{k+n} = \tau _k^n\) verdeutlichen. Dann gilt \(\sigma _k^2 = 0\) und die rechte Seite der Abschätzung
wird \(0\), weil die Spline-Kurve in diesem Fall den Punkt \(c_k\) interpoliert.
Beispiel (äquidistante Knoten): Für uniforme Knoten \(\tau _k = kh\) und ungeraden Grad \(n = 2m + 1\) gilt \(\tau _k^n = k + m + 1\) und \(\sigma _k^2 = \frac {1}{n - 1} \sum
_{i=-m}^m (ih)^2\). Dadurch erhält man für das Produkt der ersten beiden Faktoren in der Abstandsabschätzung \(\frac {1}{2n} \frac {2h^2}{n - 1} \sum _{i=1}^m i^2 = \frac {n +
1}{24} h^2\). Daher erhält man wegen \(\nabla _\tau ^2 c_k = h^{-2} \Delta ^2 c_{k-2}\) mit \(\Delta ^2 c_{k-2} = c_k - 2c_{k-1} + c_{k-2}\) als Abschätzung für
äquidistante Knoten
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\norm {p(t) - c(t)}_\infty \le \frac {n + 1}{24} \max _{\ell -n \le k \le \ell -2} \norm {\Delta ^2 c_k}_\infty
\end{align*}
für \(\ell h \le t < (\ell + 1)h\).
Es stellt sich durch analoge Berechnung heraus, dass die Formel auch für geraden Grad \(n = 2m\) gilt. Die Tatsache, dass in diesem Fall die Knotenmittel nicht mit den Knoten zusammenfallen, aber stattdessen
Mittelpunkte der Knotenintervalle sind, macht keinen Unterschied.
Verfeinerung
Knoten einfügen: Sei \(p = \sum _{k=0}^{m-1} c_k b_k\), \(p_\nu \in S_\tau ^n\), die Parametrisierung einer Spline-Kurve. Wenn ein neuer Knoten \(s\) im Parameterintervall \(D\) mit \(s \in [\tau
_\ell , \tau _{\ell +1})\) eingefügt wird, dann werden die Kontrollpunkte \(\widetilde {c}_k\) von \(p\) bzgl. der verfeinerten Knotenfolge
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\widetilde {\tau }\colon \dotsc , \widetilde {\tau }_\ell := \tau _\ell , \widetilde {\tau }_{\ell +1} := s, \widetilde {\tau }_{\ell +2} := \tau _{\ell +1}, \dotsc
\end{align*}
wie folgt berechnet.
Auf den Segmenten \([c_{k-1}, c_k]\) mit \(\tau _k < s < \tau _{k+n}\) werden neue Kontrollpunkte erzeugt:
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\widetilde {c}_k := \gamma _{k,\tau }^n c_k + (1 - \gamma _{k,\tau }^n) c_{k-1},\quad \gamma _{k,\tau }^n := \frac {s - \tau _k}{\tau _{k+n} - \tau _k}.
\end{align*}
Die anderen Strecken des Kontrollpolygons bleiben unverändert, d. h.
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\widetilde {c}_k := c_k \text { für } \tau _{k+n} \le s,\quad \widetilde {c}_k := c_{k-1} \text { für } s \le \tau _k.
\end{align*}
Neue Kontrollpunkte \(\widetilde {c}_k\) teilen das Segment \([c_{k-1}, c_k]\) im selben Verhältnis \(\gamma _{k,\tau }^n : (1 - \gamma _{k,\tau }^n)\) wie der Parameter \(s\) das Intervall \([\tau _k,
\tau _{k+n}]\), welches der Schnitt der Träger der entsprechenden B-Splines darstellt.
Wenn \(s\) mit einem Knoten zusammenfällt, also \(s = \tau _\ell \) gilt, dann müssen weniger Kontrollpunkte berechnet werden. Genauer müssen nur \(n + 1 - j\) Konvexkombinationen
gebildet werden, wenn \(s\) die Vielfachheit \(j\) in \(\widetilde {\tau }\) hat.
Mehrere neue Knoten können durch Wiederholung der Prozedur eingefügt werden. Insbesondere kann man durch Erhöhen der Vielfachheit eines Knotens zu \(n\) erreichen, dass die Spline-Kurve einen
Kontrollpunkt interpoliert:
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\tau _{\ell -n} < \tau _{\ell -n+1} = \dotsb = \tau _\ell < \tau _{\ell +1} \quad \Rightarrow \quad p(\tau _\ell ) = c_{\ell -n}.
\end{align*}
Daher kann das Schema zur Auswertung von Splines als \(n\)-fache Knoteneinfügung betrachtet werden.
uniforme Subdivision: Sei
\(\seteqnumber{0}{}{0}\)
\begin{align*}
p(t) = \sum _{k \sim D} c_k b^n(t/h - k),\quad t \in D,
\end{align*}
die Parametrisierung einer Spline-Kurve vom Grad \(\le n\) mit uniformen Knoten \(\tau _k = hk\). Wenn an allen Knotenintervall-Mittelpunkten gleichzeitig neue Knoten eingefügt werden sollen, dann
können die Kontrollpunkte \(\widetilde {c}_k\) der verfeinerten Knotenfolge \(\widetilde {\tau }\colon \widetilde {\tau }_k = kh/2\) wie folgt berechnet werden:
Die relevanten Kontrollpunkte für das Parameterintervall \(D\) werden verdoppelt:
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\widetilde {c}_{2k} := \widetilde {c}_{2k+1} = c_k.
\end{align*}
Gleichzeitige Mittelwertbildung von benachbarten Kontrollpunkten:
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\widetilde {c}_k \leftarrow (\widetilde {c}_k + \widetilde {c}_{k-1})/2.
\end{align*}
Dieser Schritt wird \(n\) Mal durchgeführt.
Die explizite Darstellung der neuen Kontrollpunkte ist
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\widetilde {c}_k = \sum _i s_{k-2i} c_i,\quad s_j := 2^{-n} \binom {n + 1}{j},
\end{align*}
wobei \(s_j := 0\) für \(j < 0\) oder \(j > n + 1\) nach der Konvention für Binomialkoeffizienten.
Variationsverringerung: Die Variation einer Spline-Kurve, die durch \(p = \sum _{k=0}^{m-1} c_k b_k\) parametrisiert wird, bzgl. einer Hyperebene \(H\) ist nicht
größer als die Variation ihres Kontrollpolygons \(c\):
\(\seteqnumber{0}{}{0}\)
\begin{align*}
V(p, H) \le V(c, H),
\end{align*}
wobei \(V\) die maximale Anzahl von Paaren von aufeinanderfolgenden Punkten auf gegenüberliegenden Seiten \(H\) bezeichnet.
Insbesondere liegt die ganze Spline-Kurve auf einer Seite von \(H\), wenn das ganze Kontrollpolygon auf einer Seite von \(H\) liegt.
Algorithmen
Auswertung und Differentiation: Ein Punkt \(p(s) = \sum _{k=0}^{m-1} c_k b_k(s)\) einer Spline-Kurve mit Knotenfolge \(\tau \) kann durch wiederholtes Einsetzen von \(s\) als neuen Knoten bis Vielfachheit \(n\)
berrechnet werden:
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\widetilde {\tau }_\ell < \widetilde {\tau }_{\ell +1} = \dotsb = \widetilde {\tau }_{\ell +n} = s < \widetilde {\tau }_{\ell +n+1} \quad \Rightarrow \quad p(s) = \widetilde {c}_\ell ,
\end{align*}
wobei \(\widetilde {\tau }_\ell \) und \(\widetilde {c}_k\) die modifizierten Knoten bzw. Kontrollpunkte bezeichnen.
Das verfeinerte Kontrollpolygon \(\widetilde {c}\) ist tangential zur Spline-Kurve:
\(\seteqnumber{0}{}{0}\)
\begin{align*}
p’(s^-) = \frac {n (\widetilde {c}_\ell - \widetilde {c}_{\ell -1})} {s - \widetilde {\tau }_\ell },\quad p’(s^+) = \frac {n (\widetilde {c}_{\ell +1} - \widetilde {c}_\ell )} {\widetilde
{\tau }_{\ell +n+1} - s},
\end{align*}
wobei die einseitigen Ableitungen zusammenfallen, wenn \(s\) nicht ein Knoten mit Vielfachheit \(n\) in der ursprünglichen Knotenfolge \(\tau \) ist (d. h. wenn mindestens ein Knoten eingefügt
wird). In diesem Fall ist
\(\seteqnumber{0}{}{0}\)
\begin{align*}
p’(s) = \frac {n}{\widetilde {\tau }_{\ell +n+1} - \widetilde {\tau }_\ell } (\widetilde {c}_{\ell +1} - \widetilde {c}_{\ell -1})
\end{align*}
eine alternative Formel für den Tangentenvektor.
Bézier-Form: Die Bézier-Form einer Spline-Kurve, die durch \(p = \sum _{k=0}^{m-1} c_k b_k\)
mit B-Splines vom Grad \(n\) parametrisiert wird, erhält man durch Erhöhung der Vielfachheit jedes Knotens \(\tau _k\) im Parameterintervall \(D = [\tau _n, \tau _m]\) auf \(n\). Dann gilt für
\(t\) in einem nicht-leeren Parameterintervall \([\widetilde {\tau }_\ell , \widetilde {\tau }_{\ell +1}] \subset D\) der verfeinerten Knotenfolge \(\widetilde {\tau }\), dass
\(\seteqnumber{0}{}{0}\)
\begin{align*}
p(t) = \sum _{k=0}^n \widetilde {c}_{\ell -n+k} b_k^n(s),\quad s := \frac {t - \widetilde {\tau }_\ell } {\widetilde {\tau }_{\ell +1} - \widetilde {\tau }_\ell } \in [0, 1],
\end{align*}
wobei \(b_k^n\) die Bernstein-Polynome und \(\widetilde {c}_k\) die Kontrollpunkte bzgl. \(\widetilde {\tau }\) sind. Daher haben die Spline-Segmente bis auf eine lineare Reparametrisierung (welche die Form der Kurve
nicht beeinflusst) Bézier-Form.
In Bézier-Form liegt jeder \((n + 1)\)te Kontrollpunkt auf der Kurve und trennt die Bézier-Segmente. Daher kann man nach Umwandlung in Bézier-Form polynomiale Algorithmen simultan auf den verschiedenen Knotenintervallen
durchführen.
Beispiel (Bézier-Form bei äquidistanten Knoten): Für Spline-Kurven \(p = \sum _k c_k b_k\) mit äquidistanten Knoten \(\tau _k = kh\) gibt es
für die Umwandlung in Bézier-Form eine schöne geometrische Interpretation. Zunächst werden die Kontrollpunkte mit den Tupeln beschriftet, die die Indizes der inneren Knoten der entsprechenden
B-Splines enthalten (z. B. hat für \(n = 4\) der Kontrollpunkt \(c_3\) die Beschriftung \((4, 5, 6, 7)\), weil \(b_3\) den Träger \([3, 8]h\) hat). Dann werden die Paare von Punkten verbunden,
deren Beschriftungen \((a, b, c, d)\) und \((b, c, d, e)\) \(n - 1\) Indizes gemeinsam haben. Auf der entstehenden Verbindungsstrecke werden \(e - a - 1\) Punkte mit gleichem Abstand platziert, die mit \((a + 1, b,
c, d), \dotsc , (e - 1, b, c, d)\) beschriftet werden. Dabei müssen ggf. die Indizes jeweils aufsteigend neu geordnet werden. Dieser Prozess wird solange wiederholt, bis alle möglichen Verbindungen
erstellt wurden. Am Ende bestehen die Bézier-Segmente aus allen Punkten mit Beschriftungen, die höchstens zwei unterschiedliche Indizes haben. Insbesondere haben die Bézier-Endpunkte Beschriftungen mit nur einem
Index der Vielfachheit \(n\).
Interpolation
Interpolation: Punkte \(p_k\) und Tangentenvektoren \(d_k\) (wenn nötig) können durch eine Spline-Kurve an Parameterwerten \(t_k\) interpoliert werden, indem man eine der
Interpolationsmethoden für Splinefunktionen benutzt. Die univariaten Methoden können für jede Komponente getrennt angewandt werden, um die Komponenten der Parametrisierung \(p = \sum _k
c_k b_k\) zu erhalten. Standard-Methoden sind die kubische Hermite-Interpolation und die kubische Spline-Interpolation mit Not-a-Knot, natürlichen oder eingespannten Randbedingungen.
Wenn nur Knoten gegeben sind, können Knoten \(\tau _j\), Parameterwerte \(t_k\) und Tangentenvektoren \(d_k\) (wenn nötig) durch die verfügbare Information bestimmt werden. Einfache
Möglichkeiten sind
\(t_k - t_{k-1} = \norm {p_k - p_{k-1}}_2\),
\(t_k = \tau _{k+\ell }\), wobei der Shift \(\ell \) von der Benennung der Knoten abhängt, und
\(d_k = (p_{k+1} - p_{k-1}) / (t_{k+1} - t_{k-1})\).
Genauere Approximationen der Ableitung verwenden lokale quadratische Interpolation. Die entstehenen Formeln können insbesondere an den Endpunkten des Parameterintervalls benutzt werden, wo einseitige
Approximationen benötigt werden.
Beispiel (Interpolation mit natürlicher Spline-Kurve): Um Punkte \(p_0, \dotsc , p_M\) durch eine natürliche Spline-Kurve zu interpolieren, führt man zunächst eine
Standardwahl der Parameterwerte durch. Man wählt \(t_k\), sodass
\(\seteqnumber{0}{}{0}\)
\begin{align*}
t_{k+1} - t_k = \norm {p_{k+1} - p_k}_2,\quad k = 0, \dotsc , M - 1.
\end{align*}
Die Parameter \(t_k\) fallen mit den Knoten \(\tau _3, \dotsc , \tau _m\), \(m = M + 3\), im Parameterintervall \(D = [t_0, t_M]\) zusammen. Außerhalb von \(D\) wählt man äquidistante Knoten, die
den Abstand des ersten bzw. letzten Knotenintervalls erhalten. Nun kann man das univariate Schema mit den Randbedingungen \(p’’(t_0) = p’’(t_M) = 0\) anwenden.
Eine genauere Approximation erhält man entweder durch eingespannte oder Not-a-Knot-Randbedingungen. Im ersten Fall sind Ableitungen an den Endpunkten vorgegeben:
\(\seteqnumber{0}{}{0}\)
\begin{align*}
p’(t_0) = d_0,\quad p’(t_M) = d_M.
\end{align*}
Die Not-a-Knot-Randbedingungen bedeuten, dass die Knoten \(\tau _4 = t_1\) und die \(\tau _{m-1} = t_{M-1}\) entfernt werden. Daher interpoliert man nun mit den B-Splines \(\widetilde {b}_0, \dotsc , \widetilde
{b}_M\), die zur reduzierten Knotenfolge
\(\seteqnumber{0}{}{0}\)
\begin{align*}
\widetilde {\tau }\colon \tau _0 < \dotsb < \tau _3 = t_0 < \tau _5 < \tau _6 < \dotsb < \tau _{m-3} < \tau _{m-2} < t_M = \tau _m < \dotsb < \dotsb \tau _{m+3}.
\end{align*}
Daher stimmt die Dimension den Standard-Spline-Raums \(S_{\widetilde {\tau }}^3\) mit der Anzahl an Interpolationsbedingungen überein und das Interpolationsproblem ist nach den
Schoenberg-Whitney-Bedingungen korrekt gestellt.