Slajdy

advertisement
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 = s2cm
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
Download