Programowanie i algorytmy

KONKURS FRAKTAL

fraktal

VI edycja konkursu programistycznego

FRAKTAL

19-20 listopad 2016

czytaj więcej

Całkowanie numeryczne - metoda prostokątów

powrót

Jednym ze sposobów wyznaczenia pola obszaru ograniczonego wykresem funkcji, osią OX oraz dwiema prostymi równoległymi do osi OY jest podzielenie tego obszaru na prostokąty:

metoda prostokątówW naszym przykładzie podzielmy dany obszar na trzy prostokąty, które będą przecinać się z wykresem funkcji dokładnie po środku każdego boku. Oczywiście im większa liczba takich prostokątów tym wyznaczone pole jest dokładniejsze.

metoda prostokątów

 

Wzór na pole prostokąta jest wszystkim znany:

{tex}P=x\cdot y{/tex}

Długość jednego z boków wyznaczymy ze wzoru:

{tex}x=\frac{b-a}{n}{/tex}

gdzie, {tex}n{/tex} to liczba prostokątów na jakie dzielimy szukane pole, natomiast {tex}b{/tex} i {tex}a{/tex} to proste, które ograniczają zadany obszar {tex}a<b{/tex}.

Drugi bok wyznaczymy wyliczając wartość funkcji w środku boku prostokąta:

{tex}y=|f(srodek_{i})|{/tex}

Środek pierwszego boku wyznaczymy ze wzoru:

{tex}srodek=a+\frac{b-a}{4}{/tex}

Każdy następny będziemy wyznaczać zwiększając poprzedni o długość boku {tex}x{/tex}. 

metoda prostokątów

Ostatecznie sumujemy pola wszystkich prostokątów otrzymując przybliżone pole zakreślanego obszaru:

{tex}P=x\cdot |f(srodek)|+x\cdot |f(srodek+x)|+x\cdot |f(srodek+2x)|+\cdots +x\cdot |f(srodek+(n-1)\cdot x)|={/tex}

{tex}x\cdot (|f(srodek|+|f(srodek+x|+|f(srodek+2x|+\cdots |f(srodek+(n-1)\cdot x)|{/tex}

metoda prostokątów

Rozwiazanie w C++:

#include<iostream>
#include<iomanip>
using namespace std;
 
double f(double x)
{
       //funkcja zawsze przyjmuje wartosci dodatnie
       //więc można pominąć wartosć bezwzględną
       return x*x+x+2;
}
 
double Pole(int a, int b, int n)
{
  double x = (b-a)/(double)n; //pierwszy bok - każdy prostokąt ma taki sam
  double S = 0.0; //zmienna będzie przechowywać sumę pól trapezów
  double srodek = a+(b-a)/(2.0*n); //środek pierwszego boku
 
  for(int i=0;i<n;i++)
  {
      S+=f(srodek); //obliczenie wysokości prostokąta
      srodek+=x; //przejście do następnego środka    
  }
  return S*x;
}
 
int main()
{
  int a, b, n;
  cout<<"Podaj przedział [a, b]\na = ";
  cin>>a;
  cout<<"b = ";
  cin>>b;
  cout<<"Podaj liczbę trapezów: ";
  cin>>n;
 
  if(!(a<b))
    cout<<"To nie jest przedział!";
  else
    cout<<"Pole figury wynosi: "<<fixed<<setprecision(2)<<Pole(a, b, n);  
 
 
  cin.ignore();
  cin.get();
  return 0;
}