Metoda Simpsona – całka oznaczona, algorytm w C++

Dzisiaj wpis gościnny dla hardkorów. Wpis pochodzi z bloga który już nie istnieje (2002 rok) i nie dotyczy hackingu lecz bardziej algorytmiki, matematyki, informatyki  i programowania w języku C++ (Simpson Method, Simpson’s rule C++). Zostaje dodany tylko i wyłącznie dlatego, że szkoda marnować czyjąś prace a może się w przyszłości komuś przyda. Dotyczy metody Simpsona (całki oznaczone), algorytm został napisany w C++ i  dotyczy problemu obliczania całek oznaczonych w C++. Algorytm jest o tyle fajny że wypisuje wszystkie czynności które wykonuje. Program napisany jest w języku C++. Należy pamiętać o modyfikacji 18 linii kodu (wrzucamy tam swoją funkcję), poniższy przykład kodu w C++ jest zbudowany dla całki z parametrem n=4:

Metoda Simpsona C++ – całka oznaczona funkcji rzeczywistej:

#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <cmath>

/*

  Metoda Simpsona - C++
*/

using namespace std;

// tutaj umieszczamy nasza funkcje z całki!
double f(double x)
 {
  return (1/sqrt(5*x-2));
 }

 double Xp, Xk;
 double dx;
 int N;
 double x;
 double st, s;

int main(int argc, char *argv[])
{
    cout << "Podaj poczatek przedzialu calkowania: ";
    cin >> Xp;
    cout << "Podaj koniec przedzialu calkowania: ";
    cin >> Xk;
    cout << "Podaj N: ";
    cin >> N;

    cout << endl << "------------------------------" << endl << endl;
    cout << "Xp=" << Xp << ", Xk=" << Xk << ", N=" << N << endl;
    cout << "s=0, st=0" << endl << endl;

    dx=(Xk-Xp)/N;

    cout << "dx=(Xk-Xp)/N" << endl;
    cout << "dx=("<< Xk << "-" << Xp << ")/" << N <<endl;
    dx=(Xk-Xp)/N;
    cout << "dx=" << dx <<endl<<endl;

    for (int i=1; i<=N; i++) {
        cout << endl << endl <<"\tIteracja nr: " << i << endl << endl;
        cout << "x=xp+i*dx"<< endl;
        cout << "x=" << Xp << "+" << i << "*" << dx << endl;
        x=Xp+i*dx;
        cout << "x=" << x <<endl<<endl;
        cout << "st=st+f(x-dx/2)" << endl;
        cout << "st=" << st << "+f(" << x << "-(" << dx << "/2)" << endl;
        st=st+f(x-(dx/2));
        cout << "st=" << st << endl << endl; 

        if (i<N) {
           cout << "  interacyjne i mniejsze od N to licze:" << endl;
           cout << "  s=s+f(x)" << endl;
           cout << "  s=" << s << "+f(" << x << ")";
           s=s+f(x);
           cout << "s=" << s << endl;
        }

    }

    cout << endl << endl << "--------Wynikowe liczenie:--------" << endl; 

    cout << "s=dx/6*(f(Xp)+f(Xk)+2*s+4*st)" << endl;
    cout << "s=" << dx << "/6*(f(" << Xp << ")+f(" << Xk << ")+2*" << s << "+4*" << st << endl;
    s=dx/6*(f(Xp)+f(Xk)+2*s+4*st);
    cout << "s=" << s << endl;
    cout << endl << "wynik: " << s;

    cout << endl;
    getchar();
    getchar();
    return EXIT_SUCCESS;
}

Przebieg algorytmu metody Simpsona:

Poniżej zostało pokazanie działanie powyższego kodu źródłowego (implementacja w C++), jak widzicie obliczanie całki oznaczonej nie jest trudne:

Podaj poczatek przedzialu calkowania: 0.5
Podaj koniec przedzialu calkowania: 1.5
Podaj N: 4
------------------------------

Xp=0.5, Xk=1.5, N=4
s=0, st=0

dx=(Xk-Xp)/N
dx=(1.5-0.5)/4
dx=0.25

	Iteracja nr: 1

x=xp+i*dx
x=0.5+1*0.25
x=0.75

st=st+f(x-dx/2)
st=0+f(0.75-(0.25/2)
st=0.942809

  interacyjne i mniejsze od N to licze:
  s=s+f(x)
  s=0+f(0.75)s=0.755929

	Iteracja nr: 2

x=xp+i*dx
x=0.5+2*0.25
x=1

st=st+f(x-dx/2)
st=0.942809+f(1-(0.25/2)
st=1.59169

  interacyjne i mniejsze od N to licze:
  s=s+f(x)
  s=0.755929+f(1)s=1.33328

	Iteracja nr: 3

x=xp+i*dx
x=0.5+3*0.25
x=1.25

st=st+f(x-dx/2)
st=1.59169+f(1.25-(0.25/2)
st=2.11692

  interacyjne i mniejsze od N to licze:
  s=s+f(x)
  s=1.33328+f(1.25)s=1.81835

	Iteracja nr: 4

x=xp+i*dx
x=0.5+4*0.25
x=1.5

st=st+f(x-dx/2)
st=2.11692+f(1.5-(0.25/2)
st=2.56983

--------Wynikowe liczenie:--------
s=dx/6*(f(Xp)+f(Xk)+2*s+4*st)
s=0.25/6*(f(0.5)+f(1.5)+2*1.81835+4*2.56983
s=0.656527

wynik: 0.656527

Jeśli szukałeś programu liczącego całki oznaczone to dobrze trafiłeś, jeśli szukałeś metody simpsona też dobrze trafiłeś… ale jeśli jesteś tu przypadkiem…… zajrzyj do pozostałych naszych wpisów na blogu hakiersim. Może Cię zainteresuje:

TO już koniec wpisu! Pozdrawiamy! 🙂

8 thoughts to “Metoda Simpsona – całka oznaczona, algorytm w C++”

  1. Mam pytanie. Od jakiego języka programowania zaczynać ? Lepiej jakiś prosty. Próbowałem uczyć się C++ ale dla mnie to czarna magia.

    1. Wszystko zależy co Cię interesuje i co chcesz robić, bo różne języki nadają się do różnych zastosowań (niektóre po prostu wiele ułatwiają).

      1. Podstawy programowania można zacząć od każdego języka. Kiedyś w szkołach i uczelniach wyższych uczyli na Pascalu (Turbo Pascal, Object Pascal, Delphi). Według mnie PHP jest dosyć łatwym językiem.

  2. Do czego można użyc się ten algorytm, albo czy da sie nim łamac zabezpieczenia??
    Przyznaje że nie znam języka C++, ale jestem ciekawy 🙂

    1. Python jest świetny do wszystkiego, w kilku liniach można bardzo Ciekawe rzeczy wykombinować (mnogość modułów)… Do obliczeń też jest świetny.

      Niestety nie mamy więcej materiałów naszych z metod numerycznych (chyba tylko 2-3 wpisy na naszym blogu tutaj), wrzuciliśmy ten wpis, ponieważ strona jednego z autorów tych wpisów na haker.edu.pl już dawno nie istnieje więc po co mają się wpisiki się marnować (nigdzie nie są opublikowane obecnie).

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *