Błędne obliczenie całki-OpenMP-c++

0

Witam,
Potrzebuje informacji dlaczego poniższy kod daje złe wyniki całki.
Sprawdzałem wyniki w matlabie i są całkowicie inne niż tym programie.

#include <stdio.h>
#include <omp.h>
#include <iostream>
using namespace std;
//Funkcja opisuj¹c¹ ca³kê
double f(double x,double a, double b,double c)
{
return((a*x*x)+(b*x)+c);
}
double tp()
{
double omp_get_wtime(void);
}
int main()
{
//1.1 Wczytywanie wspolczynników A,B,C oraz granic ca³kowania
   double A,B,C,X1,X2,dx,Ts,tp;
   const int N=1000;
    cout << "Podaj wspolczynnik A :";
    cin >> A;
    cout << "Podaj wspolczynnik B :";
    cin >> B;
    cout << "Podaj wspolczynnik C :";
    cin >> C;
    cout << "Podaj granica ca³kowania X1 :";
    cin >> X1;
    cout << "Podaj granica ca³kowania X2 :";
    cin >> X2;
#pragma omp parallel private(dx,X1,X2) shared (A,B,C,Ts)
{Ts=0;
dx=(X2-X1)/N;

#pragma omp for reduction (+:Ts)
for(int i = 1; i < N; i++)
{
Ts += f(X1 + i * dx,A,B,C)*dx;


}
}
//1.2 Dane wyjsciowe
cout <<"Wartosc calki wynosi:"<<Ts<<endl;
cout <<"Wartosc Tp:" << tp<<endl;
return 0;
}


0

Dla jakich parametrów testujesz, jakie uzyskujesz wyniki, jakich oczekujesz, jak wygląda kod w Matlabie?

0

Parametry:
Współczynnik A,B,C=2;
X1=0;
X2=500;
Wartość całki 4,8091e+007
Matlab-Kod
a=2;
b=2;
c=2;
x1=0;
x2=500;
syms x;
f=((axx)+(b*x)+c);
int(f,x1,x2);
Wartość całki: ans =

8.3584e+07

2

Nie znam się na OpenMP, ale zacząłbym od sprawdzenia skąd biorą się te warningi...

$ g++ -Wall -fopenmp  omp.cpp 
omp.cpp: In function ‘double tp()’:
omp.cpp:13:1: warning: no return statement in function returning non-void [-Wreturn-type]
   13 | }
      | ^
omp.cpp: In function ‘main._omp_fn.0’:
omp.cpp:31:7: warning: ‘X2’ is used uninitialized [-Wuninitialized]
   31 | dx=(X2-X1)/N;
      |    ~~~^~~~
omp.cpp:17:20: note: ‘X2’ declared here
   17 |    double A,B,C,X1,X2,dx,Ts,tp;
      |                    ^~
omp.cpp:31:7: warning: ‘X1’ is used uninitialized [-Wuninitialized]
   31 | dx=(X2-X1)/N;
      |    ~~~^~~~
omp.cpp:17:17: note: ‘X1’ declared here
   17 |    double A,B,C,X1,X2,dx,Ts,tp;
      |                 ^~
omp.cpp: In function ‘int main()’:
omp.cpp:43:25: warning: ‘tp’ may be used uninitialized [-Wmaybe-uninitialized]
   43 | cout <<"Wartosc Tp:" << tp<<endl;
      |                         ^~

Po drobnych poprawkach dla tych danych które podałeś daje taki sam wynik jak Matlab
Nie mam jednak pojęcia czy nie zepsułem OMP ;)

double tp()
{
  return omp_get_wtime();
}

int main()
{
   double A,B,C,X1,X2,dx,Ts;

// ...
#pragma omp parallel private(dx) shared (A,B,C,Ts,X1, X2)

1 użytkowników online, w tym zalogowanych: 0, gości: 1