Witam,
muszę stworzyć program w C++, który z wykorzystaniem OpenMP obliczy wartość całki ax^2+bx+c metodą trapezów. Napisany program uruchamia się poprawnie, tylko że całka obliczana jest kilkakrotnie i jej wynik jest źle zaokrąglony (o 2 miejsca do tyłu). Sam program całkujący działa prawidłowo. Bardzo prosiłbym o sprawdzenie kodu. Pozdrawiam.
#include <iomanip>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <omp.h>
using namespace std;
//*******************************
//** Tutaj definiujemy funkcję **
//*******************************
double f(double x, int a, int b, int c)
{
return (a * pow(x, 2) + b * x + c);
}
//********************
//** Program główny **
//********************
int main()
{
const int N = 1000; //liczba punktów/trapezów podziałowych
double xp, xk, s, dx;
int a, b, c, i;
cout << setprecision(3) // 3 cyfry po przecinku
<< fixed; // format stałoprzecinkowy
cout << "Podaj wartosc a \n" ;
cin >> a;
cout << "Podaj wartosc b \n" ;
cin >> b;
cout << "Podaj wartosc c \n" ;
cin >> c;
cout << "f(x) = a * x * x + b * x + c x"<<endl
<< "Podaj poczatek przedzialu calkowania"<<endl
<< "xp = ";
cin >> xp;
cout << "Podaj koniec przedzialu calkowania"<<endl
<< "xk = ";
cin >> xk;
#pragma omp parallel firstprivate(xk, xp) private (dx, i, a, b, c) shared (s)
{
s = 0;
dx = (xk - xp) / N;
#pragma omp for reduction (+:s)
for(i = 1; i < N; i++) {
s += f(xp + i * dx, a, b, c);
s *= dx;
cout << "Wartosc calki wynosi : " << setw(8) << s
<< endl << endl;
}
}
system("pause");
return 0;
}