Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Metody Numeryczne. Metoda Simpsona

Ostatnio zmodyfikowano 2012-11-23 20:08
Autor Wiadomość
Menos
Temat założony przez niniejszego użytkownika
Metody Numeryczne. Metoda Simpsona
» 2012-11-23 15:25:35
Napisalem ten kod.... jakies 3 tygodnie temu. Na podstawie wikipedi ksiazek. Twierdze ze calkowanie odbywa sie poprzez calkowanie podprzedzialow a potem ich dodawaniem. Niestety.... doktor od Numerycznych twierdzi inaczej.....
i moje pytanie.. kto ma racje?

C/C++
double funkcja( double x, string wzor )
{
    FunctionParser funkcja_sparserowana;
    funkcja_sparserowana.Parse( wzor, "x" ); // podajemy stringa i nazwe zmiennej do ktorej mamy zaladowac wynik
    double x1 = x;
    double wynik = funkcja_sparserowana.Eval( & x1 );
    return wynik;
}

double simpson( double a, double b, int ilosc_podzialow, string wzor )
{ double x;
    double dx =( b - a ) / ilosc_podzialow;
    double suma = 0, wynik = 0;
   
    for( int i = 1; i <= ilosc_podzialow; i++ )
    {
        x = a + i * dx; // http://pl.wikipedia.org/wiki/Ca%C5%82kowanie_numeryczne#Metoda_parabol_.28Simpsona.29
        suma += funkcja(( x - dx / 2 ), wzor ); // to samo
       
        if( i < ilosc_podzialow )
        {
            wynik += funkcja( x, wzor );
        }
       
    }
    wynik =( dx / 6 ) *( funkcja( a, wzor ) + funkcja( b, wzor ) + 2 * wynik + 4 * suma ); // 82 strona Foprtuna
    return wynik;
}

double wylicz_simps( double a, double b, int & licznik, double dokladnosc, string wzor )
{
    licznik = 1;
    double wynik1, wynik2;
    bool warunek = false;
    int ilosc_podzialow = 1;
    wynik1 = simpson( a, b, ilosc_podzialow, wzor );
   
    while( !warunek )
    {
        ilosc_podzialow++;
        wynik2 = simpson( a, b, ilosc_podzialow, wzor );
        licznik++; // zmienna podajaca ile bylo iteracji
        if( fabs( wynik1 - wynik2 ) < dokladnosc ) //warunek ze jezeli doszlismy do odpowiedniej dokladnosci przestajemy liczyc
        {
            warunek = true;
        }
        else
        {
            wynik1 = wynik2;
        }
    }
    return wynik2;
}
P-69752
cyklopek11
» 2012-11-23 20:08:02
Nikomu pewnie nie chce się analizować Twoich wzorów. Więc prosta rada. Weź wybierz kilka funkcji oraz przedziałów całkowania. Oblicz ręcznie a następnie przy pomocy Twojego programu. Jeśli błędy względne będą mniejsze od 5% to bez analizowania kodu programu można stwierdzić, że powinien być dobry. Oczywiście im więcej prób przeprowadzisz , tym lepiej. Jeśli jednak któraś z prób da duży błąd względny radze przeanalizować szczegółowo działanie kodu :-)
P-69777
« 1 »
  Strona 1 z 1