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

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

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.


Na początek:  podrozdziału   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:
    ss +(xp + i ·dx)
K04: ss·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 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.


Na początek:  podrozdziału   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     I LO w Tarnowie **
//****************************************************

#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()
{
  const int N = 1000; //liczba punktów/prostokątów podziałowych
  double xp,xk,s,dx;
  int i;

  cout << setprecision(3)      // 3 cyfry po przecinku
       << 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  = 0;
  dx = (xk - xp) / N;
  for(i = 1; i <= N; i++) s += f(xp + i * dx);
  s *= dx;
  cout << "Wartosc calki wynosi : " << setw(8) << s
  << endl << endl;
  system("pause");
  return 0;
}
Pascal
//****************************************************
//** Obliczanie całki oznaczonej metodą prostokątów **
//** ---------------------------------------------- **
//** (C)2004 mgr Jerzy Wałaszek     I LO w Tarnowie **
//****************************************************

program int_rect;

//*******************************
//** 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 : 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:8:3);
  writeln;
  writeln('Nacisnij klawisz Enter...');
  readln;
end.
Basic
'****************************************************
'** Obliczanie całki oznaczonej metodą prostokątów **
'** ---------------------------------------------- **
'** (C)2006 mgr Jerzy Wałaszek     I LO w Tarnowie **
'****************************************************

Declare Function f(ByVal x As Double) As Double

'********************
'** Program główny **
'********************

Const N = 1000 'liczba punktów/prostokątów podziałowych

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
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.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>
  <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>
Wynik:
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...

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

...


Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 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.