Obliczenia numeryczne. Całkowanie
W pracach naukowców, konstruktorów i technologów często występuje konieczność obliczania wielu wielkości za pomocą skomplikowanych zależności. Tzw. obliczenia numeryczne polegały będą na obliczaniu wielkości zdefiniowanych za pomocą zależności matematycznych przy pomocy komputera. Problemy numeryczne można rozwiązywać różnymi metodami. Stosując różne algorytmy można obliczać te zależności szybciej lub wolniej i dawać mogą one wyniki mniej lub bardziej dokładne. Nie ma problemu jeśli posługujemy się liczbami całkowitymi, które w komputerze pamiętane są dokładnie. Dużą niedogodnością natomiast jest sposób pamiętania liczb rzeczywistych, które pamiętane są tylko na 6 bajtach i dlatego niedokładnie (jak np. zapamiętać liczbę pi ?). Liczby rzeczywiste po prostu zaokrągla się i pamiętane są z określoną dokładnością, a to powoduje błędy przy dokładnych obliczeniach. Innym problemem jest kumulowanie błędów. Przy wielokrotnym powtarzaniu tych samych operacji na liczbach zmiennoprzecinkowych (rzeczywistych), zwłaszcza przy dodawaniu i odejmowaniu, sumowanie błędów powoduje zniekształcanie wyników obliczeń. Przedstawia to poniższy program:
suma:=0; r:=1.1; for i:= 1 to ile do suma:=suma+r; writeln(suma/ile);
Zsumowanie dużą ilość razy tej samej liczby rzeczywistej (1,1) i podzielenie jej przez ilość sumować powinno teoretycznie dać tą samą liczbę. Kumulowanie się błędów powstałych z zaokrąglania liczb rzeczywistych powoduje, że wyniki przy dużych ilościach są różne. Dla r=1,1 i ile=10 wynik wynosi 1,1 dla ile=1000 wynik wynosi 1,0999999 !
Całkowanie
numeryczne
|
program CalkowanieTrapezowe; function trapez(a,b,h:real):real; begin trapez:=(a+b)*h/2; end; function funkcja(x:real):real; begin funkcja:=x; end; function calka(poc,kon:real;ile:longint):real; var xpoc, xkon, ypoc, ykon, pole, wys:real; i:longint; begin pole:=0; wys:=(kon-poc)/ile; for i:=1 to ile do begin xpoc:=poc+(i-1)*wys; ypoc:=funkcja(xpoc); xkon:=xpoc+wys; ykon:=funkcja(xkon); pole:=pole+trapez(ypoc,ykon,wys); end; calka:=pole; end; var p,k:real; i:longint; begin writeln('Obliczamy pole całki'); write('Podaj początek :'); readln(p); write('Podaj koniec :'); readln(k); write('Ile trapezów:'); readln(i); writeln('Pole całki :',calka(p,k,i):0:5); readln; end.