Metody numeryczne w inżynierii
Sprawozdanie z laboratorium
nr 1-błędy w obliczeniach numerycznych
Dominika Szczęch
Paweł Dukat
Poniedziałek godzina 14.00-16.00
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 wartości wielomianu
m-plik:
function[war]=wielomian(A,x)
war=0;
n=length(A);
for i=1:n
war=war+A(i)*x^(n-i);
end
Zadanie 1b: Obliczanie wartości wielomianu z zastosowaniem schematu Hornera
m-plik:
function[war]=horner(A,x)
war=0;
n=length(A)-1;
for i=1:n
war=(war+A(i))*x;
end
war=war+A(n+1);
Obliczanie wartości wielomianu za pomocą stworzonych funkcji i narzędzi Matlaba
Wielomian:
m-plik:
function [w]=funkcja(x)
w=(x-1)^10;
Program obliczający wartości wielomianu różnym metodami:
m-plik:
A=[1 -10 45 -120 210 -252 210 -120 45 -10 1]
x=linspace(0.95, 1.05, 100)
for i=1:100
wart1(i)=funkcja(x(i));
wart2(i)=polyval(A,x(i));
wart3(i)=horner(A,x(i));
wart4(i)=wielomian(A,x(i));
end
plot(x,wart1,'*',x,wart2,'*',x,wart3,'*',x,wart4,'*')
Wykresy wartości dla funkcji (x-1)^10:
Legenda:
Kolor niebieski-wykres funkcji (x-1)^10
Kolor czerwony- wartość policzona bezpośrednio poprzez wstawienie X
Kolor błękitny- wartość policzona za pomocą polecenia polyval oraz za pomocą schematu Hornera
Wnioski:
Ćwiczenie 1 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.
Na podstawie wykresu można stwierdzić, że wbudowana funkcja Matlab'a oparta jest na schemacie Hornera gdyż ich wykresy się pokrywają.
Zadanie2: Obliczanie przybliżonej wartości pochodnej przy wykorzystaniu wzoru na różnicę progresywną oraz centralną.
Sprawdzana funkcja:10^x
Zadanie2a:Różnica progresywna:
m-plik:
function[war]=roznicaprog(x,h)
war=(10^(x+h)-10^x)/h
Zadanie2b:Różnica centralna:
m-plik:
function[war]=roznicacentralna(x,h)
war=(10^(x+h)-10^(x-h)/(2*h))
Zadanie2c:Obliczanie błędów całkowitych wyznaczonych przybliżeń oraz błędy względne różnicy centralnej i progresywnej.
m-plik:
h0 = 1; %krok podstawowy
x0 = 0.4; %wartość początkowa
poch1 = '10^x*log(10)';
poch2 = '(10^x*log(10)*log(10))+(0.1*10^x)';
poch3 = '(10^x*log(10)*log(10))+(0.1*(10^x)*log(10))+(0.1*(10^x)*log(10))
+(0.1*(10^x)*log(10))';
wpoch1 = eval(poch1);
wpoch2 = eval(poch2);
wpoch3 = eval(poch3);
for i=1:70
H(i) = h0*2^(-(i-1));
Rc(i) = roznicacentralna(x0,H(i));
Rp(i) = roznicaprog(x0,H(i));
BwRc(i) = (Rc(i)-wpoch1)/wpoch1; %błąd różnicy centralnej
BwRp(i) = (Rp(i)-wpoch1)/wpoch1; %błąd różnicy progresywnej
BodcRc(i) = ((-1/6)*(H(i))^2 * wpoch3)/wpoch1; %błąd odcięcia Rc
BodcRp(i) = ((1/2)*H(i) * wpoch2) / wpoch1; %błąd odcięcia Rp
end
loglog(H, abs(BwRc), H, abs(BwRp), H, abs(BodcRc), H, abs(BodcRp))
Wykresy błędów:
Legenda:
Kolor niebieski-błąd różnicy centralnej
Kolor zielony- błąd różnicy progresywnej
Kolor błękitny-błąd odcięcia różnicy progresywnej
Kolor purpurowy-błąd odcięcia różnicy centralnej
Wnioski:
M-pliki z zadania 2 wyliczają błędy całkowite różnicy progresywnej i centralnej oraz szkicują odpowiednie wykresy. Naszym zadaniem było zbadanie rozkładu błędu pochodnej funkcji 10 do potęgi x dla różnych wartości h (wyliczonych ze wzoru: H(i) = h0*2^(-(i-1))).