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 trapezów

SPIS TREŚCI
Podrozdziały

Algorytm całkowania metodą trapezów

 
obrazek

Opisana w poprzednim rozdziale metoda prostokątów nie jest zbyt dokładna, ponieważ pola użytych w niej prostokątów źle odwzorowują powierzchnię pola pod krzywą (dokładność odwzorowania rośnie wraz ze wzrostem liczby prostokątów). Dużo lepszym rozwiązaniem jest zastosowanie zamiast nich trapezów o wysokości dx i podstawach równych odpowiednio wartości funkcji w punktach krańcowych.. Sama zasada nie zmienia się.

Przedział całkowania <xp,xk> dzielimy na n+1 równo odległych punktów x0,x1,x2,...,xn. Punkty te wyznaczamy w prosty sposób wg wzoru:

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

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

obrazek

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

obrazek

Pole pod wykresem funkcji przybliżane jest polami n trapezów. Pole i-tego trapezu obliczamy wg wzoru:

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

Przybliżona wartość całki jest sumą pól wszystkich otrzymanych w ten sposób trapezów:

czyli

Wyprowadzony na końcu wzór jest podstawą przybliżonego wyliczania całki w metodzie trapezów.

Przykład:

Obliczymy ręcznie przybliżoną wartość całki oznaczonej z funkcji f(x) = sin(x) w przedziale <0,π>.

Przedział podzielimy na n + 1 = 5 punktów:

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 trapezów:


Otrzymaliśmy wynik identyczny jak w przypadku metody prostokątów - dlaczego?


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:
    ss +(xp+·dx)
K04:
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 - 1)-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 do sumy s dodajemy średnią wartość funkcji na krańcach przedziału i całość przemnażamy przez 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ą trapezó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/trapezó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 trapezow\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 = (s + (f(xp) + f(xk)) / 2) * dx;
  cout << "Wartosc calki wynosi : "
       << s
       << endl << endl;
  system("pause");
  return 0;
}
Pascal
// Obliczanie całki oznaczonej
// metodą trapezów
// ---------------------------
// (C)2004 mgr Jerzy Wałaszek

program int_trapez;

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

// Program główny

// liczba punktów
// trapezów podziałowych
const N = 1000;

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

begin
  writeln('Obliczanie calki oznaczonej');
  writeln(' za pomoca metody trapezow');
  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 - 1 do
    s := s + f(xp + i * dx);
  s := (s + (f(xp) + f(xk)) / 2)* dx;
  writeln('Wartosc calki wynosi : ',
          s:0:3);
  writeln;
  writeln('Nacisnij klawisz Enter...');
  readln;
end.
Basic
' Obliczanie całki oznaczonej
' metodą trapezów
' ---------------------------
' (C)2004 mgr Jerzy Wałaszek

Declare Function f(x As Double) _
                     As Double

' Program główny

' liczba punktów
' trapezów podziałowych
const N = 1000

Dim As Double xp,xk,s,dx
Dim As Integer i

Print "Obliczanie  calki oznaczonej"
Print " za pomoca  metody trapezow"
Print "----------------------------"
Print "(C)2004 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 - 1
  s += f(xp + i * dx)
Next
s = (s + (f(xp) + f(xk)) / 2) * 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ą trapezów
# ---------------------------
# (C)2026 mgr Jerzy Wałaszek

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

# Program główny

# liczba punktów
# trapezów podziałowych
n = 1000

print("Obliczanie całki oznaczonej")
print(" za pomocą metody trapezó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):
    s += f(xp + i * dx)
s = (s + (f(xp) + f(xk)) / 2) * dx
print("Wartość całki "
      "wynosi : %.3f" % s)

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

Naciśnij Enter...
JavaScript
<html>
<head>
  <title>Całkowanie numeryczne metodą prostokątów</title>
</head>
<body>
<form name="frm_trapez" class="round_note">
	<h2 style="text-align: center;">Obliczanie całki oznaczonej<br>
	                                za pomocą metody trapezó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 class="small">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 class="small">p</sub></i> =
	<input name="xp_inp" size="20" value="0" type="text" style="text-align: right">
	<br>&nbsp;&nbsp;&nbsp; 
	<span lang="en">&nbsp;</span>koniec <i>x<sub class="small">k </sub></i>=
  	<input name="xk_inp" size="20" value="1" type="text" style="text-align: right"></p>
	<p style="text-align: center;">
	<input onclick="js_trapez();" value="Oblicz całkę" name="B1" type="button"></p>
	<p style="text-align: center;">Wartość całki wynosi</p>
	<p id="t_out" style="text-align: center;">...</p>
</form>
</div>
<script language="JavaScript">

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

// Tutaj definiujemy funkcję 

function f(x)
{
  return(x * x + 2 * x);
}

function js_trapez()
{
  var N = 1000; //liczba punktów/trapezów podziałowych
  var xp,xk,s,dx,i,t;

  xp = parseFloat(document.frm_trapez.xp_inp.value);
  xk = parseFloat(document.frm_trapez.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 = (s + (f(xp) + f(xk)) / 2) * dx;
    t = Math.floor(s * 1000) / 1000;
  };
  document.getElementById("t_out").innerHTML = t;
}
</script>
</body>
</html>

Obliczanie całki oznaczonej
za pomocą metody trapezó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.