Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek

©2026 mgr Jerzy Wałaszek

obrazek

Metoda prostokątów

SPIS TREŚCI
Podrozdziały

Algorytm całkowania metodą prostokątów

 
obrazek

W metodzie prostokątów (ang. rectangular integration) 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 <xp,xk>. 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 <xp,xk> dzielimy na n równo odległych punktów x1,x2,...,xn. Punkty te wyznaczamy w prosty sposób wg wzoru:

dla i = 1,2,...,n:

Obliczamy odległość między dwoma sąsiednimi punktami - będzie to podstawa każdego prostokąta:

Dla każdego wyznaczonego w ten sposób punktu obliczamy wartość funkcji f(x) w tym punkcie:

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:

a po wyprowadzeniu wspólnego czynnika przed nawias:

Otrzymana suma jest przybliżoną wartością całki oznaczonej funkcji f(x) w przedziale <xp,xk>.

Przykład:

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:

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.


do podrozdziału  do strony 

Opis algorytmu

Specyfikacja problemu

Dane wejściowe

xp - początek przedziału całkowania, xp ∈ R
xk - koniec przedziału całkowania, xk ∈ R
n - liczba punktów podziałowych, n ∈ N
f (x) - funkcja rzeczywista, której całkę liczymy

Dane wyjściowe

s - przybliżona wartość całki oznaczonej funkcji f(x) w przedziale <xp,xk>, s ∈ R

Zmienne pomocnicze

dx - odległość między dwoma sąsiednimi punktami podziałowymi, dx ∈ R
i - licznik punktów podziałowych, i ∈ N

Lista kroków

K01: s ← 0
K02:
K03: Dla i = 1,2,...,n: wykonuj:
    s ← s + f(xp + i ·dx)
K04: s ← s·dx
K05: Zakończ

Schemat blokowy

obrazek

Po odczytaniu informacji o krańcach xp i xk przedziału całkowania ustawiamy sumę s na 0, obliczamy odległość dx 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.


do podrozdziału  do strony 

Przykładowe programy

Prezentowane poniżej programy wyliczają całkę oznaczoną funkcji f(x) = x2 + 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...

C++
// Obliczanie całki oznaczonej
// metodą prostokątów
//----------------------------
//(C)2004 mgr Jerzy Wałaszek

#include <iomanip>
#include <iostream>
#include <cstdlib>

using namespace std;

// Tutaj definiujemy funkcję
double f(double x)
{
  return(x * x + 2 * x);
}

// Program główny
int main()
{
  // liczba punktów
  // prostokątów podziałowych
  const int N = 1000;
  double xp,xk,s,dx;
  int i;

  // 3 cyfry po przecinku
  cout << setprecision(3)
  // format stałoprzecinkowy
       << fixed;

  cout << "Obliczanie  calki oznaczonej\n"
          "za pomoca metody prostokatow\n"
          "----------------------------\n"
          "(C)2004 mgr J.Walaszek  I LO"
          "\n\nf(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  = 0;
  dx = (xk - xp) / N;
  for(i = 1; i <= N; i++)
    s += f(xp + i * dx);
  s *= dx;
  cout << "Wartosc calki wynosi : "
       << s
       << endl << endl;
  system("pause");
  return 0;
}
Pascal
// Obliczanie całki oznaczonej
// metodą prostokątów
// ---------------------------
//** (C)2004 mgr Jerzy Wałaszek

program int_rect;

// Tutaj definiujemy funkcję
function f(x : real) : real;
begin
  f := x * x + 2 * x;
end;

// Program główny

// liczba punktów
// prostokątów podziałowych
const N = 1000;

var
  xp,xk,s,dx : double;
  i : integer;

begin
  writeln('Obliczanie  calki oznaczonej');
  writeln('za pomoca metody prostokatow');
  writeln('----------------------------');
  writeln('(C)2004 mgr J.Walaszek  I LO');
  writeln;
  writeln('f(x) = x * x + 2 * x');
  writeln;
  writeln('Podaj poczatek ' +
          'przedzialu calkowania');
  writeln;
  write('xp = '); readln(xp);
  writeln;
  writeln('Podaj koniec ' +
          'przedzialu calkowania');
  writeln;
  write('xk = '); readln(xk);
  writeln;
  s  := 0;
  dx := (xk - xp) / N;
  for i := 1 to N do
    s := s + f(xp + i * dx);
  s := s * dx;
  writeln('Wartosc calki wynosi : ',
          s:0:3);
  writeln;
  writeln('Nacisnij Enter...');
  readln;
end.
Basic
' Obliczanie całki oznaczonej
' metodą prostokątów
'(C)2006 mgr Jerzy Wałaszek

Declare Function f(ByVal x As Double) _
                   As Double

' Program główny

' liczba punktów
' prostokątów podziałowych
Const N = 1000
Dim As Double xp, xk, s, dx
Dim i As Integer

Print "Obliczanie  calki oznaczonej"
Print "za pomoca metody prostokatow"
Print "----------------------------"
Print "(C)2006 mgr J.Walaszek  I LO"
Print
Print "f(x) = x * x + 2 * x"
Print
Print "Podaj poczatek " & _
      "przedzialu calkowania"
Print
Input "xp = ", xp
Print
Print "Podaj koniec " & _
      "przedzialu calkowania"
Print
Input "xk = ", xk
Print
s = 0
dx = (xk - xp) / N
For i = 1 To N
  s += f(xp + i * dx)
Next
s *= dx
Print Using "Wartosc calki " & _
      "wynosi : ####.###"; s

' Gotowe
Print
Print "KONIEC. Nacisnij " & _
      "dowolny klawisz..."
Sleep
End

' Tutaj definiujemy funkcję
Public Function f(ByVal x As Double) _
                  As Double
    Return x * x + 2 * x
End Function
Python (dodatek)
# Obliczanie całki oznaczonej
# metodą prostokątów
#(C)2026 mgr Jerzy Wałaszek

# Tutaj definiujemy funkcję
def f(x):
    return x * x + 2 * x

# Program główny

# liczba punktów
# prostokątów podziałowych
n = 1000

print("Obliczanie  całki oznaczonej")
print("za pomocą metody prostokątów")
print("----------------------------")
print("(C)2026 mgr J.Wałaszek  I LO")
print()
print("f(x) = x * x + 2 * x")
print()
print("Podaj początek "
      "przedziału całkowania")
print()
xp = float(input("xp = "))
print()
print("Podaj koniec "
      "przedziału całkowania")
print()
xk = float(input("xk = "))
print()
s = 0
dx = (xk - xp) / n
for i in range(1,n + 1):
    s += f(xp + i * dx)
s *= dx
print("Wartość całki "
      "wynosi : %.3f" % s)

# Gotowe
print()
input("Naciśnij Enter...")
Wynik:
Obliczanie  całki oznaczonej
za pomocą metody prostokątów
----------------------------
(C)2026 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

Naciśnij 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 = 0
    dx = (xk - xp) / N
    for(i = 1; i <= N; i++) s += f(xp + i * dx)
    s *= dx
    t = Math.ceil(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>
  <p style="text-align: center">
    (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie
  </p>
  <p style="text-align: center">
    Całkowana funkcja:
  </p>
  <p style="text-align: center">
    <i>f(x) = x<sup>2</sup> + 2x</i>
  </p>
  <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>
  <p style="text-align: center">
    Wartość całki wynosi
  </p>
  <p id="t_out" style="text-align: center">...</p>
</form>
</body>
</html>

Obliczanie całki oznaczonej
za pomocą metody prostokątów


(C)2004 mgr Jerzy Wałaszek I LO w Tarnowie

Całkowana funkcja:

f(x) = x2 + 2x

Tutaj określ przedział całkowania

Początek xp =
     koniec xk =

Wartość całki wynosi

...


do podrozdziału  do strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2026 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.