Rozdziaª 5 Interpolacja wielomianowa i splajnowa

Transkrypt

Rozdziaª 5 Interpolacja wielomianowa i splajnowa
Rozdziaª 5
Interpolacja wielomianowa i
splajnowa
5.1 Wielomiany w octavie
W octavie istnieje caªa gamma funkcji zwi¡zanych z wielomianami:
•
•
polyval( )
- funkcja pozwalaj¡ca oblicza¢ warto±¢ wielomianu zadanego w bazie pot¦gowej dla danej warto±ci x, czy caªej macierzy warto±ci
polyt(
) - funkcja znajduj¡ca wspóªczynniki wielomianu zadanego
stopnia najlepiej dopasowanego do zadanej tabelki punktów.
• polyinteg( ) - zwraca wspóªczynniki wielomianu b¦d¡cego caªk¡ nieoznaczon¡ z danego wielomianu
• polyderiv( ) - zwraca wspóªczynniki wielomianu b¦d¡cego pochodn¡ z
danego wielomianu
•
roots( ) - zwraca zera wielomianu
•
conv(a,b) - zwraca wspóªczynniki wielomianu b¦d¡cego iloczynem wielomianów o wspóªczynnikach odpowiednio z wektorów a, b
B¦dziemy korzystali przede wszystkim z dwóch pierwszych funkcji.
We wszystkich tych funkcjach przyjmowane jest, »e rozpatrujemy wspóªczynniki wielomianu w bazie pot¦gowej, ale w nast¦puj¡cej kolejno±ci:
(xn , xn−1 , . . . , 1).
45
Wspóªczynniki indeksowane s¡ od jedynki, tzn. wielomian stopnia nie wi¦kszego od n:
w(x) =
n+1
X
ak xn+1−k
k=1
jest reprezentowany przez wektor wspóªczynników: (a1 , . . . , an+1 ).
Je±li chcemy policzy¢ warto±¢ w w danym punkcie x, czy ewentualnie dla
tablicy punktów umieszczonych w macierzy X , wywoªujemy polyval(a,x)
lub polyval(a,X).
Tak wi¦c, aby narysowa¢ wykres funkcji x3 − 2x + 1 na [−3, 4] mo»na
wykona¢ nast¦puj¡c¡ sekwencj¦ komend :
a = [ 1 , 0 , − 2 , 1 ] ; #d e f i n i u j e m y wsp .
x=linspace ( − 3 , 4 ) ;#s i a t k a
wx=polyval ( a , x ) ; #w a r t o s c w na s i a t c e
plot ( x , wx ) ; #w y k r e s
5.2 Interpolacja wielomianowa
Interpolacja wielomianowa polega na tym, »e szukamy funkcji p z pewnej
przestrzeni wielomianów (zazwyczaj wielomianów stopnia nie wi¦kszego od
n), które w tych punktach speªniaj¡ odpowiednie warunki interpolacyjne,
tzn. p oraz jej pochodne maj¡ w tych punktach zadane warto±ci.
5.2.1
Interpolacja Lagrange'a
W interpolacji wielomianowej Lagrange'a dla zadanych n+1 ró»nych punktów
xk i warto±ci yk = f (xk ) szukamy wielomianu p(x) stopnia co najwy»ej n
takiego, »e speªnione s¡ nast¦puj¡ce warunki interpolacyjne:
f (xk ) = p(xk ) = yk
k = 1, . . . , n + 1.
Funkcja polyt(x,y,n) znajduje wspóªczynniki wielomianu p w bazie pot¦gowej dla wektorów x, y dªugo±ci n + 1. Wa»ne aby warto±ci w x byªy
ró»ne.
Przetestujmy t¦ funkcj¦ dla nast¦puj¡cych danych: x = (−1, 0, 2, 4), y =
(1, 1, 2, −1):
x =[ −1 ,0 ,2 ,4];
y =[1 ,1 ,2 , −1];
a= polyfit ( x , y , 3 ) ;
s=linspace ( − 2 , 5 ) ;
plot ( s , polyval ( a , s ) , x , y , " r +; war i n t e r p ; " )
46
Rysunek 5.1: Wykres wielomianu interpolacyjnego. Czerwone plusy - warunki interpolacyjne
Wida¢ na rysunku 5.1, »e wielomian speªnia warunki interpolacyjne. Mo»emy
to sprawdzi¢ te» obliczeniowo:
max( abs ( y−polyval ( a , x ) ) )
Otrzymali±my wynik: bª¡d w w¦zªach jest równy prawie zero.
Przetestujmy polyt(x,y,n) dla du»ych n dla w¦zªów równoodlegªych na
[0, 1] i losowe warto±ci y z [−1, 1], nast¦pnie policzmy bª¡d w w¦zªach w
zale»no±ci od N :
N=100;
e r=zeros (N+ 1 , 1 ) ;
for k= 0 : N,
x=linspace ( 0 , 1 , k + 1 ) ;
y=2 ∗ ( rand ( size ( x ) ) − 0 . 5 ) ;
a= polyfit ( x , y , k ) ;
e r ( k+1)=max( abs ( y−polyval ( a , x ) ) ) ;
endfor
47
max( e r )
Widzimy, »e mo»emy otrzyma¢ niepoprawny wynik dla du»ych N . Wynika
to ze zªych wªasno±ci algorytmu stosowanego przez octave'a ze wzgl¦du na
zaburzenia powodowane przez niedokªadne obliczenia w arytmetyce zmiennopozycyjnej.
Zbadajmy bª¡d pomi¦dzy funkcj¡, a jej wielomianem interpolacyjnym.
Na pocz¡tek rozpatrzmy analityczn¡ funkcj¦ f (x) = sin(x) i w¦zªy równoodlegªe, oraz norm¦ supremum na odcinku [−4, 6]. Norm¦ supremum:
X
kgk∞,[a,b] :=
|g(t)|
t∈[a,b]
przybli»ymy poprzez dyskretn¡ norm¦ na siatce N równomiernie rozªo»onych
punktów na tym odcinku [a, b], czyli
kf kh,∞,[a,b] = max |f (a + k ∗ h)|
k
z h = (b − a)/N :
x =[ −1 ,0 ,2 ,4];
y =[1 ,1 ,2 , −1];
a= polyfit ( x , y , 3 ) ;
s=linspace ( − 2 , 5 ) ;
plot ( s , polyval ( a , s ) , x , y , " r +; war i n t e r p ; " )
5.2.2
Interpolacja Hermite'a
Rozpatrzmy teraz zadanie interpolacji Hermite'a. W interpolacji wielomianowej Hermite'a dla zadanych n + 1 ró»nych punktów xk i naturalnych
krotno±ci w¦zªów pk szukamy wielomianu w(x) stopnia co najwy»ej N dla
Pn
N =
k=0 pk − 1 takiego, »e speªnione s¡ nast¦puj¡ce warunki interpolacyjne:
w(j) (xk ) = yk,j
k = 1, . . . , n + 1,
j = 0, . . . , pk − 1.
Tutaj yk,j to N + 1 zadanych warto±ci.
W octavie nie ma funkcji realizuj¡cej interpolacje Hermite'a.
Ale czy w szczególnych przypadkach nie mo»emy ªatwo rozwi¡za¢ tego
problemu korzystaj¡c z odpowiednich funkcji octave'a?
Rozpatrzmy przypadek w¦zªów tej samej krotno±ci; np. n ró»nych dwukrotnych w¦zªów.
48
Rysunek 5.2: Interpolacja Hermite'a sin(3x) - dwa dwukrotne w¦zªy −1, 1
Chcemy znale¹¢ wspóªczynniki wielomianu
takie, »e
PN
k=1
ak xk dla N = 2(n + 1)
w0 (xk ) = f 0 (xk ).
w(xk ) = f (xk ),
Czyli rozwi¡zanie speªnia nast¦puj¡cy ukªad równa« liniowych:
N
X
ak xkj = f (xk )
j = 0, . . . , n
kak xk−1
= f 0 (xk )
j
j = 0, . . . , n.
k=0
N
X
k=1
Utwórzmy macierz tego ukªadu z pomoc¡ funkcji vander(x), która tworzy
macierz Vandermonde'a dla w¦zªów podanych w wektorze x:
function
[ a , C, f ]= i n t e r p o l y H ( x , y , dy )
#t w o r z y w s p o l c z y n n i k i w i e l o m i a n u Hermite ' a d l a
#we zlow d w u k r o t n y c h z x
#y= w a r t o s c i w w e z l a c h x ( w e k t o r pionowy )
49
#w a r t o s c i p o c h o d n e j w w e z l a c h x ( w e k t o r pionowy )
#o u t p u t : w s p o l c z y n n i k i w i e l o m a i n u w b a z i e p o t e g o w e j
# ( Zgodne z p o l y v a l ( ) )
#C− o p c j a − m a c i e r z u k l a d u
n=length ( x ) ;
N=2∗n − 1;
A=vander ( x ,N+ 1 ) ;
D=diag (N: − 1 : 0 ) ;
B=zeros ( size (A ) ) ;
B ( : , 1 : N)=A ( : , 2 : N+ 1 ) ;
B=B∗D;
C=[A; B ] ;
f =[y ; dy ] ;
a=C\ [ y ; dy ] ;
endfunction
Rysunek 5.3: Interpolacja Hermite'a sin(3x) - trzy dwukrotne w¦zªy −1, 0, 1
Na pocz¡tku przetestujmy t¦ funkcj¦ dla w¦zªów −1, 1 dwukrotnych i
funkcji sin(3 ∗ x).
50
x =[ −1;1];
f=@( x ) sin ( 3 ∗ x ) ;
d f=@( x ) 3 ∗ cos ( 3 ∗ x ) ;
y=f ( x ) ;
dy=d f ( x ) ;
a=i n t e r p o l y H ( x , y , dy ) ;
z=linspace ( − 1 . 1 , 1 . 1 ) ;
plot ( z , polyval ( a , z ) , " ; w i e l H; " , z , f ( z ) , " ; f ; " , x , y , " r+" ) ;
Z wykresu funkcji i wielomianu widzimy, »e wielomian przecina wykres i jest
styczny w punktach −1, 1, por. rysunek 5.2.
Zobaczmy co si¦ stanie w przypadku trzech w¦zªów. Testujemy funkcj¦
dla w¦zªów −2, 0, 2 dwukrotnych i sin(3 ∗ x).
x=[ −1;0;1];
f=@( x ) sin ( 3 ∗ x ) ;
d f=@( x ) 3 ∗ cos ( 3 ∗ x ) ;
y=f ( x ) ;
dy=d f ( x ) ;
a=i n t e r p o l y H ( x , y , dy ) ;
z=linspace ( − 1 . 2 , 1 . 2 ) ;
plot ( z , polyval ( a , z ) , " ; w i e l H; " , z , f ( z ) , " ; f ; " , x , y , " r+" ) ;
Z rysunku 5.3 wida¢, »e funkcja dziaªa poprawnie równie» w tym przypadku.
5.3 Interpolacja zespolona. Algorytm FFT
W tym rozdziale omówimy krótko interpolacj¦ zespolon¡, ale tylko w przypadku okre±lonych w¦zªów zespolonych równomiernie rozmieszczonych na sferze jednostkowej.
Chcemy znale¹¢ wspóªczynniki zespolone ak ∈ C, k = 0, . . . , N takie, »e
N
X
ak zjk = bk
j = 0, . . . , N
k=0
2π∗i∗j
dla danych zespolonych bk i zj = exp N +1 dla j = 0, . . . , N , czyli pierwiastków z jedynki stopnia N + 1.
Równowa»nie mo»emy to zadanie sformuªowa¢ jako zadanie znalezienia
ak takich, »e
N
X
k=0
ak exp
2π ∗ i ∗ j ∗ k
N +1
51
= bk
j = 0, . . . , N.
Okazuje si¦, »e rozwi¡zanie mo»emy wyrazi¢ poprzez operator dyskretnej
transformaty Fouriera, czy równowa»nie jako mno»enie przez macierz FN +1 =
1
k∗l N
(ωN
+1 )k,l=0 :
N +1
~a = FN +1~b
−2π∗i
N
~
gdzie ~a = (ak )N
k=0 , b = (bk )k=0 , a ωN +1 = exp N +1 .
Mno»enie przez macierz FN +1 mo»na szybko wykona¢ z wykorzystaniem
algorytmu szybkiej transformacji Fouriera, czyli FFT (Fast Fourier Transform). Odpowiednia wersja algorytmu FFT sªu»y te» szybkiemu mno»eniu
−1
N
przez macierz odwrotn¡ do FN +1 : FN
= (N + 1)F N +1 = (ω k∗l
N +1 )k,l=0 .
P +1 k
Obliczaj¡c warto±¢ wielomianu
k ak z w punktach zj , czy równowa»nie
PN
warto±ci wielomianu trygonometrycznego
k=0 ak exp (i ∗ k ∗ x) w punktach
P
2π∗j
k
otrzymujemy:
,
to
przyjmuj¡c
b
=
a
z
xj = N
j
k k j
+1
~b = F −1 ~a.
N +1
Warto doda¢, »e cz¦sto macierz DFT deniuje si¦ bez czynnika N 1+1 ,
oczywi±cie wtedy macierz odwrotna te» musi by¢ odpowiednio przeskalowana.
Funkcja
fft ()
sªu»y w octave'ie mno»eniu przez macierz FN +1 . Jej najprostsze wywoªanie
to
a= f f t ( b )
Sprawd¹my, czy funkcja t () oblicza warto±¢ DFT zgodnie z nasz¡ denicj¡.
Policzmy F4 (4, 0, 0, 0)T , powinni±my otrzyma¢ wektor samych jedynek:
a= f f t ( [ 4 ; 0 ; 0 ; 0 ] )
a otrzymali±my:
a =
4
4
4
4
+ 0i
+ 0i
+ 0i
− 0i
To oznacza, »e funkcja t () oblicza warto±¢ mno»enia przez (N + 1) ∗ FN +1 .
Z kolei funkcja it () powinna oblicza¢ mno»enie przez macierz odwrotn¡
do (N + 1) ∗ FN +1 .
Sprawd¹my, jak to dziaªa:
52
x = [ 1 , − 3, 4 , 5 ] ;
a= f f t ( x ) ;
xx= i f f t ( a ) ;
x−xx
norm ( x−xx , 2 )
Powtórzmy to dla wi¦kszego N :
x=rand ( 1 0 0 ) ;
a= f f t ( x ) ;
xx= i f f t ( a ) ;
norm ( x−xx , 2 )
Stwórzmy macierz (N + 1) ∗ FN +1 i porównajmy szybko±¢ mno»enia przez
t¦ macierz wykonan¡ za pomoc¡ standardowego operatora octave'a, czyli
operatora ∗, z szybko±ci¡ dziaªania funkcji t ().
Stwórzmy najpierw funkcj¦ tworz¡c¡ macierz (N + 1) ∗ FN +1 :
function F=DFTmac(N=3)
om=exp (( − 2 ∗ pi ∗ i ∗ ( 0 :N) ) / (N+ 1 ) ) ;
F=zeros (N+1 ,N+ 1 ) ;
for k =0:N,
F( k +1 ,:)=om. ^ k ;
endfor
endfunction
Przetestujmy j¡ na pocz¡tek dla N = 3:
F=DFTmac( 3 )
F∗ F '
a=rand ( 4 ) ;
norm ( f f t ( a)−F∗ a , 2 )
W tym przypadku wyniki si¦ pokrywaj¡.
Zgodnie z teori¡, por. np. [8], koszt obliczenia DFT przy zastosowaniu
algorytmu FFT to O(n log2 (n)), a standardowe mno»enia przez macierz Fn
kosztuje O(n2 ).
A teraz testujemy szybko±¢:
n=4 ∗ 512
F=DFTmac( n − 1);
x=rand ( n ) ;
tic ; y=F∗ x ; t 1=toc
tic ; yy= f f t ( x ) ; t 2=toc
t1 / t2
53
Na moim komputerze FFT byªo ponad 63 razy szybsze dla n = 2048.
Policzmy jeszcze wykres realnego kosztu wzgl¦dem n:
n=t 1=t 2=zeros ( 1 0 0 , 1 ) ;
n(1)=100;
for k = 1 : 1 0 0 ,
F=DFTmac( n ( k ) − 1 ) ;
x=rand ( n ( k ) ) ;
tic ; y=F∗ x ; t 1 ( k)= toc ;
tic ; yy= f f t ( x ) ; t 2 ( k)= toc ;
n ( k+1)=n ( k ) + 1 0 ;
endfor
n=n ( 1 : 1 0 0 ) ;
plot ( n , t1 , " ; mnozenie p r z e z m a c i e r z ; " , n , t2 , " ; f f t ; " )
Na wynik chwil¦ musimy poczeka¢, ale potwierdza on teori¦, »e FFT jest
wyra¹nie szybszym algorytmem.
5.4 Interpolacja splajnowa
W przypadku interpolacji splajnowej rozpatrujemy dane w¦zªy:
a = x0 , . . . , x N = b
na odcinku [a, b], oraz funkcje splajnowe (splajny), czyli funkcje, które s¡
odpowiedniej klasy gªadko±ci (czyli s¡ w C k ([a, b]), oraz obci¦te do dowolnego
pododcinka [xk , xk+1 ] dla k = 0, . . . , N − 1, s¡ wielomianami co najwy»ej
ustalonego stopnia.
W przypadku splajnów kubicznych rozwa»amy funkcje, które s¡ klasy C 2
na [a, b], oraz s¡ wielomianami kubicznymi na ka»dym pododcinku.
Zadanie interpolacji splajnowej kubicznej polega na znalezieniu splajnu
kubicznego s takiego, »e
s(xk ) = yk
k = 0, . . . , N
dla zadanych yk , oraz speªniaj¡cego odpowiednie warunki brzegowe. Np. w
przypadku splajnu hermitowskiego s musi speªni¢ warunki brzegowe hermitowskie:
s0 (a) = dya
s0 (b) = dyb
dla zadanych dodatkowych dwóch warto±ci dya , dyb . W przypadku splajnu
naturalnego warunki brzegowe to
s00 (a) = s00 (b) = 0.
54
Rysunek 5.4: Wykres prostego splajnu typu not-a-knot. Czerwone plusy
oznaczaj¡ punkty interpolacji
Rozpatruje si¦ równie» splajny typu not-a-knot. W tym przypadku, zamiast warunków brzegowych, dodaje si¦ sztucznie dwa warunki ci¡gªo±ci trzeciej pochodnej w w¦zªach x1 i xN −1 .
Z kolei splajny okresowe speªniaj¡ nast¦puj¡ce warunki brzegowe okresowe:
s(j) (a) = s(j) (b) j = 0, 1, 2.
W ka»dym z tych czterech przypadków splajn interpolacyjny jest wyznaczony jednoznacznie, por. np. [11].
W octave'ie istnieje kilka funkcji zwi¡zanych z interpolacj¡ splajnami kubicznymi, czy ogólnie - z funkcjami wielomianowymi na pododcinkach:
•
spline() - funkcja sªu»¡ca znalezieniu splajnu interpolacyjnego hermitowskiego, czy typu not-a-knot
• ppval() - funkcja sªu»¡ca obliczeniu warto±ci splajnu zadanego w formacie octave'a
55
Rysunek 5.5: Wykresy prostych splajnów typu not-a-knot i hermitowskiego
(z zerowymi pochodnymi w ko«cach) z tymi samymi warunkami interpolacyjnymi. Czerwone plusy oznaczaj¡ punkty interpolacji
• mkpp() - tworzy funkcj¦ wielomianow¡ na pod-odcinkach (szczegóªy
help mkpp())
• unmkpp() - ze struktury splajnu w octave'ie zwraca wspóªczynniki wielomianów na pod-odcinkach (szczegóªy
help unmkpp())
Podstawow¡ funkcj¡ sªu»¡c¡ znalezieniu splajnu interpolacyjnego hermitowskiego, czy typu not-a-knot jest funkcja spline(). Jej najprostsze wywoªanie to
p=spline ( x , y )
gdzie x to wektor wymiaru N z w¦zªami interpolacji splajnowej, a wektor
y ma t¦ sam¡ dªugo±¢ co x i zawiera warto±ci jakie ma przyj¡¢ splajn w
tych w¦zªach. Druga mo»liwo±¢ to - przy takim samym wektorze w¦zªów
x, podanie wektora y o dªugo±ci N + 2. Wtedy pierwsza i ostatnia warto±¢
wektora y to warto±ci pochodnych splajnu w ko«cowych w¦zªach x. Pozostaªe
56
warto±ci y tzn. yk dla k = 2, . . . , N +1 zawieraj¡ warto±ci splajnu w w¦zªach z
x, czyli s¡ takie same jak w pierwszym przypadku. Funkcja zwraca struktur¦
typu pp, czyli w odpowiednim formacie octave'a splajnu kubicznego typu
not-a-knot w pierwszym przypadku, a w drugim - splajnu hermitowskiego.
Nast¦pnie, korzystaj¡c z funkcji ppval() mo»na obliczy¢ warto±¢ tego splajnu
w punkcie, czy tablicy punktów.
Policzmy splajn który w w¦zªach −2, 1, 0, 1, 2 przyjmie warto±ci 1, 0, 0, 0, 1
i narysujmy jego wykres, por. rysunek 5.4:
x = − 2:2;
y=[1 ,0 ,0 ,0 ,1];
pp=spline ( x , y ) ;
z=linspace ( − 2 , 2 ) ;
plot ( z , p p v a l ( pp , z ) , " ; s p l a j n n−a−k ; " , x , y , " r+" ) ;
Korzystaj¡c z tej samej funkcji, stwórzmy splajn hermitowski przyjmuj¡c, »e
jego pochodne w ko«cach wynosz¡ zero. Nast¦pnie narysujmy wykresy obu
splajnów na odcinku [−2, 2], por. rysunek 5.5, oraz blisko lewego ko«ca, por.
rysunek 5.6:
x = − 2:2;
y=[1 ,0 ,0 ,0 ,1];
pp=spline ( x , y ) ;
yh = [ 0 , y , 0 ] ;
ph=spline ( x , yh ) ;
z=linspace ( − 2 , 2 ) ;
plot ( z , p p v a l ( ph , z ) , " ; s p l a j n h e r m i t o w s k i ; " , . . .
z , p p v a l ( pp , z ) , " ; s p l a j n n−a−k ; " , x , y , " r+" ) ;
pause ( 2 ) ;
z=linspace ( − 2 , − 2+0.1);
plot ( z , p p v a l ( ph , z ) , " ; s p l a j n h e r m i t o w s k i ; " , . . .
z , p p v a l ( pp , z ) , " ; s p l a j n n−a−k ; " , − 2 , 1 . 3 ) ;
Wida¢, »e splajny s¡ ró»ne, oraz »e splajn hermitowski ma pochodn¡ równ¡
zero w lewym i prawym ko«cu.
Czy w octave'ie mo»na wyznaczy¢ w prosty sposób inne splajny, np. naturalny lub okresowy?
Okazuje si¦, »e tak, ale trzeba wykorzysta¢ funkcj¦ z rozszerzenia octave'a,
czyli octave-forge'a: csape().
Jej wywoªanie to
pp=c s a p e ( x , y , cond , v a l z )
gdzie x, y to wektory dªugo±ci N z w¦zªami i warto±ciami splajnu w w¦zªach,
a cond przyjmuje warto±ci:
57
Rysunek 5.6: Wykresy prostych splajnów typu not-a-knot i hermitowskiego
(z zerowymi pochodnymi w ko«cach) blisko lewego ko«ca.
• 'variational' w przypadku splajnu interpolacyjnego kubicznego naturalnego
• 'complete' w przypadku splajnu interpolacyjnego kubicznego hermitowskiego, warto±ci pochodnych w ko«cach s¡ podane w parametrze
valc
• 'not-a-knot' w przypadku splajnu interpolacyjnego kubicznego typu
not-a-knot
• 'periodic' w przypadku splajnu interpolacyjnego kubicznego okresowego
• 'second' w przypadku splajnu interpolacyjnego kubicznego z ustalonymi warto±ciami drugiej pochodnej w ko«cach, zgodnymi z tym, co
podano w parametrze valc
Funkcja zwraca struktur¦ typu pp, czyli dane splajnu kubicznego w formacie
octave'a.
58
Porównajmy wyniki tej funkcji z wynikiem funkcji spline() dla danych z
naszego prostego przykªadu i splajnu typu not-a-knot. Policzymy dyskretn¡
norm¦ maksimum (na siatce równomiernej 300 punktów na [−2, 2] z wyników
obu funkcji:
x = − 2:2;
y=[1 ,0 ,0 ,0 ,1];
pp=spline ( x , y ) ;
pp1=c s a p e ( x , y , ' not −a−knot ' ) ;
z=linspace ( − 2 , 2 , 3 0 0 ) ;
norm ( p p v a l ( pp , z)− p p v a l ( pp1 , z ) , ' i n f ' )
Otrzymali±my zero.
Na jednym wykresie narysujmy wykresy trzech splajnów interpolacyjnych
dla N = 6 z tymi samymi warunkami interpolacyjnymi, ale z ró»nymi warunkami brzegowymi: hermitowskim, not-a-knot i naturalnym.
N=4;
x = − 2:2;
y=[1 ,0 ,0 ,0 ,1];
pp=spline ( x , y ) ;
ppn=c s a p e ( x , y , ' v a r i a t i o n a l ' ) ;
yh = [ 0 , y , 0 ] ;
pph=spline ( x , yh ) ;
z=linspace ( − 2 , 2 ) ;
plot ( z , p p v a l ( pph , z ) , " ; s p l . h e r m i t . ; " , . . .
z , p p v a l ( pp , z ) , " ; s p l . n−a−k ; " , . . .
z , p p v a l ( ppn , z ) , " ; s p l . n a t u r . ; " , x , y , " r+" ) ;
Wszystkie trzy splajny s¡ ró»ne w tym przypadku, por. rysunek 5.7.
Oczywi±cie obie funkcje umo»liwiaj¡ dowolny wybór w¦zªów, np. we¹my
w¦zªy [−2, −1, 2, 3, 4] z tymi samymi warto±ciami i stwórzmy splajny obu
typów, por. rysunek 5.8:
x =[ −3 ,2 ,3 ,4];
y=[1 ,0 ,0 ,0 ,1];
pp=spline ( x , y ) ;
yh = [ 0 , y , 0 ] ;
ph=spline ( x , yh ) ;
z=linspace ( − 3 , 4 ) ;
plot ( z , p p v a l ( ph , z ) , " ; s p l a j n h e r m i t o w s k i ; " , . . .
z , p p v a l ( pp , z ) , " ; s p l a j n n−a−k ; " , x , y , " r+" ) ;
Popatrzmy na bª¦dy aproksymacji w normie supremum. Ustalmy, »e interpolujemy splajnami kubicznymi znan¡ funkcj¦ gªadk¡ f (x) na czterech
59
Rysunek 5.7: Wykresy trzech ró»nych splajnów speªniaj¡cych te same warunki interpolacyjne. Splajn hermitowski posiada pochodne równe zero w
ko«cach odcinka.
w¦zªach równoodlegªych na odcinku [a, b]. Je±li pp to struktura typu pp opisuj¡ca splajn interpoluj¡cy f , to dyskretn¡ norm¦ maksimum ró»nicy mi¦dzy
f , a splajnem s, np. na siatce o tysi¡cu punktach, mo»emy obliczy¢ komend¡:
z=linspace ( a , b , 1 0 0 0 ) ;
y=f ( z ) ;
s=p p v a l ( pp , z ) ;
errmax=norm ( s −y , ' i n f ' )
Zaªo»yli±my, »e funkcja f jest zaimplementowana wektorowo, tzn. »e wywoªanie w octave'ie f (z) dla z wektora zwróci wektor (f (z(k))). W przeciwnym
razie nale»aªoby u»y¢ p¦tli do wyznaczenia wektora y :
z=linspace ( a , b , 1 0 0 0 ) ;
for k =1: length ( z ) ,
y ( k)= f ( z ( k ) ) ;
endfor
60
Rysunek 5.8: Wykresy prostych splajnów typu not-a-knot i hermitowskiego
z w¦zªami nierównoodlegªymi z tymi samymi warunkami interpolacyjnymi.
Czerwone plusy oznaczaj¡ punkty interpolacji. Splajn hermitowski posiada
pochodne równe zero w ko«cach odcinka.
s=p p v a l ( pp , z ) ;
errmax=norm ( s −y , ' i n f ' )
W poni»szym kodzie obliczymy przybli»on¡ norm¦ maksimum na odcinku
[−1, 2] pomi¦dzy f (x) = sin(x), a jej dwoma splajnami interpolacyjnymi kubicznymi: naturalnym i typu not-a-knot na czterech w¦zªach równoodlegªych:
a=−1;
b=2;
f=@sin ;
N=4;
x=linspace ( a , b , 4 ) ;
y=f ( x ) ;
pp=spline ( x , y ) ;
ppn=c s a p e ( x , y , ' v a r i a t i o n a l ' ) ;
z=linspace ( a , b , 1 0 0 0 ) ;
61
Rysunek 5.9: Wykresy ró»nicy pomi¦dzy funkcj¡ sin(x), a jej dwoma splajnami interpolacyjnymi - naturalnym i typu not-a-knot. Czerwone plusy oznaczaj¡ cztery równoodlegªe punkty interpolacji na [−1, 2].
f z=f ( z ) ;
pz=p p v a l ( pp , z ) ;
pn=p p v a l ( ppn , z ) ;
e r r=norm ( f z −pz , ' i n f ' )
e r r n=norm ( f z −pn , ' i n f ' )
Bª¡d dla splajnu naturalnego byª wi¦kszy: errn = 0.048190, ni» dla splajnu
typu not-a -knot: err = 0.025120, co wida¢ te» na rysunku 5.9.
Jako zadanie pozostawiamy policzenie bª¦dów dla innych funkcji, w¦zªów
i typów splajnów kubicznych interpolacyjnych.
62

Podobne dokumenty