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

Metoda Simpsona jest najdokładniejszą z opisanych tutaj metod przybliżonego całkowania. W metodzie prostokątów całka oznaczona przybliżana była funkcjami stałymi - liczyliśmy sumę pól prostokątów. W metodzie trapezów całkę przybliżaliśmy za pomocą funkcji liniowych - obliczaliśmy sumy pól trapezów. W metodzie Simpsona stosujemy jako przybliżenie parabolę - będziemy obliczali sumy wycinków obszarów pod parabolą. Zasada jest następująca:
Przedział całkowania
[
dla i =
0,1,2,...,n

Dla każdych dwóch sąsiednich punktów wyznaczamy punkt środkowy ti wg wzoru:
dla i =
1,2,...,n

Obliczamy odległość między dwoma sąsiednimi punktami.

Dla każdego wyznaczonego w ten sposób punktu obliczamy wartość funkcji f(x) w tym punkcie:
| punkty podziałowe |
|---|
| dla
i = 0,1,2,...,n fi = f(xi) |
| punkty środkowe |
| dla
i = 1,2,...,n fti = f(ti) |
W każdym podprzedziale [xi-1,xi] przybliżamy funkcję za pomocą paraboli g(x) o następującej postaci:
dla i =
1,2,...,n

Parabola gi(x) musi przechodzić przez punkty: (xi-1,fi-1), (ti,fti), (xi,fi). Współczynniki ai, bi i ci wyznaczymy zatem z układu trzech równań:
dla i =
1,2,...,n
Uwaga:W metodzie Simpsona chodzi o wyznaczenia pola pod parabolą w danym podprzedziale, a nie jej współczynników. Możemy zatem pójść inną drogą. Załóżmy, iż powyższe współczynniki są znane (ostatecznie możemy je przecież wyliczyć). |
Pole pod parabolą w przedziale
[xi-1,xi]
będzie równe całce oznaczonej:
dla i =
1,2,...,n
Funkcja pierwotna jest bardzo prosta w tym przypadku i ma wzór następujący:
dla i =
1,2,...,n
Wartość całki obliczymy zgodnie z definicją Newtona-Leibniza:
dla i =
1,2,...,n

Teraz postaramy się uprościć maksymalnie otrzymane wyrażenie. W tym celu wyciągamy przed nawias wspólny czynnik i całość dzielimy przez 6:
dla i =
1,2,...,n

Zwróćcie uwagę, iż wyrażenia w nawiasach są odpowiednio
wartościami funkcji

jest odległością dx pomiędzy dwoma sąsiednimi punktami podziałowymi. Zatem po uproszczeniu otrzymujemy ostateczny wzór:
dla i =
1,2,...,n

Wzór ten pozwala wyliczyć pole obszaru pod parabolą aproksymującą
funkcję f(x) w przedziale
[

Jest to wzór wyliczania przybliżonej wartości całki oznaczonej za pomocą metody Simpsona. Ponieważ w obliczanych sumach wartości funkcji się powtarzają dwukrotnie (z wyjątkiem pierwszej i ostatniej), do obliczeń komputerowych stosujemy efektywniejszy wzór otrzymywania powyższej sumy:

| 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 |
| st | - suma wartości funkcji w punktach środkowych, st ∈ R |
| dx | - odległość między dwoma sąsiednimi punktami podziałowymi, dx ∈ R |
| x | - pozycja punktu podziałowego, x ∈ R |
| i | - licznik punktów podziałowych, i ∈ N |
| K01: | s ← 0; st ← 0 |
| K02: | ![]() |
| K03: | Dla i = 1,2,...,n: wykonuj kroki K04...K06 |
| K04: | x ← xp + i ·dx |
| K05: | ![]() |
| K06: | Jeśli i < n, to s ← s + f (x) |
| K07: | ![]() |
| K08: | Zakończ |

Odczytujemy krańce przedziału całkowania
W pętli wyznaczamy wartość punktu podziałowego xi i umieszczamy ją w zmiennej x. Następnie obliczamy wartość funkcji w punkcie środkowym ti, który jest odległy o połowę dx od wyznaczonego wcześniej punktu xi. Wartość tę dodajemy do sumy st.
Drugą sumę tworzymy w zmiennej s. Jednakże powinna ona zawierać jedynie wartości funkcji dla punktów podziałowych od x1 do xn-1. Dlatego przed sumowaniem sprawdzamy, czy indeks i jest w odpowiednim zakresie.
Po zakończeniu pętli wyznaczamy wartość całki w zmiennej s zgodnie z podanym wzorem, wyprowadzamy ten wynik dla użytkownika i kończymy wykonywanie algorytmu.
W celu zobrazowania dokładności metody Simpsona zmniejszyliśmy w naszych
przykładach liczbę punktów podziałowych do
C++//*************************************************
//** Obliczanie całki oznaczonej metodą Simpsona **
//** ------------------------------------------- **
//** (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 = 10; //liczba punktów podziałowych
double xp,xk,s,st,dx,x;
int i;
cout << setprecision(3) // 3 cyfry po przecinku
<< fixed; // format stałoprzecinkowy
cout << "Obliczanie calki oznaczonej\n"
" za pomoca metody Simpsona\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; st = 0;
dx = (xk - xp) / N;
for(i = 1; i <= N; i++)
{
x = xp + i * dx;
st += f(x - dx / 2);
if(i < N) s += f(x);
}
s = dx / 6 * (f(xp) + f(xk) + 2 * s + 4 * st);
cout << "Wartosc calki wynosi : " << setw(8) << s
<< endl << endl;
system("pause");
return 0;
} |
Pascal//*************************************************
//** Obliczanie całki oznaczonej metodą Simpsona **
//** ------------------------------------------- **
//** (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie **
//*************************************************
program int_simpson;
//*******************************
//** Tutaj definiujemy funkcję **
//*******************************
function f(x : double) : double;
begin
f := x * x + 2 * x;
end;
//********************
//** Program główny **
//********************
const N = 10; //liczba punktów podziałowych
var
xp,xk,s,st,dx,x : double;
i : integer;
begin
writeln('Obliczanie calki oznaczonej');
writeln(' za pomoca metody Simpsona');
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; st := 0;
dx := (xk - xp) / N;
for i := 1 to N do
begin
x := xp + i * dx;
st := st + f(x - dx / 2);
if i < N then s := s + f(x);
end;
s := dx / 6 * (f(xp) + f(xk) + 2 * s + 4 * st);
writeln('Wartosc calki wynosi : ',s:8:3);
writeln;
writeln('Nacisnij klawisz Enter...');
readln;
end. |
Basic'************************************************* '** Obliczanie całki oznaczonej metodą Simpsona ** '** ------------------------------------------- ** '** (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie ** '************************************************* Declare Function f(x as Double) As Double '******************** '** Program główny ** '******************** const N = 10 'liczba punktów/trapezów podziałowych Dim As Double xp,xk,s,st,x,dx Dim As Integer i Print "Obliczanie calki oznaczonej" Print " za pomoca metody Simpsona" 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: st = 0 dx = (xk - xp) / N for i = 1 to N x = xp + i * dx st = st + f(x - dx / 2) if i < N then s = s + f(x) Next s = dx / 6 * (f(xp) + f(xk) + 2 * s + 4 * st) print Using "Wartosc calki wynosi : #####.###";s Print Print "Nacisnij klawisz Enter..." Sleep End '******************************* '** Tutaj definiujemy funkcję ** '******************************* function f(x as Double) As Double f = x * x + 2 * x End Function |
JavaScript<html>
<head>
<title>Całkowanie numeryczne metodą Simpsona</title>
</head>
<body>
<script language="JavaScript">
//*************************************************
//** Obliczanie całki oznaczonej metodą Simpsona **
//** ------------------------------------------- **
//** (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie **
//*************************************************
//*******************************
//** Tutaj definiujemy funkcję **
//*******************************
function f(x)
{
return(x * x + 2 * x);
}
function js_simpson()
{
var N = 10; //liczba punktów podziałowych
var xp,xk,s,st,dx,x,i,t;
xp = parseFloat(document.frm_simpson.xp_inp.value);
xk = parseFloat(document.frm_simpson.xk_inp.value);
if(isNaN(xp) || isNaN(xk))
t = "<font color=red><b>Popraw dane wejściowe!</b></font>";
else
{
s = 0; st = 0;
dx = (xk - xp) / N;
for(i = 1; i <= N; i++)
{
x = xp + i * dx;
st += f(x - dx / 2);
if(i < N) s += f(x);
};
s = dx / 6 * (f(xp) + f(xk) + 2 * s + 4 * st);
t = Math.floor(s * 1000) / 1000;
};
document.getElementById("t_out").innerHTML = t;
}
</script>
<form method="POST"
name="frm_simpson"
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 Simpsona
</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_simpson();" 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 Simpsona ---------------------------- (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,333 KONIEC. Naciśnij dowolny klawisz... |
![]() |
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.