MN09LAB: Różnice pomiędzy wersjami
mNie podano opisu zmian |
m Zastępowanie tekstu – „,↵</math>” na „</math>,” |
||
(Nie pokazano 7 wersji utworzonych przez 3 użytkowników) | |||
Linia 1: | Linia 1: | ||
<!-- | <!-- | ||
Konwertowane z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/ pawlik1/latex2mediawiki.php | Konwertowane z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/ pawlik1/latex2mediawiki.php. | ||
Niezb�dne rozszerzenia i modyfikacje oryginalnego latex2mediawiki | |||
wprowadzi� przykry@mimuw.edu.pl | |||
--> | --> | ||
= | =Interpolacja wielomianowa= | ||
{{powrot |Metody numeryczne | do strony głównej | |||
przedmiotu <strong>Metody numeryczne</strong>}} | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
Oglądaj wskazówki i rozwiązania __SHOWALL__<br> | |||
Ukryj wskazówki i rozwiązania __HIDEALL__ | |||
</div> | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | |||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie: Błąd interpolacji dla węzłów równoodległych</span> | |||
<div class="exercise"> | |||
Wyprowadź wzór na błąd interpolacji w przypadku węzłów równoodległych, tzn. <math>x_i = a + ih</math>, <math>i = 0,\ldots,n</math>: | |||
jeśli <math>|f^{(n+1)}(x)| \leq M</math> dla <math>x\in [a, a+nh]</math>, to | |||
<center><math>|f(x) - w_n(x)| \leq M \frac{h^{n+1}}{4(n+1)}</math></center> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | |||
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Wystarczy zauważyć, że jeśli <math>x</math> leży pomiędzy <math>x_j</math> a <math>x_{j+1}</math>, to <math>|(x-x_j)(x-x_{j+1})| \leq h^2/4</math> i skorzystać z twierdzenia o błedzie interpolacji z wykładu. </div> | |||
</div></div> | |||
Przetestuj eksperymentalnie jakość tego oszacowania dla kilku funkcji, dla których znasz wartość <math>M</math>, np. | |||
* wielomianu stopnia <math>n</math>, | |||
* wielomianu stopnia <math>n+1</math>, | |||
* funkcji <math>\sin(x)</math> na <math>[0,1]</math>, | |||
* funkcji <math>\sin(x)</math> na <math>[0,n\pi]</math>, | |||
* funkcji <math>e^x</math>. | |||
porównując faktyczny błąd w <math>[a, a+nh]</math> z błędem z powyższego oszacowania. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | |||
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> "Faktyczną" wartość błędu możesz dobrze przybliżyć, wyznaczając wartość różnicy <math>|f(x) - w_n(x)|</math> w bardzo wielu punktach przedziału. Gdy punkty te są dostatecznie gęsto rozłożone w całym przedziale, a funkcje --- jak u nas --- są gładkie, taka procedura da dobre oszacowanie prawdziwego błędu. </div> | |||
</div></div> | |||
</div></div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | |||
Wartość podanego w zadaniu oszacowania zazwyczaj trochę przeszacowuje faktyczną wartość błędu, co możemy zobaczyć na przykładach, w których zajęliśmy się wielomianem stopnia 7 (czy wyniki różnią się, gdy weźmiemy wielomian stopnia 6?): | |||
<div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>n = 7; | |||
a = 0; b = 1; x = linspace(a,b,n+1); h = x(2)-x(1); | |||
X = linspace(a,b,ceil(1000*(b-a))); | |||
y = x.^n; M = 0; | |||
p = polyfit(x,y,n); | |||
[norm(polyval(p,X) - X.^n, inf), (M*h^(n+1))/(4*(n+1))] | |||
y = x.^(n+1); M = gamma(n+2); | |||
p = polyfit(x,y,n); | |||
[norm(polyval(p,X) - X.^(n+1), inf), (M*h^(n+1))/(4*(n+1))] | |||
y = sin(x); M = 1; | |||
p = polyfit(x,y,n); | |||
[norm(polyval(p,X) - sin(X), inf), (M*h^(n+1))/(4*(n+1))] | |||
a = 0; b = n*pi; x = linspace(a,b,n+1); h = x(2)-x(1); | |||
X = linspace(a,b,ceil(1000*(b-a))); | |||
y = sin(x); M = 1; | |||
p = polyfit(x,y,n); | |||
[norm(polyval(p,X) - sin(X), inf), (M*h^(n+1))/(4*(n+1))] | |||
y = x.^(n+1); M = gamma(n+2); | |||
p = polyfit(x,y,n); | |||
[norm(polyval(p,X) - X.^(n+1), inf), (M*h^(n+1))/(4*(n+1))] | |||
</pre></div> | |||
Oto nasze wyniki: | |||
Dla <math>x^n</math> na <math>[0,1]</math> | |||
<div style="font-family: monospace; white-space: pre; border-style: dashed; border-width: thin; border-color: black; margin: 1em; padding:1em; color: #444; background-color:#fdfdfd;"><nowiki>2.2204e-16 0 | |||
</nowiki></div> | |||
Dla <math>x^{n+1}</math> na <math>[0,1]</math> | |||
<div style="font-family: monospace; white-space: pre; border-style: dashed; border-width: thin; border-color: black; margin: 1em; padding:1em; color: #444; background-color:#fdfdfd;"><nowiki>1.1112e-04 2.1857e-04 | |||
</nowiki></div> | |||
Dla <math>\sin(x)</math> na <math>[0,\pi]</math> | |||
<div style="font-family: monospace; white-space: pre; border-style: dashed; border-width: thin; border-color: black; margin: 1em; padding:1em; color: #444; background-color:#fdfdfd;"><nowiki>1.4338e-09 5.4208e-09 | |||
</nowiki></div> | |||
Dla <math>\sin(x)</math> na <math>[0,n\,\pi]</math> | |||
<div style="font-family: monospace; white-space: pre; border-style: dashed; border-width: thin; border-color: black; margin: 1em; padding:1em; color: #444; background-color:#fdfdfd;"><nowiki>1.00000 296.51659 | |||
</nowiki></div> | |||
Dla <math>x^{n+1}</math> na <math>[0,n\,\pi]</math> | |||
<div style="font-family: monospace; white-space: pre; border-style: dashed; border-width: thin; border-color: black; margin: 1em; padding:1em; color: #444; background-color:#fdfdfd;"><nowiki>6.0784e+06 1.1956e+07 | |||
</nowiki></div> | |||
Oczywiście, nie powinniśmy martwić się, że oszacowanie okazało się "fałszywe" dla wielomianu stopnia <math>n</math>, gdyż eksperymentalna wartość błędu wyniosła tylko <math>\epsilon_{ \mbox{mach} }</math> i była spowodowana oczywiście redukcją cyfr przy odejmowaniu (nasz wielomian interpolacyjny przecież pokrywa się z zadanym, więc wartość ''różnicy'' wartości wielomianów musi wyjść (prawie) zero. | |||
</div></div></div> | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | |||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie: Aproksymacja funkcji sinus</span> | |||
<div class="exercise"> | |||
Ile węzłów interpolacji wielomianowej Lagrange'a wystarczy, by przybliżyć | |||
funkcję <math>f(x) = \sin(x)</math> z błędem bezwzględnym <math>10^{-8}</math> na całym przedziale <math>[0,\frac{\pi}{4}]</math>. Podaj odpowiedź w przypadku | |||
* węzłów równoodległych w <math>[0,\frac{\pi}{4}]</math>, | |||
* węzłów Czebyszewa w <math>[0,\frac{\pi}{4}]</math>. | |||
Sprawdź eksperymentalnie, czy się nie pomyliłeś. | |||
</div></div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | |||
Dla węzłów równoodległych mamy z poprzedniego zadania | |||
<center><math>|\sin(x) - w_n(x)| \leq \frac{h^{n+1}}{4(n+1)}</math>,</center> | |||
gdzie <math>h = \frac{\pi}{4n}</math>, skąd warunek na <math>n</math>: | |||
<center><math>\left(\frac{\pi}{4n}\right)^{n+1}\cdot \frac{1}{4(n+1)} \leq 10^{-8}, | |||
</math></center> | |||
czyli <math>n \geq 7</math>. Rzeczywiście, | |||
<div style="font-family: monospace; white-space: pre; border-style: dashed; border-width: thin; border-color: black; margin: 1em; padding:1em; color: #444; background-color:#fdfdfd;"><nowiki>n = 6; | |||
a = 0; b = pi/4; x = linspace(a,b,n+1); h = x(2)-x(1); | |||
X = linspace(a,b,ceil(1000*(b-a))); | |||
y = sin(x); M = 1; | |||
p = polyfit(x,y,n); | |||
[norm(polyval(p,X) - sin(X), inf), (M*h^(n+1))/(4*(n+1))] | |||
ans = | |||
1.1720e-08 2.3519e-08 | |||
n = 7; | |||
a = 0; b = pi/4; x = linspace(a,b,n+1); h = x(2)-x(1); | |||
X = linspace(a,b,ceil(1000*(b-a))); | |||
y = sin(x); M = 1; | |||
p = polyfit(x,y,n); | |||
[norm(polyval(p,X) - sin(X), inf), (M*h^(n+1))/(4*(n+1))] | |||
ans = | |||
1.6663e-10 7.8485e-10 | |||
</nowiki></div> | |||
Dla węzłów Czebyszewa musimy skorzystać z oszacowania wykładu. Rachunki pozostawiamy Czytelnikowi. | |||
</div></div></div> | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
Linia 10: | Linia 157: | ||
<div class="exercise"> | <div class="exercise"> | ||
Wyprowadź formułę na pierwszy wzór barycentryczny w przypadku <math> | Wyprowadź formułę na pierwszy wzór barycentryczny w przypadku <math>n+1</math> węzłów równoodległych na odcinku <math>[0,1]</math>, | ||
<center><math> | <center><math> | ||
w_j = (-1)^{n-j}\frac{1}{h^{n} \, j! \, (n-j)!}. | w_j = (-1)^{n-j}\frac{1}{h^{n} \, j! \, (n-j)!}. | ||
</math></center> | </math></center> | ||
Linia 18: | Linia 165: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | ||
<div style="font-size:smaller; background-color:# | <div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Aby uprościć wagi w drugim wzorze barycentrycznym, zauważ, że skalowanie <strong>wszystkich wag</strong> przez tę samą stałą nie wpływa na jego wartość. </div> | ||
</div></div> | </div></div> | ||
Podaj algorytm wyznaczania tych wag dla zadanego <math>n</math>. | |||
</div></div> | </div></div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | ||
Wyprowadzenie wzoru dla odcinka <math> | Wyprowadzenie wzoru dla odcinka <math>[0,1]</math> jest trywialne. Aby zaś przejść od odcinka <math>[0,1]</math> do dowolnego <math>[a,b]</math> należy dokonać transformacji liniowej węzłów: przesunięcie węzłów nic nie zmienia, bo we wzorze na wagi występują jedynie odległości między węzłami; natomiast skalowanie o czynnik <math>(b-a)</math> spowoduje zmianę wszystkich wag o wspólny czynnik <math>(b-a)^{-n}</math>, który oczywiście upraszcza się w drugim wzorze barycentrycznym. | ||
Dlatego niezłym wzorem na wagi węzłów równoodległych w drugim wzorze barycentrycznym byłby | |||
<center><math> | |||
w_j = (-1)^{n-j}\frac{1}{j! \, (n-j)!}, | |||
</math></center> | |||
ale jeszcze lepszym --- | |||
<center><math> | |||
w_j = (-1)^{n-j}\frac{n!}{j! \, (n-j)!} = (-1)^j \begin{pmatrix} | |||
n \\ | |||
j | |||
\end{pmatrix} , | |||
</math></center> | |||
gdyż wprowadza współczynniki dwumianu Newtona, które łatwo obliczać. | |||
</div></div></div> | </div></div></div> | ||
Linia 32: | Linia 196: | ||
Zaimplementuj drugi wzór barycentryczny tak, by w efekcie dostać dwie procedury: | Zaimplementuj drugi wzór barycentryczny tak, by w efekcie dostać dwie procedury: | ||
* <code>c = | * <code>c = polyfitb(x,y)</code> --- wyznaczającą współczynniki <math>c</math> wielomianu interpolującego wartości <math>y</math> w węzłach <strong>równoodległych</strong> <math>x</math>; | ||
* <code>Y = | * <code>Y = polyvalb(X,c)</code> --- wyznaczającą, w zadanych węzłach <math>X</math>, wartości <math>Y</math> wielomianu interpolacyjnego o współczynnikach <math>c</math>. | ||
Oszacuj koszt | Oszacuj koszt twojego algorytmu i porównaj z kosztem algorytmu różnic dzielonych (dla współczynników) i algorytmem Hornera (dla wartości) w dwóch przypadkach: | ||
* kiedy jest dużo węzłów interpolacji, a potrzebna jest tylko jedna wartość wielomianu interpolacyjnego; | * kiedy jest dużo węzłów interpolacji, a potrzebna jest tylko jedna wartość wielomianu interpolacyjnego; | ||
* na odwrót, kiedy jest mało węzłów interpolacji, a potrzeba wyznaczyć bardzo dużo wartości wielomianu interpolacyjnego. | * na odwrót, kiedy jest mało węzłów interpolacji, a potrzeba wyznaczyć bardzo dużo wartości wielomianu interpolacyjnego. | ||
Linia 42: | Linia 206: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | ||
Musimy wyznaczyć współczynniki wagowe <math> | Musimy wyznaczyć współczynniki wagowe <math>w_j</math>. Jeśli z góry wiemy, że np. stopień naszego wielomianu interpolacyjnego nie przekroczy, powiedzmy, <math>N=20</math>, to możemy przyspieszyć naszą procedurę, wykonując <strong>precomputing</strong>: wszak wagi w drugim wzorze barycentrycznym są wyznaczone niezależnie od konkretnych węzłów! | ||
Zatem musimy wyliczyć (całkowite!) wartości trójkątnej tabelki | Zatem musimy wyliczyć (całkowite!) wartości trójkątnej tabelki | ||
Linia 49: | Linia 213: | ||
|+ <span style="font-variant:small-caps"> </span> | |+ <span style="font-variant:small-caps"> </span> | ||
|- | |- | ||
| <math> | | <math>N=0</math> || 1 || || || || | ||
|- | |- | ||
| <math> | | <math>N=1</math> || 1 || -1 || || || | ||
|- | |- | ||
| <math> | | <math>N=2</math> || 1 || -2 || 1 || || | ||
|- | |- | ||
| <math> | | <math>N=3</math> || 1 || -3 || 3 || 1 || | ||
|- | |- | ||
| \vdots || || || ... || || | | <math>\vdots</math> || || || ... || || | ||
|- | |- | ||
| | | <math>N=20</math> || 1 || || ... || || | ||
|} | |} | ||
Linia 70: | Linia 234: | ||
<div class="exercise"> | <div class="exercise"> | ||
Często w aplikacjach takich jak programy CAD zachodzi potrzeba dodania na bieżąco dodatkowego węzła interpolacji. Podaj jak to zrobić --- i jaki to będzie miało koszt --- gdy interpolant jest zadany w bazie | Często w aplikacjach takich jak programy CAD zachodzi potrzeba dodania na bieżąco dodatkowego węzła interpolacji. Podaj, jak to zrobić --- i jaki to będzie miało koszt --- gdy interpolant jest zadany w bazie | ||
* naturalnej | * naturalnej | ||
* Newtona | * Newtona | ||
Linia 78: | Linia 242: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | ||
Po raz kolejny okazuje się, jak niedobra jest baza naturalna: koszt wyznaczenia nowych współczynników to koszt rozwiązania układu z macierzą gęstą od nowa. Fakt, dodajemy do niej tylko dodatkowy wiersz i dodatkową kolumnę, więc przy odrobinie szczęścia możemy wykorzystać czynniki rozkładu starej (mniejszej) macierzy, ale i tak, koszt będzie co najmniej <math> | Po raz kolejny okazuje się, jak niedobra jest baza naturalna: koszt wyznaczenia nowych współczynników to koszt rozwiązania układu z macierzą gęstą od nowa. Fakt, dodajemy do niej tylko dodatkowy wiersz i dodatkową kolumnę, więc przy odrobinie szczęścia możemy wykorzystać czynniki rozkładu starej (mniejszej) macierzy, ale i tak, koszt będzie co najmniej <math>O(N^2)</math>. | ||
Dla bazy Newtona wystarczy doliczyć jeszcze jeden wiersz w tabelce różnic dzielonych (koszt <math> | Dla bazy Newtona wystarczy doliczyć jeszcze jeden wiersz w tabelce różnic dzielonych (koszt <math>O(N)</math>), ale pamiętajmy, że zapewne zmienimy w ten sposób uporządkowanie węzłów, co może trochę pogroszyć numeryczne własności tak otrzymanego interpolantu. | ||
Dla wzoru barycentrycznego, musimy po prostu aktualizować wszystkie wagi: także kosztem <math> | Dla wzoru barycentrycznego, musimy po prostu aktualizować wszystkie wagi: także kosztem <math>O(N)</math>. | ||
</div></div></div> | </div></div></div> | ||
Linia 90: | Linia 254: | ||
<div class="exercise"> | <div class="exercise"> | ||
Pokaż, że algorytm Hornera obliczania wartości <math>w(\xi)</math> wielomianu danego w postaci potęgowej jest jednocześnie algorytmem dzielenia tego wielomianu przez jednomian <math>(x-\xi)</math>. Dokładniej, jeśli <math>w(x)=\sum_{j=0}^n a_jx^j</math> to | |||
<center><math> | <center><math>w(x)\,=\,\Big(\sum_{j=1}^n v_jx^{j-1}\Big) \cdot (x-\xi)\,+\,v_0</math>,</center> | ||
</math></center> | |||
gdzie <math> | gdzie <math>v_j</math> są zdefiniowane tak jak w algorytmie Hornera. Zaimplementuj i sprawdź na przykładach. | ||
</div></div> | </div></div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | |||
Zobacz rozdział 3.5 w | |||
* <span style="font-variant:small-caps">D. Kincaid, W. Cheney</span>, <cite>Analiza numeryczna</cite>, Wydawnictwa Naukowo-Techniczne, Warszawa, 2006. | |||
</div></div></div> | |||
<!-- | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
Linia 102: | Linia 272: | ||
<div class="exercise"> | <div class="exercise"> | ||
Pokaż numeryczną poprawność algorytmu Hornera obliczania wartości wielomianu ze względu na dane współczynniki <math>a_j</math> tego wielomianu. | |||
</div></div> | </div></div> | ||
--> | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie</span> | <span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | <div class="exercise"> | ||
Niech dane będą <math> | Niech dane będą <math>\epsilon>0</math> i funkcja <math>f:[a,b]\to R</math>, która jest nieskończenie wiele razy różniczkowalna i wszystkie jej pochodne są na <math>[a,b]</math> ograniczone przez <math>M</math>. Napisz program znajdujący stopień <math>n</math> oraz współczynniki w bazie Newtona wielomianu <math>w_{f,n}\in\Pi_n</math> interpolującego <math>f</math> z błędem | ||
<center><math> | <center><math>\|f-w_{f,n}\|_{C([a,b])}\,\le\,\epsilon</math></center> | ||
</math></center> | |||
Rozpatrz dwa przypadki: gdy węzły interpolacji są równoodległe, oraz gdy węzły są czebyszewowskie. | |||
</div></div> |
Aktualna wersja na dzień 21:49, 11 wrz 2023
Interpolacja wielomianowa
<<< Powrót do strony głównej przedmiotu Metody numeryczne
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
Ćwiczenie: Błąd interpolacji dla węzłów równoodległych
Wyprowadź wzór na błąd interpolacji w przypadku węzłów równoodległych, tzn. , :
jeśli dla , to
Przetestuj eksperymentalnie jakość tego oszacowania dla kilku funkcji, dla których znasz wartość , np.
- wielomianu stopnia ,
- wielomianu stopnia ,
- funkcji na ,
- funkcji na ,
- funkcji .
porównując faktyczny błąd w z błędem z powyższego oszacowania.
Ćwiczenie: Aproksymacja funkcji sinus
Ile węzłów interpolacji wielomianowej Lagrange'a wystarczy, by przybliżyć funkcję z błędem bezwzględnym na całym przedziale . Podaj odpowiedź w przypadku
- węzłów równoodległych w ,
- węzłów Czebyszewa w .
Sprawdź eksperymentalnie, czy się nie pomyliłeś.
Ćwiczenie: Wagi wzoru barycentrycznego
Wyprowadź formułę na pierwszy wzór barycentryczny w przypadku węzłów równoodległych na odcinku ,
Wywnioskuj stąd wzór na wagi w drugim wzorze barycentrycznym.
Podaj algorytm wyznaczania tych wag dla zadanego .
Ćwiczenie: Implementacja algorytmu barycentrycznego
Zaimplementuj drugi wzór barycentryczny tak, by w efekcie dostać dwie procedury:
c = polyfitb(x,y)
--- wyznaczającą współczynniki wielomianu interpolującego wartości w węzłach równoodległych ;Y = polyvalb(X,c)
--- wyznaczającą, w zadanych węzłach , wartości wielomianu interpolacyjnego o współczynnikach .
Oszacuj koszt twojego algorytmu i porównaj z kosztem algorytmu różnic dzielonych (dla współczynników) i algorytmem Hornera (dla wartości) w dwóch przypadkach:
- kiedy jest dużo węzłów interpolacji, a potrzebna jest tylko jedna wartość wielomianu interpolacyjnego;
- na odwrót, kiedy jest mało węzłów interpolacji, a potrzeba wyznaczyć bardzo dużo wartości wielomianu interpolacyjnego.
Ćwiczenie: Dodawanie węzła interpolacji
Często w aplikacjach takich jak programy CAD zachodzi potrzeba dodania na bieżąco dodatkowego węzła interpolacji. Podaj, jak to zrobić --- i jaki to będzie miało koszt --- gdy interpolant jest zadany w bazie
- naturalnej
- Newtona
- Lagrange'a
Ćwiczenie: Algorytm Hornera może więcej
Pokaż, że algorytm Hornera obliczania wartości wielomianu danego w postaci potęgowej jest jednocześnie algorytmem dzielenia tego wielomianu przez jednomian . Dokładniej, jeśli to
gdzie są zdefiniowane tak jak w algorytmie Hornera. Zaimplementuj i sprawdź na przykładach.
Ćwiczenie
Niech dane będą i funkcja , która jest nieskończenie wiele razy różniczkowalna i wszystkie jej pochodne są na ograniczone przez . Napisz program znajdujący stopień oraz współczynniki w bazie Newtona wielomianu interpolującego z błędem
Rozpatrz dwa przypadki: gdy węzły interpolacji są równoodległe, oraz gdy węzły są czebyszewowskie.