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