Hej
Napisałem program ktory liczy całki metodą trapezow i Simpsona. Przejrzałem algorytm ale dalej wychodzą mi błędne wyniki, nie wiem czy to kwestia typów zmiennych czy czego innego. Wrzucam kod:
#include <iostream>
#include <math.h>
using namespace std;
double MetodaTrapezow(
double*(Funkcja(double)), double DolnaGranica, double GornaGranica, int LiczbaKrokow)
{
double wynik = 0;
double dx; // delta x
dx = (GornaGranica - DolnaGranica) / LiczbaKrokow;
for (int i = 1; i < LiczbaKrokow; i++)
{
wynik += Funkcja(DolnaGranica + i * dx);
}
wynik += (Funkcja(DolnaGranica) + Funkcja(GornaGranica)) / 2;
wynik *= dx;
return wynik;
}
double MetodaSimpsona(
double*(Funkcja(double)), double DolnaGranica, double GornaGranica, int LiczbaKrokow)
{
double wynik = 0;
double temp = 0;
double dx, punktpodz; // delta x i punkt podziałowy
dx = (GornaGranica - DolnaGranica) / LiczbaKrokow;
for (int i = 1; i <= LiczbaKrokow; i++)
{
punktpodz = DolnaGranica + i * dx;
temp += Funkcja(punktpodz - dx / 2);
if (i < LiczbaKrokow)
wynik += Funkcja(punktpodz);
}
wynik = dx / 6 * (Funkcja(DolnaGranica) + Funkcja(GornaGranica) + 2 * wynik + 4 * temp);
return wynik;
}
double pomFunkcjaZ1(double arg)
{
return (pow(cos(arg), 2) + 1);
}
double pomFunkcjaZ2(double arg)
{
return (1 / arg);
}
double pomFunkcjaZ4(double arg)
{
return (1 / 1 + pow(arg, 2));
}
int main()
{
double a, b;
int h;
int wybor;
cout << "Wybierz zadanie 1, 2, 4\n";
cin >> wybor;
switch (wybor)
{
case 1: // tutaj ma wyjść wynik 3pi = 9,42
cout << "Podaj poczatek przedzialu calkowania\n";
cin >> a;
cout << "Podaj koniec przedzialu calkowania\n";
cin >> b;
cout << "Co ile(krok)\n";
cin >> h;
cout << "Wynik to" << MetodaTrapezow(pomFunkcjaZ1, a, b, h);
break;
case 2: // tutaj ma policzyc ln7=1,94
cout << "Podaj poczatek przedzialu calkowania\n";
cin >> a;
cout << "Co ile(krok)\n";
cin >> h;
int arg;
cout << "Podaj argument";
cin >> arg;
cout << "Wynik to" << MetodaSimpsona(pomFunkcjaZ2, a, arg, h);
break;
case 4: // ma wyjsc pi = 3,14
cout << "Podaj poczatek przedzialu calkowania\n";
cin >> a;
cout << "Podaj koniec przedzialu calkowania\n";
cin >> b;
cout << "Co ile(krok)\n";
cin >> h;
cout << "Wynik to" << 2 * MetodaSimpsona(pomFunkcjaZ4, a, b, h);
break;
default:
cout << "Blad\n";
break;
}
return 0;
}
Z góry dzięki za wszystkie odpowiedzi/