Редактирование: Вычисление числа Пи. Мирошник Глеб. 6 курс

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 9: Строка 9:
 
:<math>\frac{\pi}{4}</math>.
 
:<math>\frac{\pi}{4}</math>.
 
Также данный ряд можно получить разложением арктангенса 1 в ряд Тейлора, что даёт нам возможность оценить число π вычислением определённого интеграла
 
Также данный ряд можно получить разложением арктангенса 1 в ряд Тейлора, что даёт нам возможность оценить число π вычислением определённого интеграла
:<math>\int\limits_0^1 \frac{1}{1+x^{2}}\,dx = \frac{\pi}{4}</math>
+
:<math>\int\limits_0^1 \frac{1}{1+x^{2}}\,dx = frac{\pi}{4}</math>
 +
 
  
 
==Предлагаемое решение==
 
==Предлагаемое решение==
Строка 19: Строка 20:
  
 
==Листинг программ==
 
==Листинг программ==
===Для суммирования ряда===
 
<code>
 
&#35;include "stdafx.h"
 
&#35;include <iostream>
 
&#35;include "mpi.h"
 
&#35;include <math.h>
 
&#35;include <time.h>
 
using namespace std;
 
&#35;define Iterations 10000000 //количество итераций
 
 
 
int main() {
 
 
int ProcNum, ProcRank, i;
 
 
double x, MyPi = 0;
 
 
double Sum = 0;
 
 
double TotalTime;
 
 
clock_t StartClock, EndClock; // объявляем стартовую и конечную переменную таймера и инициализируем стартовую переменную
 
 
StartClock = clock();
 
 
MPI_Init(NULL, NULL); // инициализируем MPI
 
 
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum); // записываем количество процессов с переменную ProcNum
 
 
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank); // записываем номер процесса в переменную ProcRank
 
 
for (i = ProcRank; i < Iterations; i += ProcNum) 
 
 
{
 
 
x = pow(-1,ProcRank)*4/(2*i + 1);
 
 
Sum += x;
 
 
}
 
 
MPI_Reduce(&Sum, &MyPi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); // пердварительные суммы Sum в переменную MyPi
 
 
MPI_Finalize(); // завершаем работу MPI
 
 
if (ProcRank == 0)
 
 
{
 
 
 
EndClock = clock(); // останавливаем таймер и переходим к выводу результатов на экран
 
 
printf("Number of iterations = %i\n", Iterations);
 
 
printf("Obtained value of Pi = %3.20f\n", MyPi);
 
 
double pi = 3.1415926535897932384626433832795;
 
 
printf("Refrence value of Pi = %3.20f\n", pi);
 
 
printf("Error = %3.20f\n", abs(MyPi - pi));
 
 
TotalTime = (double)(EndClock - StartClock) / CLOCKS_PER_SEC;
 
 
printf("Computing time = %f sec\n", TotalTime);
 
 
}
 
}
 
 
</code>
 
 
===Для вычисления интеграла===
 
 
<code>
 
<code>
&#35;include "stdafx.h"
+
#include "stdafx.h"
&#35;include <iostream>
+
#include <iostream>
&#35;include "mpi.h"
+
#include "mpi.h"
&#35;include <math.h>
+
#include <math.h>
&#35;include <time.h>
+
#include <time.h>
 
using namespace std;
 
using namespace std;
&#35;define Iterations 10000000 //количество итераций
+
#define Iterations 10000000 //количество итераций
  
  
Строка 165: Строка 94:
  
 
==Компьютерная реализация==
 
==Компьютерная реализация==
[[:File:CompTech.rar|Оценка числа π]]
 
  
==Результаты (при 10млн итераций)==
+
 
===Для суммирования ряда===
+
==Результаты==
 
{| class="wikitable" width="300" floating="center"
 
{| class="wikitable" width="300" floating="center"
 
!Количество процессов
 
!Количество процессов
!Ошибка вычисления
+
!Время рассчета (сек)
!Время расчёта (сек)
 
 
|-
 
|-
 
|1  
 
|1  
|33.02161870037517132914
+
|184.2
|1.757
 
 
|-
 
|-
 
|2
 
|2
|0.00000010000398731336
+
|91.6
|0.979
 
|-
 
|3
 
|10.37762764928963399313
 
|0.750
 
 
|-
 
|-
|4
+
|5
|0.00000009999904815317
+
|39.4
|0.727
 
|}
 
===Для интегрирования===
 
{| class="wikitable" width="300" floating="center"
 
!Количество процессов
 
!Ошибка вычисления
 
!Время расчёта (сек)
 
 
|-
 
|-
|1
+
|10
|0.00000000000006217249
+
|19.2
|0.246
 
 
|-
 
|-
|2
+
|20
|0.00000000000019184654
+
|9.9
|0.144
 
 
|-
 
|-
|3
+
|30
|0.00000000000011946000
+
|8.1
|0.128
 
 
|-
 
|-
|4
+
|40
|0.00000000000010702550
+
|7.5
|0.112
 
 
|}
 
|}
  
 
==Выводы==
 
==Выводы==
* При увеличении количества процессов сокращается время выполнения программы, но относительный выигрыш по времени уменьшается.
+
* Для малого числа узлов в сетке использовать многопроцессорные вычисления не выгодно: время работы программы увеличивается.
* Интегрирование при одинаковом количестве итераций даёт более точный результат, а так же результат интегрирующей программы не зависит от количества процессов (при запуске программы с чётным количеством процессов появляется ошибка больше 100%).
+
* При увеличении числа процессоров относительный выигрыш во времени уменьшается.
* Ошибка вычисления при интегрировании связана с ограниченным количеством символов типа double; ошибка вычисления при суммировании может быть уменьшена увеличением количества элементов ряда.
+
 
 +
==Полезные ссылки==
 +
[https://ru.wikipedia.org/wiki/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BF%D0%BB%D0%BE%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D0%B8 Уравнение теплопроводности]
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)