Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2022, 07:56   #1
mikhail_16
Новичок
Джуниор
 
Регистрация: 24.05.2018
Сообщений: 1
По умолчанию Вычисление интеграла методом прямоугольников через MPI с пересылкой данных между процессами

Здравствуйте!
Пытаюсь посчитать интеграл от функции 4/(1+x^2) методом прямоугольников на MPI.
Необходимо посчитать сначала последовательно, а потом параллельно.
Вместо числа PI (3.14) получается число 3.65 (в последовательном варианте).
В параллельном варианте получается 2.8.


Код прилагаю.


Недавно начал изучать параллельное программирование и пока не полностью всё понимаю.
Подскажите пожалуйста, в чём ошибка?




Код:

# include<stdio.h>
# include<stdlib.h>
# include<mpi.h>

double f(double x){                         // задаём функцию
	return (4/(1+x*x));
}



int main(int argc, char *argv[]) { 
MPI_Status Status;
int N = 6; // количество разбиений

double s_parall[N];


// пределы интегрирования
double a = 0;
double b =1 ;

double s_zero_process = 0; // сумма в нулевом процессе

double s_parall_new = 0; //сумма, которая считается в каждом процессе, кроме нулевого.
double summa_priem = 0; // сумма, которая передаётся в нулевой процесс из каждого процесса

int myrank;
double s = 0; // сумма (последовательная)
int size; // количество процессов (то, что мы вводим в командной строке)
double sum_of_sums = 0; //сумма вычисленных сумм от всех процессов
double x[N]; // массив аргументов
double delta_x = (b-a)/N; // шаг дельта икс





MPI_Init(&argc, &argv); // подключаем MPI
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

if(myrank==0) { // пусть основной процесс с номером 0 
printf("delta_x = %lf\n", delta_x);	

	for(int i = 0; i<N; i++) { // заполняем массив аргументов 
		if(i==0)
			{
				x[i] = a;
			}
		else
			{
				x[i] = x[0] + i*delta_x;
			}
		s += delta_x * ((f(x[i])+f(x[i+1]))/2);
		printf("x(%d) = %.20f\n", i, x[i]);
		printf("sum(%d) = %.20f\n", i, s);
	}
	printf("Posledovatelnaya summa: %lf\n",s); 


	for(int i = 0; i<N/size; i++){

		s_zero_process += (delta_x * (f(x[i])+f(x[i+1])))/2; // вычисление суммы нулевого процесса



	}
	for(int i = 1; i<size; i++) {
		MPI_Send(&x[i*N/size], N/size, MPI_DOUBLE, i, i, MPI_COMM_WORLD);
		MPI_Recv(&summa_priem, 1 , MPI_DOUBLE, i,i, MPI_COMM_WORLD, &Status); 
		sum_of_sums += summa_priem; 
	}
	
	
	sum_of_sums += s_zero_process;
	printf("Parallelnaya summa %lf\n",sum_of_sums); 
	
	
	

}








else
{

	
		MPI_Recv(&x, N/size , MPI_DOUBLE, 0,myrank, MPI_COMM_WORLD, &Status);
		for (int i=1; i<N/size; i++)
		{
			s_parall_new = s_parall_new+(delta_x * (f(x[i])+f(x[i+1])))/2;
			
		}
		MPI_Send(&s_parall_new, 1 , MPI_DOUBLE, 0,myrank, MPI_COMM_WORLD); 
	
}





MPI_Finalize(); 
return 0; 
}
mikhail_16 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление интеграла методом прямоугольников mustard Помощь студентам 3 13.12.2013 05:14
Delphi. Вычисление интеграла методом прямоугольников vika18 Помощь студентам 5 19.03.2013 00:10
С++ нахождение интеграла численным методом(прямоугольников) rybakov93 Общие вопросы C/C++ 0 09.12.2012 12:55
Вычисление интеграла методом левых прямоугольников. Ce4kok Общие вопросы Delphi 3 24.05.2011 20:35