Data wykonania ćwiczenia: 23.02.2010 r.
Grupa: 4D3
YYY - ZZZ
XXX - ZZZ
SPRAWOZDANIE
Ćw. 2 - Błędy w obliczeniach numerycznych
Wprowadzenie:
Na wstępie należałoby zaznaczyć, że obliczenia numeryczne prowadzone na komputerze obarczone są z reguły błędem. Sumaryczny błąd złożony jest z takich czynników jak np.: błędy wejściowe, błędy metody, błędy zaokrągleń, błędy obcięcia czy błędy wynikające z ograniczonych możliwości komputera (np. reprezentacja liczb). Zadaniem użytkownika jest zminimalizowanie sumarycznego błędu powstającego podczas rozpatrywania danego zagadnienia. Wykonywane ćwiczenie ma na celu uświadomienie faktu istnienia niedokładności wykonywania obliczeń przy użyciu komputera.
Przebieg ćwiczenia:
Zadanie 1a: obliczanie pierwiastków równania kwadratowego
m-plik:
function [x1,x2] = zad1(a,b,c);
delta = (b^2) - (4 * a * c);
if delta>=0
x1=(-b + sqrt(delta)) / (2 * a)
x2=(-b - sqrt(delta)) / (2 * a)
else
display('Delta mniejsza od zera - brak pierwiastków rzeczywistych')
end
Zadanie 1b: obliczanie pierwiastków równania kwadratowego za pomocą wzorów Viete'a
m-plik:
function [x1,x2] = vi(a,b,c)
zad1(1,b/a,c/a)
Powyższe m-pliki obliczają pierwiastki równania kwadratowego. W przypadku 1a obliczamy deltę, a następnie korzystając ze wzorów na pierwiastki równania kwadratowego:
. Przypadek 1b korzysta ze wzorów Viete'a -
,
.
Wzory te tworzą układ równań, którego rozwiązaniem są pierwiastki równania kwadratowego (stąd też wykorzystanie m-pliku z zadania 1a).
Ćwiczenie to ma na celu sprawdzenie występowania zjawiska cyfr znaczących oraz porównanie dwóch metod wyznaczania pierwiastków równania kwadratowego.
Zadanie 4a: Obliczanie wartości wielomianu
m-plik:
function [war] = zad4a(A,x)
n = size(A, 1);
war=0;
for i=1:n
war = war + A(i)*(x^(n-i));
end
Zadanie 4b: Obliczanie wartości wielomianu z zastosowaniem schematu Hornera
m-plik:
function [war] = zad4b(A, x)
n = size(A,1);
wart = A(1);
wart = zeros(1, size(x,2));
for j=1:size(x,2)
wart(j) = A(1);
for i=2:n
wart(j) = A(i) + wart(j) * x(j);
end
end
Ćwiczenie 4 pozwala na porównanie skuteczności dwóch sposobów obliczania wartości wielomianu. Metoda pierwsza korzysta z bezpośredniego podstawienia wartości x do wzoru wielomianu, metoda druga korzysta ze schematu Hornera - metody minimalizującej liczbę mnożeń niezbędnych do otrzymania końcowego wyniku.
Metoda pierwsza wymaga n*(n+1)/2 mnożeń oraz n dodawań. Metoda druga przekształca wielomian do postaci:
Przekształcenie to redukuje liczbę niezbędnych do wykonania działań do n mnożeń oraz n dodawań, co znacząco przyspiesza proces otrzymywania wyniku.
Zadanie 5a: Obliczanie przybliżonej wartości pochodnej przy wykorzystaniu wzoru na różnicę progresywną.
m-plik:
h=ones(1,50);
for i=2:50
h(i)=h(i-1)*0.5;
end
RP=zeros(1,50);
for i=1:50
RP(i)=(sqrt(2 + h(i)) - sqrt(2)) / h(i);
end
B=zeros(1,50);
for i=1:50
B(i)=abs((1 / (2 * sqrt(2))) - RP(i));
end
BM=zeros(1,50);
for i=1:50
BM(i) = abs((-1 / (4 * sqrt(2^3))) * h(i) / 2);
end
hold off
plot(log(h),log(BM),'r');
hold on
plot(log(h),log(B),'g--');
Zadanie 5b: Obliczanie przybliżonej wartości pochodnej przy wykorzystaniu wzoru na różnicę centralną.
m-plik:
h=ones(1,50);
for i=2:50
h(i)=h(i-1)*0.5;
end
RC=zeros(1,50);
for i=1:50
RC(i)=(sqrt(2 + h(i)) - sqrt(2 - h(i)))/(2 * h(i)) ;
end
B=zeros(1,50);
for i=1:50
B(i)=abs((1/(2 * sqrt(2)))-RC(i));
end
BM=zeros(1,50);
for i=1:50
BM(i) = abs((3 / (8 * sqrt(2^5)))*h(i)^2 / 6);
end
hold off
plot(log(h),log(BM),'r');
hold on
plot(log(h),log(B),'g--');
M-pliki z zadania 5 wyliczają dodatkowo błędy całkowite, błędy odcięcia, błędy metody oraz szkicują odpowiednie wykresy. Naszym zadaniem było zbadanie rozkładu błędu pochodnej pierwiastka z 2 dla 50 różnych wartości h (wyliczonych ze wzoru: h(i)=h(i)*(0.5)^(i-1) - ciąg geometryczny). Błąd metody szacujemy korzystając ze wzoru Taylora. Do obliczenia błędu całkowitego użyliśmy wzoru na błąd bezwzględny z bardzo prostego powodu - umiemy dokładnie obliczyć wartość pochodnej dla funkcji "pierwiastek z x".
Ćw - 3
Aproksymacja i interpolacja
Zadanie 1:
m-plik:
hold off
x=0:4;
y=[0,2,3,6,10]
n=size(x,2)
p=polyfit(x,y,n-1)
xw=0:0.1:4;
yw=polyval(p,xw);
hold on
plot(x,y,'*',xw,yw,'r')
Skrypt umożliwia interpolowanie przebiegu funkcji pomiędzy danymi węzłami.
Przykładowe obliczenia:
Zadanie 1a: Obliczanie wartości wielomianu
Współczynniki dwumianu kwadratowego:
A = -12
B = 6
C = 5
Pierwiastki dwumianu kwadratowego:
X1= -0.442218655243173
X2= 0.942218655243173
W celu sprawdzenia poprawności obliczonych pierwiastków, obliczam wartość funkcji podstawiając je do równania: Y=-12x^2+6x+5:
Y1= -1.77635683940025e-015
Y2= -1.77635683940025e-015
W przypadku idealnie obliczonych pierwiastków wynik powinien być równy 0. Obliczenia są więc obarczone błędem.
Zadanie 1b: obliczanie pierwiastków równania kwadratowego za pomocą wzorów Viete'a
Współczynniki dwumianu kwadratowego:
A = -12
B = 6
C = 5
Pierwiastki dwumianu kwadratowego:
X1= -0.442218655243172
X2= 0.942218655243172
W celu sprawdzenia poprawności obliczonych pierwiastków, obliczam wartość funkcji podstawiając je do równania: Y=-12x^2+6x+5:
Y1= 1.50990331349021e-014
Y2= 1.33226762955019e-014
W przypadku idealnie obliczonych pierwiastków wynik powinien być równy 0. Obliczenia są więc obarczone błędem.
Zadanie 4:
Współczynniki wielomianu:
A4 = -2
A3 = 8
A2 = -12
A1 = 8
A0 = -2
X=0.99965 : 0.000001 : 1
Kolor zielony: wartość policzona bezpośrednio poprzez wstawienie X.
Kolor bordowy: wartość policzona z wykorzystaniem schematu Hornera.
Zadanie 5:
Wykres błędu dla różnicy centralnej:
Kolor fioletowy: błąd metody.
Kolor zielony: błąd całkowity.
Wykres błędu dla różnicy progresywnej:
Kolor fioletowy: błąd metody.
Kolor zielony: błąd całkowity.
Oszacowanie błędu minimalnego oraz optymalnego kroku h:
Różnica centralna:
h=~3.77 * 10^-6
błąd minimalny=~2.6*10^-9
Różnica progresywna:
h=~3.04*10^-8
błąd minimalny=~6.15*10^-12
Zadanie 1 (Ćwiczenie 3)
Początkowe współrzędne węzłów: (0,0), (1,2), (2,3), (3, 6), (4, 10). Wykres interpolowany (dla x=0:0.1:4) wygląda następująco:
Niebieskie gwiazdki: węzły początkowe.
Kolor czerwony: interpolowany wykres funkcji.