Wprowadzenie do informatyki Wykład 8 Metody numeryczne [email protected] http://www.cs.put.poznan.pl/jnawrocki/wdi/ Copyright, 2007 © Jerzy R. Nawrocki Plan wykładu • Reprezentacja liczb rzeczywistych • Obliczanie ex • Obliczanie wartości wielomianu J.Nawrocki, Metody numeryczne Reprezentacja liczb rzeczywistych J.Nawrocki, Metody numeryczne Reprezentacja liczb rzeczywistych x 0: x = s2cm s= +1 lub –1 (znak liczby) c= cecha (liczba całkowita) m= mantysa: liczba rzeczywista [1/2, 1) J.Nawrocki, Metody numeryczne Reprezentacja liczb rzeczywistych 0,25 = 1/4 20 = 1,5 = 3/2 20 = -3 = -1 3 20 = J.Nawrocki, Metody numeryczne Reprezentacja liczb rzeczywistych Ciąg cyfr binarnych b1b2b3..bt reprezentuje mantysę m = b1/2 + b2/4 + b3/8 + .. + bt/2t m=4/8 na 4 bitach: 1000 m=5/8 na 4 bitach: m=6/8 na 4 bitach: J.Nawrocki, Metody numeryczne Plan wykładu • Reprezentacja liczb rzeczywistych • Obliczanie ex • Obliczanie wartości wielomianu J.Nawrocki, Metody numeryczne Wzór Taylora 1703 – 1709: Studia w Cambridge 1712: Członek Royal Society 1715: Wzór Taylora (szereg Taylora) (bez dowodu) Brook Taylor 1685 - 1731 J.Nawrocki, Metody numeryczne Wzór Taylora ~ Dla x0 = 0 dostajemy: ~ N • Pochodna ex = ex • e0 = 1 Brook Taylor 1685 - 1731 ex x0/0! + x1/1! + x2/2! + x3/3! + .. = = 1 + x / 1! + x2/2! + x3/3! + .. J.Nawrocki, Metody numeryczne Obliczanie ex ex = 1 + x/1! + x2/2! + x3/3! + x4/4! + ... e(1) = 2,71.. e(0) = 1 Wyraz = Licznik 1 x x2 x3 Mianownik 1 1! 2! 3! J.Nawrocki, Metody numeryczne Obliczanie ex ex = 1 + x/1! + x2/2! + x3/3! + x4/4! + ... e(1) = 2,71.. e(0) = 1 0 void main(){ float x; // Argument e(x) scanf("%g", &x); return; } J.Nawrocki, Metody numeryczne Obliczanie ex ex = 1 + x/1! + x2/2! + x3/3! + x4/4! + ... e(1) = 2,71.. e(0) = 1 1 1 *x *1 x 1! float e(float x){ float suma=0; *x *2 x2 2! *x *3 x3 3! licznik = mianownik = 1.0; for (. . .){ suma += licznik *= mianownik *= } return suma; } J.Nawrocki, Metody numeryczne Plan wykładu • Reprezentacja liczb rzeczywistych • Obliczanie ex • Obliczanie wartości wielomianu J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a0xn + a1xn-1 + .. + an-1x1 + an p(x,0) = a0 p(x,1) = a0x + a1 p(x,2) = a0x2 + a1x + a2 x = 2; a0 = 1; a1 = 2; a2 = 3 J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a0xn + a1xn-1 + .. + an-1x1 + an p(x,0) = a0 p(x,1) = a0x + a1 = p(x, 0)x + a1 p(x,2) = a0x2 + a1x + a2 p(x,3) = a0x3 + a1x2 + a2x + a3 p(x,4) = a0x4 + a1x3 + a2x2 + a3x + a4 J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a0xn + a1xn-1 + .. + an-1x1 + an p(x,0) = a0 p(x,1) = a0x + a1 = p(x, 0)x + a1 p(x,2) = a0x2 + a1x + a2 = (a0x1 + a1)x + a2= p(x,1)x+a2 p(x,3) = a0x3 + a1x2 + a2x + a3 p(x,4) = a0x4 + a1x3 + a2x2 + a3x + a4 J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a0xn + a1xn-1 + .. + an-1x1 + an p(x,0) = a0 p(x,1) = a0x + a1 = p(x, 0)x + a1 p(x,2) = a0x2 + a1x + a2 = (a0x1 + a1)x + a2= p(x,1)x+a2 p(x,3) = a0x3 + a1x2 + a2x + a3 = = (a0x2 + a1x1 + a2)x + a3 = p(x,2)x + a3 p(x,4) = a0x4 + a1x3 + a2x2 + a3x + a4 = = (a0x3 + a1x2 + a2x1 + a3)x + a4 = p(x,3)x + a4 p(x,n) = p(x, n-1)x + an J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a0xn + a1xn-1 + .. + an-1x1 + an p(x,0) = a0 p(x,n) = p(x, n-1)x + an Nagłówek p 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; } Wywołanie p J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera p(x,n) = a0xn + a1xn-1 + .. + an-1x1 + an p(x,0) = a0 p(x,n) = p(x, n-1)x + an float p(float x, int n, float a[ ]) { if (n==0){ }else{ } } #define MaxN 50 void main(){ ... printf("%g\n", p(x, n, a)); return; J.Nawrocki, Metody numeryczne } Obliczanie wielomianu – schemat Hornera p(x,n) = a0xn + a1xn-1 + .. + an-1x1 + an 2x2 + 3x + 4; x=5 a[i] i 4 2 2 0 3 1 x=5; n=1; a= IP= ret= x=5; n=2; a= IP= ret= float p(float x, int n, float a[ ]) { if (n==0){ return a[0]; }else{ 13 n-1, a)*x + a[n]; return p(x, } } #define MaxN 50 void main(){ ... printf("%g\n", p(x, n, a)); return; } J.Nawrocki, Metody numeryczne Obliczanie wielomianu – schemat Hornera void main(){ + +.. float x; // Zmienna x int n; // Stopien wielomianu 2x2 + 3x + 4; x=5 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 p(x,n)=a0xn a1xn-1 Podsumowanie Wreszcie! • Liczby rzeczywiste są reprezentowane za pomocą cechy i mantysy. • Funkcje matematyczne takie jak ex, 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). J.Nawrocki, Metody numeryczne