MN09LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
Nie podano opisu zmian
Przykry (dyskusja | edycje)
mNie podano opisu zmian
Linia 80: Linia 80:
Oto nasze wyniki:
Oto nasze wyniki:


<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>Dla <math>\displaystyle x^n</math> na <math>\displaystyle [0,1]</math>
Dla <math>\displaystyle x^n</math> na <math>\displaystyle [0,1]</math>
  2.2204e-16  0
<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>\displaystyle x^{n+1}</math> na <math>\displaystyle [0,1]</math>
Dla <math>\displaystyle x^{n+1}</math> na <math>\displaystyle [0,1]</math>
  1.1112e-04  2.1857e-04
<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>\displaystyle \sin(x)</math> na <math>\displaystyle [0,\pi]</math>
Dla <math>\displaystyle \sin(x)</math> na <math>\displaystyle [0,\pi]</math>
  1.4338e-09  5.4208e-09
<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>\displaystyle \sin(x)</math> na <math>\displaystyle [0,n\,\pi]</math>
Dla <math>\displaystyle \sin(x)</math> na <math>\displaystyle [0,n\,\pi]</math>
  1.00000    296.51659
<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>\displaystyle x^{n+1}</math> na <math>\displaystyle [0,n\,\pi]</math>
Dla <math>\displaystyle x^{n+1}</math> na <math>\displaystyle [0,n\,\pi]</math>
  6.0784e+06  1.1956e+07
<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>
</nowiki></div>
   
   
Linia 183: Linia 191:
gdyż wprowadza współczynniki dwumianu Newtona, które łatwo obliczać.
gdyż wprowadza współczynniki dwumianu Newtona, które łatwo obliczać.


<!--
Narzucająca się implementacja, korzystająca z funkcji <code>silnia</code>, którą sami sobie radośnie napiszemy:
{{algorytm|(niedobry!)|(niedobry!)|
<pre>for (j=0; j <= n; j++)
w[j] = (pow(-1,n-j)*silnia(n)) / (silnia(j)*silnia(n-j));
</pre>}}
jest tak niedobra, że aż przyprawia o drżenie rąk, gdy ją wpisuję. Niestety, tylko w życiu prostolinijność jest cnotą. W numeryce, podobnie jak w całej informatyce, ceni się spryt.
-->
</div></div></div>
</div></div></div>


Linia 219: Linia 215:
|+ <span style="font-variant:small-caps"> </span>
|+ <span style="font-variant:small-caps"> </span>
|-  
|-  
| <math>\displaystyle N=0</math>  ||  1  ||  ||  ||  || \  
| <math>\displaystyle N=0</math>  ||  1  ||  ||  ||  ||   
|-
|-
| <math>\displaystyle N=1</math>  ||  1  ||  -1  ||  ||  || \  
| <math>\displaystyle N=1</math>  ||  1  ||  -1  ||  ||  ||   
|-
|-
| <math>\displaystyle N=2</math>  ||  1  ||  -2  ||  1  ||  || \  
| <math>\displaystyle N=2</math>  ||  1  ||  -2  ||  1  ||  ||   
|-
|-
| <math>\displaystyle N=3</math>  ||  1  ||  -3  ||  3  ||  1  || \  
| <math>\displaystyle N=3</math>  ||  1  ||  -3  ||  3  ||  1  ||   
|-
|-
| \vdots  ||    ||    ||  ...  ||    ||  \
| <math>\displaystyle \vdots</math> ||    ||    ||  ...  ||    ||   
|-
|-
| <math>\displaystyle N=20</math>  ||  1  ||    ||  ...  ||    ||
| <math>\displaystyle N=20</math>  ||  1  ||    ||  ...  ||    ||  


|}
|}

Wersja z 21:32, 29 wrz 2006


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 Parser nie mógł rozpoznać (nieznana funkcja „\toR”): {\displaystyle \displaystyle f:[a,b]\toR} , 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.