Serwis Edukacyjny
Nauczycieli
w I-LO w Tarnowie

Do strony głównej I LO w Tarnowie

Materiały dla uczniów liceum

Zoptymalizowane dla
  
1280 x 1024

  Wyjście       Spis treści       Poprzedni       Następny  

©2017 mgr Jerzy Wałaszek
I LO w Tarnowie

Autor artykułu: mgr Jerzy Wałaszek

 

 

Metoda prostokątów

W tym rozdziale: Zobacz również na:

 

Algorytm całkowania metodą prostokątów

 

pic

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.

 

Specyfikacja problemu

Dane wejściowe

xp - początek przedziału całkowania,

xk - koniec przedziału całkowania,

n - liczba punktów podziałowych,

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

Zmienne pomocnicze

dx - odległość między dwoma sąsiednimi punktami podziałowymi,

i - licznik punktów podziałowych,

 

Lista kroków

Schemat blokowy

flow

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.

 

 

Przykładowe programy dla metody prostokątów

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

 

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

 

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.

 

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;
}

 

 

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>

 

A tutaj możesz przetestować w praktyce działanie powyższego skryptu.

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

...

 

 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

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