POLITECHNIKA ŚLĄSKA GLIWICE 11.10.04
WYDZIAŁ: AEiI
KIERUNEK: AUTOMATYKA I ROBOTYKA SEM.3
Laboratorium metod numerycznych
Temat: Metody numerycznego obliczania wartości funkcji
GR 4
Sekcja 2
Batrosz Sztajer
Rafał Selega
..
1. CEL ĆWICZENIA.
Celem ćwiczenia było napisanie trzech programów dokonujących :
Obliczania wartości wielomianu za pomocą schematu Hornera i wzoru ogólnego.
Wyznaczania przedziału, w którym zawarte są pierwiastki rzeczywiste wielomianu.
Obliczenia wartości funkcji cos(x) dla zadanego x, wykorzystując rozwinięcie w szereg Taylora przy określonej dokładności obliczeń.
Należało przy tym dołączyć do każdego programu przykłady i wyniki.
2. OBLICZANIA WARTOŚCI WIELOMIANU ZA POMOCĄ SCHEMATU HORNERA.
Kod źródłowy programu :
program lab1_1;
uses crt;
var a:array[0..100] of real;
n,i:integer;
x0,wh,wo:real;
procedure wprowadz;
begin
for i:=n downto 0 do
begin
write('Podaj wspolczynnik a[',i,']: ');
readln(a[i]);
end;
end;
procedure horner;
var b:array[0..100] of real;
begin
b[n]:=a[n];
for i:=n-1 downto 0 do b[i]:=a[i]+(b[i+1]*x0);
wh:=b[0];
end;
procedure ogolny;
var j:integer;
x:real;
begin
wo:=0;
for i:=n downto 1 do
begin
x:=1;
for j:=1 to i do x:=x*x0;
wo:=wo+a[i]*x;
end;
wo:=wo+a[0];
end;
begin
clrscr;
write('Podaj rzad wielomianu (n): ');
readln(n);
write('Podaj wartosc x0: ');
readln(x0);
wprowadz;
horner;
ogolny;
writeln('wynik z obliczen schematem Hornera: ',wh:5:5);
writeln('Wynik z obliczen ogolnym sposobem: ',wo:5:5);
readkey;
end.
Przykłady własne, wyniki i wnioski:
-W(X1)=
dla X1=0.5
-W(X2)=
dla X2=3.14
-W(X3)=
dla X3=-1
|
HORNER |
WZOR OGÓLNY |
W(X1) X1=0.5 |
14.50000 |
14.50000 |
W(X2) X2=3.14 |
641.24359 |
641.24359 |
W(X3) X3=-1 |
0.00000 |
0.00000 |
Schemat Hornera znacznie zmniejsza ilość obliczeń przy wyznaczaniu wartości wielomianu w stosunku do schematu ogólnego, a błędy z tego wynikające powstają w wyniku zaokrągleń.
3. WYZNACZANIE PRZEDZIAŁU, W KTÓRYM ZAWARTE SĄ PIERWIASTKI RZECZYWISTE WIELOMIANU.
a) Kod źródłowy programu :
program lab1_2;
uses crt;
var n,i,m:integer;
a,b:array[0..100] of real;
inf,sup,x,x1,x0:real;
procedure wprowadz;
begin
for i:=n downto 0 do
begin
write('Podaj wspolczynnik a[',i,']: ');
readln(a[i]);
end;
end;
procedure horner;
begin
b[n]:=a[n];
for i:=n-1 downto 0 do b[i]:=a[i]+(b[i+1]*x);
end;
begin
clrscr;
write('Podaj rzad wielomianu (n): ');
readln(n);
wprowadz;
x0:=0;
repeat
x0:=x0+0.1;
x:=x0;
horner;
m:=0;
for i:=n downto 0 do if b[i]>=0 then inc(m);
until (m=n+1) or (x>maxint);
sup:=x;
for i:=0 to n do
begin
if (n mod 2)=1 then a[i]:=-a[i];
if (i mod 2)=1 then a[i]:=-a[i];
end;
x1:=0;
repeat
x1:=x1+0.1;
for i:=n downto 0 do
x:=x1;
horner;
m:=0;
for i:=n downto 0 do if b[i]>=0 then inc(m);
until (m=n+1) or (x>maxint);
inf:=-x;
writeln('Przedzial w ktorym znajduja sie pierw. rzecz. to [',inf:5:2,',',sup:5:2,']');
readkey;
end.
Przykłady własne i wyniki:
Wielomian |
Pierwiastki wielomianu |
Przedział wyznaczony przez program |
|
-1; -0.5; 0.5; 1 |
( -1,2; 1,2 ) |
|
-5; 0; 5; 1 |
( -5,1; 1 ) |
|
-0.4; 0; 2 |
( -0,4; 2 ) |
Program wykonywał krok dx=0.1 - dokładność przedziałów zależy od tego kroku, choć nie zawsze błędy są mniejsze bądź równe temu krokowi.
4. OBLICZENIA WARTOŚCI FUNKCJI COS(X) DLA ZADANEGO X, WYKORZYSTUJĄC ROZWINIĘCIE W SZEREG TAYLORA PRZY OKREŚLONEJ DOKŁADNOŚCI OBLICZEŃ.
Kod źródłowy programu :
program lab2_3;
uses crt;
const x0=0;
var x,e,fx,fx1,wyn_pot,reszta,wyn_sil:extended;
i,n,m:longint;
procedure potega;
var j:integer;
begin
wyn_pot:=1;
if n=0 then wyn_pot:=1;
if n>0 then for j:=1 to n do wyn_pot:=(wyn_pot)*(x-x0);
end;
procedure silnia;
var j:integer;
begin
wyn_sil:=1;
if n=0 then wyn_sil:=1 else for j:=1 to n do wyn_sil:=wyn_sil*j;
end;
begin
clrscr;
writeln;
write('Podaj wartosc x: ');
readln(x);
x:=x*pi/180;
write('Podaj dokladnosc: ');
readln(e);
fx1:=0;
i:=0;
repeat;
n:=i*2;
potega;
silnia;
if (i mod 2)=1 then fx:=-wyn_pot/wyn_sil else fx:=wyn_pot/wyn_sil;
fx1:=fx1+fx;
n:=(i*2)+1;
potega;
silnia;
reszta:=(wyn_pot)/(wyn_sil);
inc(i);
until abs(reszta)<e;
writeln('Wartosc cos(x) wynosi: ',fx1:5:8);
writeln('Ilosc rozwiniec: ',i-1);
writeln('Dla porownania wynik za pomoca polecenia wynosi: ',cos(x):5:8);
readkey;
end.
Przykłady własne, wyniki i wnioski:
|
X1=0.2 |
X2=1 |
X3=20 |
X4=100 |
E1=0.001 |
N=1 |
N=1 |
N=2 |
N=4 |
E2=0.0000001 |
N=1 |
N=2 |
N=4 |
N=7 |
Porównanie wyników rozwinięcia Taylora z wartością funkcji cos(x):
|
TAYLOR |
cos |
X1=0.2 E=0.001 |
0.99999391 |
0.99999391 |
X1=0.2 E=0.0000001 |
0.99999391 |
0.99999391 |
X2=1 E=0.001 |
0.99984769 |
0.99984770 |
X2=1 E=0.0000001 |
0.99984770 |
0.99984770 |
X3=20 E=0.001 |
0.93969513 |
0.9396262 |
X3=20 E=0.0000001 |
0.93969262 |
0.9396262 |
X4=100 E=0.001 |
-0.17357754 |
-0.17364818 |
X4=100 E=0.0000001 |
-0.17364818 |
-0.17364818 |
N-ilość wyrazów w rozwinięciu szeregu Taylora
X-punkt w którym liczymy wartość cos(x)
E-dokładność
Na ilość wyrazów zdecydowany wpływ ma wartość X (ilość wyrazów rośnie wraz z oddalaniem się od osi współrzędnych) oraz zadana dokładność.
Błędy są zdecydowanie mniejsze od zadanych dokładności.