data 19.03.2012 godzina 14:15
rok akademicki: 2011/2012 semestr: IV
grupa: 2 - X2
SPRAWOZDANIE Z LABORATORIUM
METOD NUMERYCZNYCH
ĆWICZENIE NR 1
TEMAT: Przenoszenie się błędów w obliczeniach numerycznych
Sebastian Woźniak - 164496
Marcin Stachowicz - 164460
Listingi M-Funkcji:
Plik główny porównujący wszystkie używane metody i obrazujący wyniki na wykresie
A = [1 -10 45 -120 210 -252 210 -120 45 -10 1];
x = linspace(0.95, 1.05, 100);
for i=1:100
w1(i) = horner(A, x(i));
w2(i) = horner_m2(A, x(i));
w3(i) = polyval(A, x(i));
w4(i) = funkcja_zwykla(x(i));
end
plot(x, w1, x, w2, x, w3, x, w4);
xlabel('x');
ylabel('w');
Plik z obliczonymi pochodnymi funkcji cos(x), obliczajacy różnice centralną i progresywną, ich błędy względne i odniesień oraz przedstawiający wykresy poniższych wielkości w skali logarytmicznej
h = 1;
x = 1;
p1 = '-sin(x)';
p2 = '-cos(x)';
p3 = 'sin(x)';
w1 = eval(p1);
w2 = eval(p2);
w3 = eval(p3);
for i=1:70
H(i) = h*2^(-(i-1));
Rc(i) = centralna(x, H(i));
Rp(i) = progresywna(x, H(i));
Bw_Rc(i) = (Rc(i)-w1)/w1;
Bw_Rp(i) = (Rp(i)-w1)/w1;
Bo_Rc(i) = ((-1/6)*(H(i))^2 * w3)/w1;
Bo_Rp(i) = ((1/2)*H(i) * w2) / w1;
end
loglog(H, abs(Bw_Rc), H, abs(Bw_Rp), H, abs(Bo_Rc), H, abs(Bo_Rp))
xlabel('log(h)');
ylabel('log(B)');
Wzór liczący dziesiątą potęgę wielomianu x - 1
function [w] = funkcja_zwykla(x)
w = (x-1)^10;
Plik ze schematem Hornera - metoda 1
function [w] = horner(A, x)
w=0;
n=length(A);
for i=1:n
w=w+A(i)*x^(n-i);
end
Plik ze schematem Hornera - metoda 2:
function [w] = horner_m2(A, x)
w=0;
n=length(A)-1;
for i=1:n
w = w+A(i);
w = w*x;
end
w = w + A(n+1);
Plik obliczający różnicę centralną funkcji cos(x):
function[y] = centralna(x, h)
y=(cos(x+h) - cos(x-h))/(2*h)
Plik obliczający różnicę progresywną:
function[y] = progresywna(x, h)
y = (cos(x + h) - cos(x))/h
Listingi M-Funkcji:
Wykres pliku głównego - wykresy poszczególnych metod:
Wykres błędów w skali logarytmicznej:
Krok optymalny dla różnicy centralnej (czerwony wykres): 10-5
Krok optymalny dla różnicy progresywnej (czerwony wykres): 10-8
Pliki z różnicami:
- różnica centralna:
function[y] = centralna(x, h)
y=(cos(x+h) - cos(x-h))/(2*h)
- różnica progresywna:
function[y] = progresywna(x, h)
y = (cos(x + h) - cos(x))/h
Wnioski:
Dla zadania 1 zastosowaliśmy 2 sposoby obliczenia wielomianu: wzór standardowy i schemat Hornera. W obu sposobach wystąpiły duże zniekształcenia wyników, lecz przy zastosowaniu schematu Hornera wystąpił mniejszy rozrzut wyników.
Błąd względny zmienia się wraz ze zmianą długości kroku. Lepsze wyniki daje różnica centralna, ponieważ błędy odcięcia maleją wraz z h2