|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
| SPIS TREŚCI |
|
| Podrozdziały |

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:

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

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

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

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?
| 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 |
| s | - przybliżona wartość całki oznaczonej funkcji f(x) w przedziale <xp,xk>, s ∈ R |
| dx | - odległość między dwoma sąsiednimi punktami podziałowymi, dx ∈ R |
| i | - licznik punktów podziałowych, i ∈ N |
| K01: | s ← 0 |
| K02: | ![]() |
| K03: | Dla i = 1,2,...,n : wykonuj: s ← s + f (xp+ i ·dx) |
| K04: | ![]() |
| K05: | Zakończ |

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.
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>
<div style="overflow-x: auto;"
align="center">
<table
border="0"
cellpadding="4"
style="border-collapse:
collapse">
<tr>
<td nowrap>
<form
name="frm"
style="text-align: center;
background-color:
#E7E7DA">
<b>
Obliczanie całki
oznaczonej
<br>
za pomocą
metody trapezów
</b><br>
(C)2026 mgr
Jerzy Wałaszek
<hr>
Całkowana funkcja:<br>
f(x) =
x<sup>2</sup> + 2x
<hr>
Przedział całkowania<br>
x<sub>p</sub> =
<input
name="xp_inp"
size="15"
value="0"
type="text"
style="text-align:
right">
<br>
x<sub>k</sub> =
<input
name="xk_inp"
size="15"
value="1"
type="text"
style="text-align:
right">
<hr>
<input
onclick="js_trapez();"
value="Oblicz całkę"
name="B1"
type="button">
<hr>
Wartość całki wynosi:
<div id="out">.</div>
</form>
</td>
</tr>
</table>
</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()
{
//liczba punktów/trapezów
// podziałowych
var N = 1000;
var xp,xk,s,dx,i,t;
xp = parseFloat(document
.frm.xp_inp.value);
xk = parseFloat(document
.frm.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("out")
.innerHTML = t;
}
</script>
</body>
</html> |
![]() |
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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.