Marci Rociek Iformatyka, II rok Metody Obliczeiowe w Nauce i Techice laboratorium zestaw 1: iterpolacja Zadaie 1: Zaleźć wzór iterpolacyjy Lagrage a mając tablicę wartości: 3 5 6 y 1 3 5 6 Do rozwiązaia tego zadaia wykorzystałem fukcję polcoe z biblioteki Numerical Recipes. Fukcja ta wyzacza metodą Lagrage a współczyiki wielomiau przechodzącego przez zadae pukty. Na wejściu otrzymuje tablicę ze współrzędymi i y zadaych puktów, ich ilość, oraz tablicę do której wpisywae są wartości współczyików wielomiau. #iclude "r.h" void mai(void) float [],, 3, 5, 6; float y[] 1, 3,, 5, 6; float coef[5]; it i; polcoe(, y, 4, coef); pritf("zalezioy wielomia:\"); for(i; i<5; i++) pritf("%f*^%d\", coef[i], i); Wyik działaia programu: zalezioy wielomia: 1.*^ 6.883333*^1-5.8333*^ 1.16667*^3 -.91667*^4 Wielomiaem przechodzą cym przez zadae pukty jest wielomia zaday wzorem: y-.91667 4 +1.16667 3-5.8333 +6.883333+1 1
Poiżej zajduje się wykres fukcji tego wielomiau, wraz z aiesioymi węzłami iterpolacji: Zadaie : Zaleźć wielomia iterpolacyjy co ajwyżej 3-go stopia z oszacowaiem błędu dla y a przedziale <1; 9/4>. Zae są węzły: 1, 5/16, 16/9, 9/4. Korzystając z zer wielomiau Czebyszewa zaleźć optymaly wielomia dla tej fukcji. Oszacować wielomia wg. M+1 f ( ) W ( ) ( + 1 )! Do rozwiązaia tego zadaia posłużyłem się, podobie jak w poprzedim zadaiu fukcją polcoe z bibloteki Numerical Recipes. Najpierw wyzaczae są współczyiki wielomiau a podstawie zadaych węzłów, a astępie za pomocą zer wielomiau Czebyszewa. Optymalymi węzłami dla przedziału <a,b> są bowiem pukty: 1 m m b + 1 a ( ) cos π + ( b + a) #iclude "../umrec/recipes/r.h" #iclude <math.h> void mai(void) float [] 1, 5.f/16.f, 16.f/9.f, 9.f/4.f; float y[] 1, 5.f/4.f, 4.f/3.f, 3.f/.f; float c[4]; float yc[4]; float coef[4]; it i, m; polcoe(, y, 3, coef);
pritf("zalezioy wielomia:\"); for(i; i<4; i++) pritf("%f*^%d\", coef[i], i); pritf("\wezly czebyszewa:\"); for(m; m<4; m++) c[m].5*(([3]-[])*cos(pi*((.f*m+1.f)/8.f))+([3]+[])); yc[m] sqrt(c[m]); pritf("c%f\tyc%f\", c[m], yc[m]); polcoe(c, yc, 3, coef); pritf("\optymaly wielomia:\"); for(i; i<4; i++) pritf("%f*^%d\", coef[i], i); Wyik działaia programu: zalezioy wielomia:.38711*^.75417*^1 -.15674*^.1918*^3 wezly czebyszewa: c.45 c1.864177 c1.38583 c1.47575 yc1.48457 yc1.365349 yc1.1771 yc1.3511 optymaly wielomia:.385169*^.7553*^1 -.16*^.1981*^3 Wielomiaem iterpolują cym dla zadaych węzłów jest wielomia zaday wzorem: y.1918 3 -.15674 +.75417+.38711 Oszacowaie błędu: f ( ) ( 4 ) 15 f ( ) 16 7 ( 4 ) 15 M4 sup f ( ) < 1; 9/ 4> 16 15 5 16 9 f ( ) W( ) ( 1) 384 16 9 4 Wielomiaem optymalym wykorzystującym jako węzły zera wielomiau Czebyszewa jest wielomia: y.1981 3 -.16 +.7553+.385169 Oszacowaie błędu zgodie z wzorem f ( ) W ( ) M4 f ( ) W( ) 3. 4888 4! M+1 1! : ( + ) 3
Wykresy fukcji obu wielomiaów iemal pokrywają się z wykresem fukcji iterpolowaej: Różicę między wielomiaem a itrepolowaą fukcją widać wyraź ie a wykresie fukcji ε( ) f ( ) W( ), a którym rówież widać wpływ zastosowaia węzłów Czebyszewa: 4
Zadaie 3: Obliczyć wartość wielomiau Newtoa dla zad.1 Do rozwią zaia tego zadaia apisałem własy program wyzaczają cy współczyiki wielomiau iterpolacyjego metodą Newtoa. Wielomia Newtoa ma postać: ( ) ( ) ( ; ) ω ( ) ( ; ; ) ϖ ( )... ( ; ;...; ) ϖ ( ) W f + f 1 + f 1 1 + + f 1 1 Gdzie: ϖ ( ) ( )( ) K 1 ( ) f ( 1) f ( ) ( ; ), f ( ; ; ) f 1 1 1 ( ; ) ( ; ) f f 1 1 Najpierw obliczae są potrzebe ilorazy różicowe: wartości fukcji w kolejych puktach zawarte w tablicy y zastępowae są przez koleje ilorazy różicowe, tz: y, f( ; 1 ), f( ; 1 ; ), itd. Następie wyzaczae są współczyiki wielomiau iterpolacyjego: w kolejych iteracjach astępuje dodaie do wielomiau W wyrażeia ω f ( ) #defie MAX 5 void mai(void) float [MAX],, 3, 5, 6 ; /* dae wejsciowe */ float y[max] 1, 3,, 5, 6 ; float omega[max] 1,,,, ; /* (-)*(-1)*...*(-i) */ float w[max],,,, ; /* szukay wielomia */ it i, j, k; /* obliczeie potrzebych ilorazow rozicowych */ for(j; j<max-1; j++) for(i; i<max-j-1; i++) y[max-i-1] ((y[max-i-1]-y[max-i-])/([max-i-1]-[max-i-j-])); /* obliczeie wspolczyikow wielomiau Newtoa */ for(i; i<max; i++) for(k; k<i+1; k++) w[k] + omega[k]*y[i]; for(kmax-1; k>; k--) omega[k] omega[k-1]-[i]*omega[k]; omega[] -[i]*omega[]; pritf("zalezioy wielomia:\"); for(i; i<max; i++) pritf("%f*^%d\", w[i], i); Wyik działaia programu: zalezioy wielomia: 1.*^ 6.883334*^1-5.8334*^ 1.16667*^3 -.91667*^4 i,... ;...;, a astępie wymożeie wielomiau ω przez dwumia (- i ). Wielomiaem iterpolacyjym jest więc wielomia y-.91667 4 +1.16667 3-5.8333 +6.883333+1 który jest idetyczy z wielomiaem wyzaczoym metodą Lagrage a (a więc został wyzaczoy poprawie). 5
Zadaie 4: Fukcja f()e / daa jest a przedziale <3.5; 3.8> za pomocą tablicy w odstępach,1. Obliczyć wartości fukcji w przedziale z odstępem,1. Wielomia iterpolacyjy Lagrage a dla rówoodległych wartości argumetu ma postać: ( ) y ω ( ) ϖ ( )... ϖ ( ) W gdzie: ϖ y y y + + 1 + + h! h! h ( ) ( )( ) ( ) 1 K y y1 y, y y1 y,... Do rozwiązaia tego zadaia wykorzystałem zmodyfikowaą ieco wersję programu z zadaia 3. Różica polega a tym, że zamiast ilorazów różicowych wyliczae są różice progresywe, a w pętli wyzaczającej współczyiki wielomiau dochodzi jeszcze wyzaczaie współczyika 1/(h i!). #defie MAX 4 void mai(void) float [MAX] 3.5, 3.6, 3.7, 3.8 ; float y[max] 16.55776, 18.99117,.365,.3559 ; float ewy[41]; float omega[max] 1,,,, ; /* (-)*(-1)*...*(-i) */ float w[max],,,, ; /* szukay wielomia */ float f 1; float h [1]-[]; it i, j, k; /* obliczeie potrzebych rozic */ for(j; j<max-1; j++) for(i; i<max-j-1; i++) y[max-i-1] y[max-i-1]-y[max-i-]; /* obliczeie wspolczyikow wielomiau Newtoa */ for(i; i<max; i++) for(k; k<i+1; k++) w[k] + omega[k]*y[i]*f; for(kmax-1; k>; k--) omega[k] omega[k-1]-[i]*omega[k]; omega[] -[i]*omega[]; f * 1/(h*(float)(i+1)); pritf("zalezioy wielomia:\"); for(i; i<max; i++) pritf("%f*^%d\", w[i], i); 1 pritf("\wartosci wielomiau dla od 3.5 do 3.8 co.1:\"); pritf("\ty\"); for(f3.5; f<3.8; f+.1) float y ; float t 1; for(i; i<max; i++) y + t*w[i]; t * f; pritf("%.f\t%f\", f, y); 6
Wyik działaia programu: zalezioy wielomia: -78.64856*^ 77.16469*^1-5.5814*^ 3.9759*^3 wartosci wielomiau dla od 3.5 do 3.8 co.1: y 3.5 16.55776 3.51 16.74178 3.5 16.8973 3.53 17.656 3.54 17.335 3.55 17.4673 3.56 17.581661 3.57 17.758341 3.58 17.93679 3.59 18.11741 3.6 18.99114 3.61 18.48319 3.6 18.668766 3.63 18.856384 3.64 19.45851 3.65 19.3784 3.66 19.43635 3.67 19.65914 3.68 19.8317 3.69.411 3.7.3639 3.71.4691 3.7.635 3.73.8396 3.74 1.4957 3.75 1.6614 3.76 1.4743 3.77 1.6994 3.78 1.9885 3.79.1848 3.8.35599 Wielomiaem iterpolują cym jest wielomia y3.9759 3-5.5814 +77.16469-78.64856 Za jego pomocą wyzaczoe zostały wartości fukcji w przedziale z krokiem,1. 7