Ребят кто с этим сталкивался, прошу помочь, времени колоссально не хватает, поможете решить на c++?
Код предоставлю с описанием, просто вставить все значения и функцию (возможно у кого такой же пример будет,на будущее пусть будет здесь)
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
| #include <iostream>
#include <Windows.h>
#include <math.h>
#include <iomanip>
#include <omp.h>
using namespace std;
#define n 2500 // Разбиения по У
#define m 2500 // Разбиения по Х
static double t1, t2;
static double a = , b = , c = , d = ; //пределы интегрирования по х(a,b), y(c,d)
//значения после точки лучше писать 20.0 это дает точность
static double integral;
static double dx = (b - a) / n; // это не трогать
static double dy = (d - c) / m; // это тоже
static double s, p = ; // p - интеграл посчитанный вручную, можно читсо значение написать на ваше усматрение
static double replay = 0; // переменная для повтора кода
double f(double x, double y)
{
return ; //Сюда записать функцию, если нужно значение Пи использовать переменную "PI"
}
/*если нужно получить параллельный код раскоментить строку с #pragma строка(50)
цикл while дает возможность несколько раз перезапустить один и тот же код строка(41)
переменная number_of_threads = дает фиксированное количество потоков строка(48)*/
int main()
{
SetConsoleCP(1251); // это для того что бы показывались русские буквы
SetConsoleOutputCP(1251); // это вывод в консоль русских букв
while (replay < 1) // Количество повторов (более 8 не ставить нагрузка сильная)
{
replay++;
int i, j;
double x0, y0;
double sum = 0;
int number_of_threads = 2; // изменение количества потоков
t1 = omp_get_wtime();
//#pragma omp parallel for private(i, j, sum, x0,y0) reduction(+:integral) num_threads(number_of_threads)
for (i = 0; i < n; i++)
{
x0 = a + dx / 2 + i * dx;
sum = 0;
for (j = 0; j < m; j++)
{
y0 = c + dy / 2 + j * dy;
sum += f(x0, y0); //накопление интегральной суммы
}
integral += sum;
}
integral *= dx * dy;
t2 = omp_get_wtime();
s = ((p - integral) / p);
cout << "\n Разбиений " << " X = "<< n << " " << " Y = "<< m << "\n";
cout << "\n Вычисление интеграла = " << integral << " Теоретическое значение = " << p << "\n";
cout << "\n Последовательно-параллельный код: " << t2 - t1 << "\n";
cout << "\n Эпсилон = " << s << "\n";
}
} |
|