Metody numeryczne Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład 8
J.Nawrocki, Metody numeryczne Plan wykładu Reprezentacja liczb rzeczywistych Obliczanie e x Obliczanie wartości wielomianu
J.Nawrocki, Metody numeryczne Reprezentacja liczb rzeczywistych x 0:x = s 2 c m s= +1 lub –1 (znak liczby) c= cecha (liczba całkowita) m= mantysa: liczba rzeczywista [1/2, 1) 0,5 = 2 0 1/2, dlatego s=+1, c=0, m=1/2 1 = 2 1 1/2, dlatego s=+1, c=1, m=1/2 0,25 = /2, dlatego s=+1, c=-1, m=1/2 0,75 = 2 0 3/4, dlatego s=+1, c=0, m=3/4 1,5 = 2 1 3/4, dlatego s=+1, c=1, m=3/4 -3 = /4, dlatego s=-1, c=-2, m=3/4
J.Nawrocki, Metody numeryczne Reprezentacja liczb rzeczywistych x 0:x = s 2 c m s= +1 lub –1 (znak liczby) c= cecha (liczba całkowita) m= mantysa: liczba rzeczywista [1/2, 1) Ciąg cyfr binarnych c 1 c 2 c 3..c t reprezentuje mantysę m = c 1 /2 + c 2 /4 + c 3 / c t /2 t m=4/8 na 4 bitach: 1000 m=5/8 na 4 bitach: 1010 m=6/8 na 4 bitach: 1100 m=7/8 na 4 bitach: 1110
J.Nawrocki, Metody numeryczne Obliczanie e x e x = 1 + x/1! + x 2 /2! + x 3 /3! + x 4 /4! +... e(1) = 2,71.. e(0) = 1 Wyraz = Licznik Mianownik x 1! x2x2 2! x3x3 3! 1 1
J.Nawrocki, Metody numeryczne Obliczanie e x e x = 1 + x/1! + x 2 /2! + x 3 /3! + x 4 /4! +... e(1) = 2,71.. e(0) = 1 Wyraz = Licznik Mianownik x 1! x2x2 2! x3x3 3! 1 1 *x *1*2*3
J.Nawrocki, Metody numeryczne Obliczanie e x e x = 1 + x/1! + x 2 /2! + x 3 /3! + x 4 /4! +... e(1) = 2,71.. e(0) = 1 void main(){ float x; // Argument e(x) scanf("%g", &x); printf("e(%g)= %g\n", x, e(x)); return; } e(0)= 1 0
J.Nawrocki, Metody numeryczne Obliczanie e x e x = 1 + x/1! + x 2 /2! + x 3 /3! + x 4 /4! +... e(1) = 2,71.. e(0) = 1 float e(float x){ float suma=0; licznik = mianownik = 1.0; for (...){ suma += licznik / mianownik; licznik *= x; mianownik *= i; } return suma; } x 1! x2x2 2! x3x3 3! 1 1 *x *1*2*3
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,0) = a 0 p(x,1) = a 0 x + a 1 p(x,2) = a 0 x 2 + a 1 x + a 2 p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n p(x,3) = a 0 x 3 + a 1 x 2 + a 2 x + a 3 p(x,4) = a 0 x 4 + a 1 x 3 + a 2 x 2 + a 3 x + a 4
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,0) = a 0 p(x,1) = a 0 x + a 1 = p(x, 0)x + a 1 p(x,2) = a 0 x 2 + a 1 x + a 2 p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n p(x,3) = a 0 x 3 + a 1 x 2 + a 2 x + a 3 p(x,4) = a 0 x 4 + a 1 x 3 + a 2 x 2 + a 3 x + a 4
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,0) = a 0 p(x,1) = a 0 x + a 1 = p(x, 0)x + a 1 p(x,2) = a 0 x 2 + a 1 x + a 2 = (a 0 x 1 + a 1 )x + a 2 = p(x,1)x+a 2 p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n p(x,3) = a 0 x 3 + a 1 x 2 + a 2 x + a 3 p(x,4) = a 0 x 4 + a 1 x 3 + a 2 x 2 + a 3 x + a 4
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,0) = a 0 p(x,1) = a 0 x + a 1 = p(x, 0)x + a 1 p(x,2) = a 0 x 2 + a 1 x + a 2 = (a 0 x 1 + a 1 )x + a 2 = p(x,1)x+a 2 p(x,3) = a 0 x 3 + a 1 x 2 + a 2 x + a 3 = = (a 0 x 2 + a 1 x 1 + a 2 )x + a 3 = p(x,2)x + a 3 p(x,4) = a 0 x 4 + a 1 x 3 + a 2 x 2 + a 3 x + a 4 p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,0) = a 0 p(x,1) = a 0 x + a 1 = p(x, 0)x + a 1 p(x,2) = a 0 x 2 + a 1 x + a 2 = (a 0 x 1 + a 1 )x + a 2 = p(x,1)x+a 2 p(x,3) = a 0 x 3 + a 1 x 2 + a 2 x + a 3 = = (a 0 x 2 + a 1 x 1 + a 2 )x + a 3 = p(x,2)x + a 3 p(x,4) = a 0 x 4 + a 1 x 3 + a 2 x 2 + a 3 x + a 4 = = (a 0 x 3 + a 1 x 2 + a 2 x 1 + a 3 )x + a 4 = p(x,3)x + a 4 p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,0) = a 0 p(x,1) = a 0 x + a 1 = p(x, 0)x + a 1 p(x,2) = a 0 x 2 + a 1 x + a 2 = (a 0 x 1 + a 1 )x + a 2 = p(x,1)x+a 2 p(x,3) = a 0 x 3 + a 1 x 2 + a 2 x + a 3 = = (a 0 x 2 + a 1 x 1 + a 2 )x + a 3 = p(x,2)x + a 3 p(x,4) = a 0 x 4 + a 1 x 3 + a 2 x 2 + a 3 x + a 4 = = (a 0 x 3 + a 1 x 2 + a 2 x 1 + a 3 )x + a 4 = p(x,3)x + a 4 p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n p(x,n) = p(x, n-1)x + a n
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,0) = a 0 p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n p(x,n) = p(x, n-1)x + a n float p(float x, int n, float a[ ])... #define MaxN 50 void main(){ float x; // Zmienna x int n; // Stopien wielomianu float a[MaxN+1]; // Wspolczynniki wielomianu... printf("%g\n", p(x, n, a)); return; } Nagłówek p Wywołanie p
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,0) = a 0 p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n p(x,n) = p(x, n-1)x + a n float p(float x, int n, float a[ ]) { if (n==0){ return a[0]; }else{ return p(x, n-1, a)*x + a[n]; } #define MaxN 50 void main(){... printf("%g\n", p(x, n, a)); return; }
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n float p(float x, int n, float a[ ]) { if (n==0){ return a[0]; }else{ return p(x, n-1, a)*x + a[n]; } #define MaxN 50 void main(){... printf("%g\n", p(x, n, a)); return; } 2x 2 + 3x + 4; x=5 x=5; n=2; a= IP= ret= a[i]i
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n float p(float x, int n, float a[ ]) { if (n==0){ return a[0]; }else{ return p(x, n-1, a)*x + a[n]; } #define MaxN 50 void main(){... printf("%g\n", p(x, n, a)); return; } 2x 2 + 3x + 4; x=5 x=5; n=2; a= IP= ret= a[i]i x=5; n=1; a= IP= ret=
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n float p(float x, int n, float a[ ]) { if (n==0){ return a[0]; }else{ return p(x, n-1, a)*x + a[n]; } #define MaxN 50 void main(){... printf("%g\n", p(x, n, a)); return; } 2x 2 + 3x + 4; x=5 x=5; n=2; a= IP= ret= a[i]i x=5; n=1; a= IP= ret= x=5; n=0; a= IP= ret=
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n float p(float x, int n, float a[ ]) { if (n==0){ return a[0]; }else{ return p(x, n-1, a)*x + a[n]; } #define MaxN 50 void main(){... printf("%g\n", p(x, n, a)); return; } 2x 2 + 3x + 4; x=5 x=5; n=2; a= IP= ret= a[i]i x=5; n=1; a= IP= ret= 2
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n float p(float x, int n, float a[ ]) { if (n==0){ return a[0]; }else{ return p(x, n-1, a)*x + a[n]; } #define MaxN 50 void main(){... printf("%g\n", p(x, n, a)); return; } 2x 2 + 3x + 4; x=5 x=5; n=2; a= IP= ret= a[i]i
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a 0 x n + a 1 x n a n-1 x 1 + a n float p(float x, int n, float a[ ]) { if (n==0){ return a[0]; }else{ return p(x, n-1, a)*x + a[n]; } #define MaxN 50 void main(){... printf("%g\n", p(x, n, a)); return; } 2x 2 + 3x + 4; x=5 69 a[i]i
J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera 2x 2 + 3x + 4; x=5 p(x,n)=a 0 x n + a 1 x n void main(){ float x; // Zmienna x int n; // Stopien wielomianu float a[MaxN+1]; // Wspolczynniki wielomianu int i; // Zmienna robocza scanf("%g %d", &x, &n); for(i=0; i<=n; i++){ scanf("%g", &a[i]); } printf("p(x)= %gx^%d", a[0], n); for(i=1; i<=n; i++){ printf(" + %gx^%d", a[i], n-i); } printf("\n"); printf("p(%g)= %g\n", x, p(x, n, a)); return; }
J.Nawrocki, Metody numeryczne Podsumowanie Liczby rzeczywiste są reprezentowane za pomocą cechy i mantysy. Funkcje matematyczne takie jak e x, sin(x), stała itp. oblicza się za pomocą operacji mnożenia, dodawania, odejmowania i dzielenia. Bardzo wygodną techniką programowania jest rekursja, czyli wywoływanie funkcji przez nią samą (patrze wielomian). Wreszcie!