fork download
  1. #include <iostream>
  2. #include <mpi.h>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <iomanip>
  6.  
  7. using namespace std;
  8.  
  9. double f(double x) {
  10. return sqrt(1 - x * x); // Funkcja do zintegrowania
  11. }
  12. /
  13. double trapezoidal_rule(double (*func)(double), double a, double b, int n) {
  14. double h = (b - a) / n; // Szerokość podziału
  15. double sum = 0.5 * (func(a) + func(b)); // Obliczenie wartości na końcach
  16.  
  17. for (int i = 1; i < n; i++) {
  18. sum += func(a + i * h); // Dodaj wartości pośrednie
  19. }
  20.  
  21. return sum * h; // Zwróć wynik całkowania
  22. }
  23. double czesc_calki(double (*func)(double), double a, double b, int n,int s,int e) {
  24. double h = ((b - a) / n) ; // Szerokość podziału
  25. double sum = 0.5 * (func(a) + func(b)); // Obliczenie wartości na końcach
  26.  
  27. for (int i = s ; i < e; i++) {
  28. sum += func(a + i * h); // Dodaj wartości pośrednie
  29. }
  30.  
  31. return sum * h; // Zwróć wynik całkowania
  32. }
  33. int main (int argc, char *argv[])
  34. {
  35. MPI_Init(&argc, &argv);
  36. int rank,size,n;
  37. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  38. MPI_Comm_size(MPI_COMM_WORLD, &size);
  39. double tBegin, tEnd;
  40. double a = -1.0; // Dolna granica
  41. double b = 1.0; // Górna granica
  42.  
  43.  
  44. if (rank == 0)
  45. {
  46.  
  47. cout<<"Podaj liczbe przedzialow"<<endl;
  48. cin>>n;
  49. tBegin = MPI_Wtime();
  50. double area = trapezoidal_rule(f, a, b, n); // Oblicz pole powierzchni
  51. double pi = area * 2; // Mnożymy przez 2, aby uzyskać π
  52. cout << "Przybliżona wartość π: " << pi << endl;
  53. tEnd = MPI_Wtime();
  54. cout << "Czas działania: " <<setprecision(5) << fixed <<tEnd - tBegin <<" s"<< endl;
  55.  
  56. }
  57. MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
  58. int loc_n = n / size;
  59. int start = loc_n * rank;
  60. int end = start + loc_n;
  61.  
  62. double area = czesc_calki(f, a, b, n ,start,end); // Oblicz pole powierzchni
  63. double pi = area * 2; // Mnożymy przez 2, aby uzyskać π
  64. cout << "Przybliżona wartość π: " << pi << endl;
  65.  
  66.  
  67.  
  68. MPI_Finalize();
  69. return 0;
  70. }
  71.  
Success #stdin #stdout #stderr 0.3s 40504KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected symbol in "using namespace"
Execution halted