MN09LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Dorota (dyskusja | edycje)
Nie podano opisu zmian
m Zastępowanie tekstu – „,↵</math>” na „</math>,”
 
(Nie pokazano 5 wersji utworzonych przez 2 użytkowników)
Linia 1: Linia 1:
<!--  
<!--  
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;pawlik1/latex2mediawiki.php
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;pawlik1/latex2mediawiki.php.
Niezb�dne rozszerzenia i modyfikacje oryginalnego latex2mediawiki
wprowadzi� przykry@mimuw.edu.pl
-->
-->
   
   
=Ćwiczenia: interpolacja wielomianowa=
=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 9: Linia 157:
<div class="exercise">
<div class="exercise">


Wyprowadź formułę na pierwszy wzór barycentryczny w przypadku <math>\displaystyle n+1</math> węzłów równoodległych na odcinku <math>\displaystyle [0,1]</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>\displaystyle
<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 17: 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:#efe"> 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 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>\displaystyle [0,1]</math> jest trywialne. Aby zaś przejść od odcinka <math>\displaystyle [0,1]</math> do dowolnego <math>\displaystyle [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>\displaystyle (b-a)</math> spowoduje zmianę wszystkich wag o wspólny czynnik <math>\displaystyle (b-a)^{-n}</math>, który oczywiście upraszcza się w drugim wzorze barycentrycznym.
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 31: 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 = polfitb(x,y)</code> --- wyznaczającą współczynniki<math>\displaystyle c</math> wielomianu interpolującego wartości <math>\displaystyle y</math> w węzłach <strong>równoodległych</strong> <math>\displaystyle x</math>;
* <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 = polvalb(X,c)</code> --- wyznaczającą w zadanych węzłach <math>\displaystyle X</math> wartości <math>\displaystyle Y</math> wielomianu interpolacyjnego o współczynnikach <math>\displaystyle c</math>.
* <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 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:  
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:  
Linia 41: 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>\displaystyle w_j</math>. Jeśli z góry wiemy, że np. stopień naszego wielomianu interpolacyjnego nie przekroczy 20, to możemy przyspieszyć naszą procedurę, wykonując <strong>precomputing</strong>: wszak wagi w drugim wzorze barycentrycznym są wyznaczone niezależnie od węzłów!
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 48: Linia 213:
|+ <span style="font-variant:small-caps"> </span>
|+ <span style="font-variant:small-caps"> </span>
|-  
|-  
| <math>\displaystyle N=0</math>  ||  1  ||  ||  ||  ||  
| <math>N=0</math>  ||  1  ||  ||  ||  ||
|-
|-
| <math>\displaystyle N=1</math>  ||  1  ||  -1  ||  ||  ||   
| <math>N=1</math>  ||  1  ||  -1  ||  ||  ||   
|-
|-
| <math>\displaystyle N=2</math>  ||  1  ||  -2  ||  1  ||  ||   
| <math>N=2</math>  ||  1  ||  -2  ||  1  ||  ||   
|-
|-
| <math>\displaystyle N=3</math>  ||  1  ||  -3  ||  3  ||  1  ||   
| <math>N=3</math>  ||  1  ||  -3  ||  3  ||  1  ||   
|-
|-
| \vdots  ||    ||    ||  ...  ||    ||   
| <math>\vdots</math> ||    ||    ||  ...  ||    ||   
|-
|-
|  
| <math>N=20</math>  ||  1  ||    ||  ...  ||    || 


|}
|}
Linia 69: 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 77: 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>\displaystyle O(N^2)</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>\displaystyle 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 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>\displaystyle O(N)</math>.
Dla wzoru barycentrycznego, musimy po prostu aktualizować wszystkie wagi: także kosztem <math>O(N)</math>.


</div></div></div>
</div></div></div>
Linia 89: Linia 254:
<div class="exercise">
<div class="exercise">


Pokaż, że algorytm Hornera obliczania wartości <math>\displaystyle w(\xi)</math> wielomianu danego w postaci potęgowej jest jednocześnie algorytmem dzielenia tego wielomianu przez jednomian <math>\displaystyle (x-\xi)</math>. Dokładniej, jeśli <math>\displaystyle w(x)=\sum_{j=0}^n a_jx^j</math> to  
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>\displaystyle w(x)\,=\,\Big(\sum_{j=1}^n v_jx^{j-1}\Big) \cdot (x-\xi)\,+\,v_0,
<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>\displaystyle v_j</math> są zdefiniowane tak jak w algorytmie Hornera.
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 101: 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>\displaystyle a_j</math> tego wielomianu.  
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>\displaystyle \epsilon>0</math> i funkcja <math>\displaystyle f:[a,b]\toR</math>, która jest nieskończenie wiele razy różniczkowalna i wszystkie jej pochodne są na <math>\displaystyle [a,b]</math> ograniczone przez <math>\displaystyle M</math>. Napisz program znajdujący stopień <math>\displaystyle n</math> oraz współczynniki w bazie Newtona wielomianu <math>\displaystyle w_{f,n}\in\Pi_n</math> interpolacyjnego <math>\displaystyle f</math> z błędem  
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>\displaystyle \|f-w_{f,n}\|_{C([a,b])}\,\le\,\epsilon.
<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.  
Rozpatrz dwa przypadki: gdy węzły interpolacji są równoodległe, oraz gdy węzły są czebyszewowskie.  
</div></div>
</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. xi=a+ih, i=0,,n:

jeśli |f(n+1)(x)|M dla x[a,a+nh], to

|f(x)wn(x)|Mhn+14(n+1)
Wskazówka

Przetestuj eksperymentalnie jakość tego oszacowania dla kilku funkcji, dla których znasz wartość M, np.

  • wielomianu stopnia n,
  • wielomianu stopnia n+1,
  • funkcji sin(x) na [0,1],
  • funkcji sin(x) na [0,nπ],
  • funkcji ex.

porównując faktyczny błąd w [a,a+nh] z błędem z powyższego oszacowania.

Wskazówka
Rozwiązanie

Ćwiczenie: Aproksymacja funkcji sinus

Ile węzłów interpolacji wielomianowej Lagrange'a wystarczy, by przybliżyć funkcję f(x)=sin(x) z błędem bezwzględnym 108 na całym przedziale [0,π4]. Podaj odpowiedź w przypadku

  • węzłów równoodległych w [0,π4],
  • węzłów Czebyszewa w [0,π4].

Sprawdź eksperymentalnie, czy się nie pomyliłeś.

Rozwiązanie

Ćwiczenie: Wagi wzoru barycentrycznego

Wyprowadź formułę na pierwszy wzór barycentryczny w przypadku n+1 węzłów równoodległych na odcinku [0,1],

wj=(1)nj1hnj!(nj)!.

Wywnioskuj stąd wzór na wagi w drugim wzorze barycentrycznym.

Wskazówka

Podaj algorytm wyznaczania tych wag dla zadanego n.

Rozwiązanie

Ćwiczenie: Implementacja algorytmu barycentrycznego

Zaimplementuj drugi wzór barycentryczny tak, by w efekcie dostać dwie procedury:

  • c = polyfitb(x,y) --- wyznaczającą współczynniki c wielomianu interpolującego wartości y w węzłach równoodległych x;
  • Y = polyvalb(X,c) --- wyznaczającą, w zadanych węzłach X, wartości Y wielomianu interpolacyjnego o współczynnikach c.

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.
Rozwiązanie

Ć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
Rozwiązanie

Ćwiczenie: Algorytm Hornera może więcej

Pokaż, że algorytm Hornera obliczania wartości w(ξ) wielomianu danego w postaci potęgowej jest jednocześnie algorytmem dzielenia tego wielomianu przez jednomian (xξ). Dokładniej, jeśli w(x)=j=0najxj to

w(x)=(j=1nvjxj1)(xξ)+v0,

gdzie vj są zdefiniowane tak jak w algorytmie Hornera. Zaimplementuj i sprawdź na przykładach.

Rozwiązanie


Ćwiczenie

Niech dane będą ϵ>0 i funkcja f:[a,b]R, która jest nieskończenie wiele razy różniczkowalna i wszystkie jej pochodne są na [a,b] ograniczone przez M. Napisz program znajdujący stopień n oraz współczynniki w bazie Newtona wielomianu wf,nΠn interpolującego f z błędem

fwf,nC([a,b])ϵ

Rozpatrz dwa przypadki: gdy węzły interpolacji są równoodległe, oraz gdy węzły są czebyszewowskie.