1
Laboratorium komputerowe 8 Interpolacja Lagrange’a
Celem ćwiczenia jest wykonanie interpolacji za pomocą wielomianów Lagrange’a.
W pierwszym kroku rozpatrywany jest szczególny przypadek interpolacji 2-ego stopnia, a w kolejnym ogólna metoda dowolnego stopnia.
Uwaga:
Należy zapoznać się z wykładem z informatyki stosowanej dotyczącym interpolacji i aproksymacji funkcji, a w szczególności z interpolacją Lagrange’a. Warto przypomnieć sobie, jak oblicza się sumy i iloczyny skończone.
1. Wprowadzenie.
Ogólna postać funkcji interpolującej dana jest wzorem:
𝜑(𝑥) = 𝑎0𝜙0(𝑥) + 𝑎1𝜙1(𝑥)+ . . . +𝑎𝑛𝜙𝑛(𝑥) = ∑ 𝑎𝑖𝜙𝑖(𝑥)
𝑛
𝑖=0
gdzie 𝜙𝑖(𝑥), 𝑖 = 0,1, … , 𝑛 są funkcjami bazowymi oraz 𝑎𝑖 są współczynnikami liczbowymi.
W szczególnym przypadku interpolacji Lagrange’a wielomian interpolacyjny 𝑛-tego stopnia ma postać:
𝐿𝑛(𝑥) = 𝑓0 𝐿𝑛0(𝑥) + 𝑓1 𝐿𝑛1(𝑥)+ . . . +𝑓𝑛 𝐿𝑛𝑛(𝑥) = ∑ 𝑓𝑖 𝐿𝑛𝑖(𝑥)
𝑛
𝑖=0
gdzie 𝐿𝑛𝑖(𝑥), 𝑖 = 0,1, … , 𝑛 są funkcjami bazowymi Lagrange’a, a współczynniki 𝑓𝑖 są wartościami węzłowymi.
Funkcje bazowe Lagrange’a są wielomianami 𝑛-tego stopnia i dane są wzorem:
𝐿𝑛𝑖(𝑥) = (𝑥 − 𝑥0)(𝑥 − 𝑥1) . . . (𝑥 − 𝑥𝑖−1)(𝑥 − 𝑥𝑖+1) . . . (𝑥 − 𝑥𝑛)
(𝑥𝑖 − 𝑥0)(𝑥𝑖 − 𝑥1) . . . (𝑥𝑖− 𝑥𝑖−1)(𝑥𝑖− 𝑥𝑖+1) . . . (𝑥𝑖 − 𝑥𝑛)= ∏ (𝑥 − 𝑥𝑗) (𝑥𝑖− 𝑥𝑗)
𝑛
𝑗=0,𝑗≠𝑖
gdzie 𝑖 = 0,1, … , 𝑛 .
2 2. Implementacja interpolacji 2-ego stopnia.
Wielomian Lagrange’a 2-ego stopnia ma postać:
𝐿2(𝑥) = 𝑓0 𝐿20(𝑥) + 𝑓1 𝐿21(𝑥) + 𝑓2 𝐿22(𝑥) Funkcje bazowe:
𝐿2𝟎(𝑥) = (𝑥 − 𝑥1)(𝑥 − 𝑥2) (𝑥𝟎− 𝑥1)(𝑥𝟎− 𝑥2) 𝐿21(𝑥) = …
𝐿22(𝑥) = …
Rozpisać brakujące funkcje bazowe.
Zadanie 1
Dany jest dyskretny zbiór wartości węzłowych 𝑓𝑖 w węzłach 𝑥𝑖, 𝑖 = 0, 1, 2 :
𝑥𝑖 -1.5 1.5 5 𝑓𝑖 2 -1 1.2
Napisać skrypt, który zbuduje interpolację Lagrange’a 2-ego stopnia oraz wyświetli wykres funkcji interpolującej wraz z zaznaczonymi wartościami węzłowymi.
Uwaga
Zadanie rozwiązujemy numerycznie, a zatem należy wyznaczyć dyskretny zbiór wartości funkcji interpolującej 𝐿𝑛. Należy obliczyć dostatecznie dużo wartości, aby wyświetlony w kolejnym kroku wykres funkcji był odpowiednio gładki. Do narysowania wykresu można skorzystać z funkcji plot().
Przyjmujemy, że węzły interpolacji będą zapisane w wektorze x, a wartości węzłowe w wektorze f. Natomiast argumenty funkcji interpolującej zapisane zostaną w wektorze xx, a jej wartości w wektorze L.
Należy zwrócić uwagę na numerację węzłów. W przytoczonych wzorach matematycznych numeracja rozpoczyna się od węzła zerowego 𝑥0, a w Matlabie elementy wektora numerowane są od pierwszego: x(1).
W przypadku operacji na elementach wektorów pamiętać o operatorach z kropką.
3
Zarys skryptu znajduje się poniżej. Uzupełnić skrypt lub przygotować całkowicie własny (oczywiście nie trzeba korzystać z przedstawionego schematu).
x = [-1.5, 1.5, 5]; % węzły interpolacji
f = [2, -1, 1.2]; % wartości węzłowe
xx = x(1):0.01:x(end); % argumenty funkcji
% interpolującej
% wartości funkcji bazowej L0
L0 = (xx-x(2)).*(xx-x(3)) / ( (x(1)-x(2))*(x(1)-x(3)) );
% wartości funkcji bazowej L1 L1 = ...
% wartości funkcji bazowej L2 L2 = ...
% wartości funkcji interpolującej L L = ...
% narysowanie wykresu L oraz wartości węzłowych ...
Przykładowy wynik działania skryptu znajduje się poniżej.
4 3. Implementacja interpolacji dowolnego stopnia.
Krótkie przypomnienie Jak obliczyć sumę skończoną
𝑆 = ∑𝒇(𝑖)
𝒃
𝑖=𝒂
dla dowolnego wyrażenia 𝑓(𝑖) oraz dowolnych 𝑎 i 𝑏 ? Możemy skorzystać z poniższego skryptu:
s = 0;
for i=a:b
s = s + f(i);
end
Analogicznie możemy obliczyć iloczyn skończony:
𝑆 = ∏𝒇(𝑖)
𝒃
𝑖=𝒂
dla dowolnego wyrażenia 𝑓(𝑖) oraz dowolnych 𝑎 i 𝑏 : s = 1;
for i=a:b
s = s * f(i);
end
Na funkcję interpolującą Lagrange’a możemy spojrzeć w ten sam sposób – jest to suma skończona, której wyrazy (funkcje bazowe) są iloczynami skończonymi:
𝐿𝑛(𝑥) = ∑ 𝑓𝑖 𝐿𝑛𝑖(𝑥) , 𝑔𝑑𝑧𝑖𝑒:
𝑛
𝑖=0
𝐿𝑛𝑖(𝑥) = ∏ (𝑥 − 𝑥𝑗) (𝑥𝑖 − 𝑥𝑗)
𝑛
𝑗=0,𝑗≠𝑖
Zadanie 2
Napisać skrypt, który – analogicznie do interpolacji 2-ego stopnia – wyświetli wykres funkcji interpolującej wraz z zaznaczonymi wartościami węzłowymi. W tym przypadku mamy jednak mieć możliwość utworzenia interpolacji dowolnego stopnia.
5
Na początku skryptu definiujemy dowolnie wiele węzłów interpolacji, zapisując je w dwóch wektorach, podobnie jak w przypadku interpolacji 2-ego stopnia:
x = [ ];
f = [ ];
Interpolacja ma zostać zbudowana automatycznie, niezależnie od liczby węzłów. Można skorzystać z dwóch zagnieżdżonych pętli for, w wewnętrznej tworzymy i-tą funkcję bazową (iloczyn skończony), a w zewnętrznej dodajemy funkcje bazowe wymnożone przez odpowiednie współczynniki (suma skończona).
Przykładowy wynik działania skryptu dla danych:
x = [-4.1, -1.5, 1.5, 5, 7.7];
f = [-0.5, 2, -1, 1.2, 0.3];
znajduje się poniżej.