Artykuł pobrano ze strony eioba.pl Całkowanie numeryczne - metoda prostokątów W metodzie prostokątów korzystamy z definicji całki oznaczonej Riemanna, w której wartość całki interpretowana jest jako suma pól obszarów pod wykresem krzywej w zadanym przedziale całkowania <x p,x k >. Sumę tę przybliżamy przy pomocy sumy pól odpowiednio dobranych prostokątów. Sposób postępowania jest następujący: Przedział całkowania <x p,x k > dzielimy na n równo odległych punktów x 1,x 2,...,x n. Punkty te wyznaczamy w prosty sposób wg wzoru: dla i = 1,2,...,n x i = x p + i (x k - x p ) n Obliczamy odległość między dwoma sąsiednimi punktami - będzie to podstawa każdego prostokąta: dx = x k - x p n Dla każdego wyznaczonego w ten sposób punktu obliczamy wartość funkcji f(x) w tym punkcie: f i = f(x i ), dla i = 1,2,...,n Obliczamy sumę iloczynów wyznaczonych wartości funkcji przez odległość dx między dwoma sąsiednimi punktami - da to sumę pól poszczególnych prostokątów ograniczonych wykresem funkcji: S = f 1 dx + f 2 dx +... + f n dx a po wyprowadzeniu wspólnego czynnika przed nawias: S = dx (f 1 + f 2 +... + f n )
Otrzymana suma jest przybliżoną wartością całki oznaczonej funkcji f(x) w przedziale <x p,x k >. Obliczymy ręcznie przybliżoną wartość całki oznaczonej z funkcji f(x) = sin(x) w przedziale <0,π>. Przedział podzielimy na n = 4 punkty: Odległość między dwoma sąsiednimi punktami wynosi: Dla każdego z wyznaczonych punktów obliczamy wartość funkcji f(x) = sin(x): Obliczamy sumę pól prostokątów: S = dx (f 1 + f 2 + f 3 + f 4 ) S = 0,7854 (0,7071 + 1,000 + 0,7071 + 0,0000) S = 0,7854 2,4142 S = 1,8961 Dokładna wartość takiej całki oznaczonej wynosi wg tablic: Zatem popełniliśmy błąd równy: 2-1,8961 = 0,1039, co stanowi nieco ponad 5% wartości dokładnej. W sumie nie jest to zły wynik zważywszy na ilość wykonanych przez nas rachunków. Jeśli chcemy zwiększyć dokładność, to musimy zsumować więcej prostokątów, ale to zostawimy już komputerom.
Dane wejściowe x p -początek przedziału całkowania, x p R x k -koniec przedziału całkowania, x k R n -liczba punktów podziałowych, n N f(x)-funkcja rzeczywista, której całkę liczymy Dane wyjściowe Wartość całki oznaczonej funkcji f(x) w przedziale <x p,x k >. Wynik jest liczbą rzeczywistą. Zmienne pomocnicze s -suma wysokości prostokątów, którą później zamieniamy w wartość całki, s dx-odległość między dwoma sąsiednimi punktami podziałowymi, dx R i -licznik punktów podziałowych, i N R krok 1:Czytaj x p x k krok 2:s x krok k - x p 3:dx n krok 4:Dla i = 1,2,...,n, s s + f(x p + i dx) krok 5:s s dx krok 6:Pisz s i zakończ algorytm Po odczytaniu informacji o krańcach x p i x k przedziału całkowania ustawiamy sumę s na 0, obliczamy odległość dx pomiędzy sąsiednimi punktami podziałowymi i ustawiamy ich licznik na 1. Rozpoczynamy pętlę iteracyjną, która wykona się n-razy. Wewnątrz pętli obliczamy i-ty punkt podziałowy oraz wartość funkcji w tym punkcie, którą dodajemy do sumy s. Po zakończeniu pętli sumę s musimy jeszcze pomnożyć przez szerokość podstawy prostokątów, czyli odległość dx Po tej operacji s zawiera wartość przybliżoną całki. Zwracamy ją użytkownikowi i kończymy algorytm. Poniższe, przykładowe programy są praktyczną realizacją omawianego w tym rozdziale algorytmu. Zapewne można je napisać bardziej efektywnie. To już twoje zadanie. Dokładny opis stosowanych środowisk programowania znajdziesz we wstępie. Programy przed opublikowaniem w serwisie edukacyjnym zostały dokładnie przetestowane. Jeśli jednak znajdziesz jakąś usterkę (co zawsze może się zdarzyć), to prześlij o niej informację do autora. Pozwoli to ulepszyć nasze artykuły. Będziemy Ci za to wdzięczni.
Prezentowane poniżej programy wyliczają całkę oznaczoną funkcji f(x) = x 2 + 2x. Przedział całkowania jest dzielony na n=1000 punktów. W przedziale <0,1> całka oznaczona ma wartość dokładną równą 4 / 3 = 1.3333... Wydruk z uruchomionego programu Obliczanie całki oznaczonej za pomocą metody prostokątów ---------------------------- (C)2006 mgr J.Wałaszek I LO f(x) = x * x + 2 * x Podaj początek przedziału całkowania xp = 0 Podaj koniec przedziału całkowania xk = 1 Wartość całki wynosi : 1,335 KONIEC. Naciśnij dowolny klawisz... Microsoft Visual Basic 2005 Express Edition
Borland Delphi 7.0 Personal Edition //** Obliczanie całki oznaczonej metodą prostokątów ** //** ---------------------------------------------- ** //** (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie ** program int_rect; {$APPTYPE CONSOLE} //** Tutaj definiujemy funkcję ** function f(x : real) : real; begin f := x * x + 2 * x; end; //******************** //** Program główny ** //******************** const N = 1000; //liczba punktów/prostokątów podziałowych var xp,xk,s,dx : real; i : integer; begin writeln('obliczanie calki oznaczonej'); writeln('za pomoca metody prostokatow'); writeln('----------------------------'); writeln('(c)2004 mgr J.Walaszek I LO'); writeln('f(x) = x * x + 2 * x'); writeln('podaj poczatek przedzialu calkowania'); write('xp = '); readln(xp); writeln('podaj koniec przedzialu calkowania'); write('xk = '); readln(xk); s := ; dx := (xk - xp) / N; for i := 1 to N do s := s + f(xp + i * dx); s := s * dx; writeln('wartosc calki wynosi : ',s:8:3); writeln('nacisnij klawisz Enter...'); readln; end.
Borland C++ Builder 6.0 Personal Edition //** Obliczanie całki oznaczonej metodą prostokątów ** //** ---------------------------------------------- ** //** (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie ** #include <iomanip> #include <iostream> using namespace std; //** Tutaj definiujemy funkcję ** double f(double x) { return(x * x + 2 * x); } //******************** //** Program główny ** //******************** main() { const int N = 1000; //liczba punktów/prostokątów podziałowych double xp,xk,s,dx; int i; char c[1]; cout.precision(3); // 3 cyfry po przecinku cout.setf(ios::fixed); // format stałoprzecinkowy cout << "Obliczanie calki oznaczonej\n" "za pomoca metody prostokatow\n" "----------------------------\n" "(C)2004 mgr J.Walaszek I LO\n\n" "f(x) = x * x + 2 * x\n\n" "Podaj poczatek przedzialu calkowania\n\n" "xp = "; cin >> xp; cout << "\npodaj koniec przedzialu calkowania\n\n" "xk = "; cin >> xk; cout << endl; s = ; dx = (xk - xp) / N; for(i = 1; i <= N; i++) s += f(xp + i * dx); s *= dx; cout << "Wartosc calki wynosi : " << setw(8) << s << "\n\nnacisnij klawisz Enter"; cin.getline(c, 1); cin.getline(c, 1); }
Microsoft Visual Basic 2005 Express Edition '**************************************************** '** Obliczanie całki oznaczonej metodą prostokątów ** '** ---------------------------------------------- ** '** (C)2006 mgr Jerzy Wałaszek I LO w Tarnowie ** '**************************************************** Module Module1 '******************************* '** Tutaj definiujemy funkcję ** '******************************* Public Function f(byval x As Double) As Double Return x * x + 2 * x End Function '******************** '** Program główny ** '******************** Sub Main() Const N = 1000 'liczba punktów/prostokątów podziałowych Dim xp, xk, s, dx As Double Dim i As Integer Console.WriteLine("Obliczanie całki oznaczonej") Console.WriteLine("za pomocą metody prostokątów") Console.WriteLine("----------------------------") Console.WriteLine("(C)2006 mgr J.Wałaszek I LO") Console.WriteLine("f(x) = x * x + 2 * x") Console.WriteLine("Podaj początek przedziału całkowania") Console.Write("xp = ") : xp = Val(Console.ReadLine()) Console.WriteLine("Podaj koniec przedziału całkowania") Console.Write("xk = ") : xk = Val(Console.ReadLine()) s = dx = (xk - xp) / N For i = 1 To N : s += f(xp + i * dx) : Next s *= dx Console.WriteLine("Wartość całki wynosi : {0,8:F3}", s) ' Gotowe Console.WriteLine("KONIEC. Naciśnij dowolny klawisz...") Console.ReadLine() End Sub End Module
Python # -*- coding: cp1250 -*- #**************************************************** #** Obliczanie całki oznaczonej metodą prostokątów ** #** ---------------------------------------------- ** #** (C)2005 mgr Jerzy Wałaszek I LO w Tarnowie ** #**************************************************** #******************************* #** Tutaj definiujemy funkcję ** #******************************* def f(x): return x * x + 2 * x; #******************** #** Program główny ** #******************** N = 1000 #liczba punktów/prostokątów podziałowych "Obliczanie calki oznaczonej" "za pomoca metody prostokatów" "----------------------------" "(C)2005 mgr J.Walaszek I LO" "f(x) = x * x + 2 * x" "Podaj poczatek przedzialu calkowania" xp = float(raw_input("xp = ")) "Podaj koniec przedzialu calkowania" xk = float(raw_input("xk = ")) s = 0. dx = (xk - xp) / N for i in range(1, N + 1): s += f(xp + i * dx) s *= dx "Wartosc calki wynosi : %8.3f" % s raw_input("koniec - nacisnij klawisz Enter...")
JavaScript <html> <head> <title>całkowanie numeryczne metodą prostokątów</title> </head> <body> <script language="javascript"> //** Obliczanie całki oznaczonej metodą prostokątów ** //** ---------------------------------------------- ** //** (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie ** //** Tutaj definiujemy funkcję ** function f(x) { return(x * x + 2 * x); } function js_rectangle() { var N = 1000; //liczba punktów/prostokątów podziałowych var xp,xk,s,dx,i,t; xp = parsefloat(document.frm_rectangle.xp_inp.value); xk = parsefloat(document.frm_rectangle.xk_inp.value); if(isnan(xp) isnan(xk)) t = "<font color=red><b>popraw dane wejściowe!</b></font>"; else { s = ; dx = (xk - xp) / N; for(i = 1; i <= N; i++) s += f(xp + i * dx); s *= dx; t = Math.floor(s * 1000) / 1000; }; document.getelementbyid("t_out").innerhtml = t; } </script> <form method="post" name="frm_rectangle" style="border: 2px solid #FF9900; padding-left: 4px; padding-right: 4px; padding-top: 1px; padding-bottom: 1px; background-color: #FFFFCC"> <h2 style="text-align: center"> Obliczanie całki oznaczonej<br> za pomocą metody prostokątów </h2> <hr> <h4 style="text-align: center"> (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie </h4> <h3 style="text-align: center"> Całkowana funkcja: </h3> <h4 style="text-align: center"> <i>f(x) = x<sup>2</sup> + 2x</i> </h4> <p style="text-align: center"> Tutaj określ przedział całkowania </p> <p style="text-align: center"> Początek <i>x<sub>p</sub></i> = <input type="text" name="xp_inp" size="20" value="0"> i koniec <i>x<sub>k</sub> </i>= <input type="text" name="xk_inp" size="20" value="1"> </p> <p style="text-align: center"> <input onclick="js_rectangle();" type="button" value="oblicz całkę" name="b1"> </p> <h4 style="text-align: center"> Wartość całki wynosi </h4> <p id="t_out" style="text-align: center">...</p> </form> </body> </html> Dokument ten rozpowszechniany jest zgodnie z zasadami licencji GNU Free Documentation License.
Autor: mgr Jerzy Wałaszek Przedruk ze strony: http://www.i-lo.tarnow.pl/edu/inf/alg/calki/index.html Artykuł pobrano ze strony eioba.pl