#include <iostream>
#include <mpi.h>
#include <cstdlib>
#include <cmath>
#include <iomanip>
using namespace std;
double f(double x) {
return sqrt(1 - x
* x
); // Funkcja do zintegrowania }
/
double trapezoidal_rule(double (*func)(double), double a, double b, int n) {
double h = (b - a) / n; // Szerokość podziału
double sum = 0.5 * (func(a) + func(b)); // Obliczenie wartości na końcach
for (int i = 1; i < n; i++) {
sum += func(a + i * h); // Dodaj wartości pośrednie
}
return sum * h; // Zwróć wynik całkowania
}
double czesc_calki(double (*func)(double), double a, double b, int n,int s,int e) {
double h = ((b - a) / n) ; // Szerokość podziału
double sum = 0.5 * (func(a) + func(b)); // Obliczenie wartości na końcach
for (int i = s ; i < e; i++) {
sum += func(a + i * h); // Dodaj wartości pośrednie
}
return sum * h; // Zwróć wynik całkowania
}
int main (int argc, char *argv[])
{
MPI_Init(&argc, &argv);
int rank,size,n;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
double tBegin, tEnd;
double a = -1.0; // Dolna granica
double b = 1.0; // Górna granica
if (rank == 0)
{
cout<<"Podaj liczbe przedzialow"<<endl;
cin>>n;
tBegin = MPI_Wtime();
double area = trapezoidal_rule(f, a, b, n); // Oblicz pole powierzchni
double pi = area * 2; // Mnożymy przez 2, aby uzyskać π
cout << "Przybliżona wartość π: " << pi << endl;
tEnd = MPI_Wtime();
cout << "Czas działania: " <<setprecision(5) << fixed <<tEnd - tBegin <<" s"<< endl;
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
int loc_n = n / size;
int start = loc_n * rank;
int end = start + loc_n;
double area = czesc_calki(f, a, b, n ,start,end); // Oblicz pole powierzchni
double pi = area * 2; // Mnożymy przez 2, aby uzyskać π
cout << "Przybliżona wartość π: " << pi << endl;
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bXBpLmg+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxpb21hbmlwPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmRvdWJsZSBmKGRvdWJsZSB4KSB7CiAgICByZXR1cm4gc3FydCgxIC0geCAqIHgpOyAvLyBGdW5rY2phIGRvIHppbnRlZ3Jvd2FuaWEKfQovCmRvdWJsZSB0cmFwZXpvaWRhbF9ydWxlKGRvdWJsZSAoKmZ1bmMpKGRvdWJsZSksIGRvdWJsZSBhLCBkb3VibGUgYiwgaW50IG4pIHsKICAgIGRvdWJsZSBoID0gKGIgLSBhKSAvIG47IC8vIFN6ZXJva2/Fm8SHIHBvZHppYcWCdQogICAgZG91YmxlIHN1bSA9IDAuNSAqIChmdW5jKGEpICsgZnVuYyhiKSk7IC8vIE9ibGljemVuaWUgd2FydG/Fm2NpIG5hIGtvxYRjYWNoCgogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsKICAgICAgICBzdW0gKz0gZnVuYyhhICsgaSAqIGgpOyAvLyBEb2RhaiB3YXJ0b8WbY2kgcG/Fm3JlZG5pZQogICAgfQoKICAgIHJldHVybiBzdW0gKiBoOyAvLyBad3LDs8SHIHd5bmlrIGNhxYJrb3dhbmlhCn0KZG91YmxlIGN6ZXNjX2NhbGtpKGRvdWJsZSAoKmZ1bmMpKGRvdWJsZSksIGRvdWJsZSBhLCBkb3VibGUgYiwgaW50IG4saW50IHMsaW50IGUpIHsKICAgIGRvdWJsZSBoID0gKChiIC0gYSkgLyBuKSA7IC8vIFN6ZXJva2/Fm8SHIHBvZHppYcWCdQogICAgZG91YmxlIHN1bSA9IDAuNSAqIChmdW5jKGEpICsgZnVuYyhiKSk7IC8vIE9ibGljemVuaWUgd2FydG/Fm2NpIG5hIGtvxYRjYWNoCgogICAgZm9yIChpbnQgaSA9IHMgOyBpIDwgZTsgaSsrKSB7CiAgICAgICAgc3VtICs9IGZ1bmMoYSArIGkgKiBoKTsgLy8gRG9kYWogd2FydG/Fm2NpIHBvxZtyZWRuaWUKICAgIH0KCiAgICByZXR1cm4gc3VtICogaDsgLy8gWndyw7PEhyB3eW5payBjYcWCa293YW5pYQp9CmludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQp7IAogICAgTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKICAgIGludCByYW5rLHNpemUsbjsKICAgIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZyYW5rKTsKICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZzaXplKTsKICAgIGRvdWJsZSB0QmVnaW4sIHRFbmQ7CiAgICBkb3VibGUgYSA9IC0xLjA7IC8vIERvbG5hIGdyYW5pY2EKICAgIGRvdWJsZSBiID0gMS4wOyAgLy8gR8Ozcm5hIGdyYW5pY2EKICAgCgogICAgaWYgKHJhbmsgPT0gMCkKICAgIHsKICAgICAgICAKICAgICAgICBjb3V0PDwiUG9kYWogbGljemJlIHByemVkemlhbG93Ijw8ZW5kbDsKICAgICAgICBjaW4+Pm47CiAgICAgICAgdEJlZ2luID0gTVBJX1d0aW1lKCk7CiAgICAgICAgZG91YmxlIGFyZWEgPSB0cmFwZXpvaWRhbF9ydWxlKGYsIGEsIGIsIG4pOyAvLyBPYmxpY3ogcG9sZSBwb3dpZXJ6Y2huaQogICAgICAgIGRvdWJsZSBwaSA9IGFyZWEgKiAyOyAvLyBNbm/FvHlteSBwcnpleiAyLCBhYnkgdXp5c2thxIcgz4AKICAgICAgICBjb3V0IDw8ICJQcnp5YmxpxbxvbmEgd2FydG/Fm8SHIM+AOiAiIDw8IHBpIDw8IGVuZGw7CiAgICAgICAgdEVuZCA9IE1QSV9XdGltZSgpOwogICAgICAgIGNvdXQgPDwgIkN6YXMgZHppYcWCYW5pYTogIiA8PHNldHByZWNpc2lvbig1KSA8PCBmaXhlZCA8PHRFbmQgLSB0QmVnaW4gPDwiIHMiPDwgZW5kbDsKICAgICAgCiAgICB9CiAgICBNUElfQmNhc3QoJm4sIDEsIE1QSV9JTlQsIDAsIE1QSV9DT01NX1dPUkxEKTsKICAgIGludCBsb2NfbiA9IG4gLyBzaXplOyAKICAgIGludCBzdGFydCA9IGxvY19uICogcmFuazsKICAgIGludCBlbmQgPSBzdGFydCArIGxvY19uOwogIAogICAgZG91YmxlIGFyZWEgPSBjemVzY19jYWxraShmLCBhLCBiLCBuICxzdGFydCxlbmQpOyAvLyBPYmxpY3ogcG9sZSBwb3dpZXJ6Y2huaQogICAgZG91YmxlIHBpID0gYXJlYSAqIDI7IC8vIE1ub8W8eW15IHByemV6IDIsIGFieSB1enlza2HEhyDPgAogICAgY291dCA8PCAiUHJ6eWJsacW8b25hIHdhcnRvxZvEhyDPgDogIiA8PCBwaSA8PCBlbmRsOwogICAgCgoKICAgIE1QSV9GaW5hbGl6ZSgpOwogICAgcmV0dXJuIDA7Cn0K