Interpolacja funkcjami sklejanymi.
Tomasz Chwiej 27 listopada 2011
Naszym zadaniem będzie naisanie programu do interpolacji przy pomocy funkcji sklejanych będących wielomianami 3 stopnia.
1 Program
1. Napisać procedurę do wyznaczania wartości drugich pochodnych w węzłach. Do procedury należy przekazać: a) wektor z położeniami węzłów (xw), b) wektor wartościami funkcji (yw), c) liczbę węzłów (n), d) wektor do którego procedura zapisze wartości drugich pochodnych (w), e) wartości drugich pochodnych w skrajnych węzłach (alfa i beta)
void wyzM(float *xw,float *yw, float *w, int n, float alfa, float beta) Uwaga: wszystkie elementy wektorów indeksujemy od 1 - żeby uniknąć pro- blemów w dalszej części zadania (rozwiązywanie układu równań). Całkowita liczba węzłów będzie więc równa n.
W celu wyznaczenia wartości drugich pochodnych trzeba skonstruować na podstawie od- ległości pomiędzy węzłami oraz wartości funkcji odpowiedni układ równań - tak jak po- kazano to na wykładzie. Przyjąć warunki z drugą pochodną. W pierwszym i ostatnim wierszu układu równań znajduje się 1 na diagonali a pozostałe elementy są równe 0. W wektorze wyrazów wolnych w miejsce pierwszego elementu wstawiamy wartość α, a do ostatniego elementu wartość β.
Układ równań rozwiązać metodą gaussj z Numerical Recipes.
2. Napisać procedurę do wyznaczania wartości funkcji w położeniu międzywęzłowym. Część argumentów będzie identyczna jak dla procedury wyzM, ale dodajemy jeszcze wartość aktualną x:
float wyzX(float *xw,float *yw, float *w, int n, float x){
y=...
return y;
}
W procedurze najpierw trzeba określić w którym przedziale znajduje się x , a następnie wyznaczyć wartość korzystając z wzorów pokazanych na wykładzie.
Uwaga: Może się zdarzyć że x pokryje się z położeniem któregoś z węzłów tj.
odległość między nimi będzie mniejsza niż 10−2hi (hi jest szerokością podprze- działu). Trzeba wykryć taki przypadek i od razu zwrócić wartość funkcji w danym węźle.
1
3. Napisać program do interpolacji funkcjami sklejanymi, który będzie korzystał z dwóch powyższych procedur.
2 Wyniki
Przy użyciu swojego programu przeprowadzić interpolację funkcji f1(x) = 1
1 + x2 (1)
oraz
f2(x) = cos(2x) (2)
Zadania do wykonania:
1. Dla funkcji f1(x) oraz 10 węzłów w przedziale x ∈ [−5, 5] należy wyznaczyć wartości drugich pochodnych i porównać je z ”dokładniejszymi” wartościami liczonymi zgodnie z wzorem:
d2f
dx2 ≈ f (x− ∆x) − 2f(x) + f(x + ∆x)
(∆x)2 (3)
Przyjąć ∆x = 0.01. Wykonać wykres wartości drugich pochodnych w zależności od poło- żenia węzłów pokazujący porównanie obu sposobów obliczania drugich pochodnych.
2. Wykonać interpolację dla f1(x) oraz f2(x) w przedziale x ∈ [−5, 5], dla liczby węzłów:
5,7,8,15,21. Wykonać rysunki funkcji interpolowanej i interpolującej dla każdego przypad- ku.