Miałem do napisania program obliczajaćy całke metodą złożonej kwadratury simpsona.
Zrobiłem wszystko dobrze i przychodzi do odpowiedzi.... I ja twierdze że mój program sumuje całki wyliczone z tych podprzedziałów dopóki nie osiagnie sie odpowiedniej ,podanej przez uzytkownika dokładkości. Jakie jest wasze zdanie?
oczywiscie
a - poczatek przedzialu
b - koniec przedzialu
funkcja - parserowanie na double stringa
dokladnosc - zmienna podana przez uzytkownika potrzebna do otrzymania porzadanego wyniku.
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;
}