W tym rozdziale zajmiemy się interpolacją splajnową, czyli interpolowaniem danej funkcji za pomocą splajnów - inaczej funkcji giętych.
Skupimy się na splajnach kubicznych, czyli funkcjach, które są klasy na odcinku
i dla danego podziału tego odcinka:
na pododcinki. Te funkcje obcięte do każdego pododcinka są wielomianami kubicznymi.
Zadanie interpolacji splajnami kubicznymi polega na znalezieniu spaljnu kubicznego spełniającego:
\begin{eqnarray*}
s(x_0)=y_0\\
s(x_1)=y_1 \\
\vdots \\
s(x_N)=y_N
\end{eqnarray*}
dla zadanych wartości . Okazuje się, że tak postawione zadanie nie jest jednoznaczne; trzeba dodać dwa dodatkowe warunki na
. Zazwyczaj są to odpowiednie warunki brzegowe, tzn. związane z wartościami
, pierwszych lub drugich pochodnych
w końcach odcinka.
spline()
and ppval
.
Zapoznaj się z pomocą do tych funkcji (help spline
i help ppval
).
Wykorzystując te funkcje narysuj wykres splajnu kubicznego na podziale równomiernym
odcinka z węzłami
dla
przyjmującego wartości
w tych węzłach.
Następnie znajdź współczynniki splajnu kubicznego na tym samym podziale odcinka i przyjmującego te same wartości w węzłach co
, ale który dodatkowo przyjmuje wartości pochodnych
w końcowych węzłach równe zero, tzn. wywołaj
funkcje spline()
podając dwie wartości więcej.
Następnie narysuj wykresy splajnów i
na tym samym rysunku.
Czy otrzymaliśmy te same splajny?
Policz przybliżoną normę maksimum
różnicy na odcinku
.
Dla danych węzłów równoodległych na
narysuj wykres splajnu kubicznego typu not-a-knot (czyli splajnu, którego współczynniki zwróci funkcja
spline()
przy najprostszym wywołaniu przez podanie wektora węzłów i wektora wartości w tych węzłach, por. help spline
)
takiego, że i
dla węzłów
.
Określ na podstawie wykresu nośnik tego splajnu.
Dla danych węzłów równoodległych na
narysuj wykres splajnu kubicznego
takiego, że i
dla węzłów
oraz ma pochodne równe zero w węzłach skrajnych, tzn. :
i
. Czy poza
ten splajn jest równy zero?
Policz przybliżone normy maksimum na i
dla tego splajnu.
Korzystając z funkcji octave'a spline()
znajdź współczynniki interpolacyjnego splajnu kubicznego hermitowskiego na
węzłach równoodległych dla funkcji
na odcinku
dla
dla
i
.
Następnie
dla jakiegoś całkowitego np.
lub
?
Powtórz zadanie [link], ale dla splajnów interpolacyjnych otrzymanych przez spline()
bez podawania wartości pochodnych w skrajnych węzłach. Czy współczynniki są te same? Tzn. czy szybkość zbieżności
jest taka sama?
Powtórz zadanie [link],
ale dla splajnów interpolacyjnych naturalnych. Tu trzeba wykorzystać funkcję z octave-forge (czyli rozszerzenia pakietu octave)\\ pp=csape(x,y,'variational')
\\- ostatni argument określa to, że splajn będzie naturalny.
Podajemy link do strony www z pomocą do funkcji csape()
: http://octave.sourceforge.net/splines/function/csape.html
Przetestuj jak w poprzednich zadaniach, czy splajny interpolacyjne kubiczne z podanymi warunkami na pochodne w końcach odcinka zbiegają w normie supremum do , tzn. korzystając z funkcji octave'a
spline()
znajdź współczynniki splajnu interpolacyjnego kubicznego na
węzłach równoodległych dla
na odcinku
dla
dla
i
oraz
narysuj wykresy i tych splajnów dla różnych
.
Następnie
oblicz dyskretną normę maksimum na siatce złożonej z tysiąca punktów na tym odcinku, tzn. dla
z
Policz równocześnie
współczynnik . Czy
dla jakiegoś
całkowitego?
mkpp()
.help mkpp()
). Utwórz przy pomocy mkpp()
splajn kubiczny umkpp()
.
Zapoznaj się z tą funkcją (help umkpp()
).
Utwórz przy pomocy spline()
splajn kubiczny na podziale
odcinka
taki, że interpoluje wielomian trzeciego stopnia na całym odcinku
np.
.
Następnie sprawdź współczynniki w bazie
za pomocą
umkpp()
na obu przedziałach, tzn. dla na przedziale
i
na
.
umkpp()
współczynniki splajnu z zadania [link] na wszystkich pododcinkach Porównaj z wynikami otrzymanymi teoretycznie.
Dla danego równomiernego podziału odcinka na
pododcinków utwórz za pomocą
mkpp()
strukturę splajnu liniowego interpolującego funkcję
w węzłach dla
.
dla jakiegoś całkowitego np.
lub
?
W tym zadaniu można wykorzystać funkcję z następnego zadania, tj. zadania [link].
function pp=linspline(x,y)
, która dla
zwróci w strukturze współczynniki
splajnu liniowego dla podziału zadanego węzłami
.
Strukturę należy utworzyć funkcją octave'a mkpp()
w taki sposób, aby można było obliczyć wartość
tego splajnu w punkcie (tablicy punktów) za pomocą funkcji octave'a ppval()
.
Dla funkcji
oraz
dla podziału odcinka z
i
na węzły równoodległe
dla i
.
Przetestuj rząd zbieżności splajnu liniowego interpolacyjnego.
Bardziej szczegółowo:
dla jakiegoś całkowitego np.
lub
?
Czy widać różnicę dla różnych ?