Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 2
1

OpenMP метод исключения(фон Неймана)

21.01.2020, 21:00. Просмотров 778. Ответов 3

Всем привет! Помогите разобраться, пожалуйста, с программой.
Необходимо вычислить интеграл методом исключения с точностью ε=0.007.
Есть код, но он неправильный.
Уже голову сломала, как можно исправить, чтобы заработало?

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
#include <iostream>
#include <random>
#include <omp.h>
#include <cmath>
#include <math.h>
using std::cout;
using std::endl;
 
 
 
double f(double x){
    return (x * x * x * sin(x) * sin(x)) / sqrt(x * x + 8); 
}
 
int main() {
    double sum = 0.0, a = 0.0, b = 3.14, eps = 0.007, ans, h=1.92117;
    int n = 10000000, n_in=0;
 
    
    do{
        #pragma omp parallel     
        {
            std::default_random_engine randomize;
            std::uniform_real_distribution<double> unirnd(0.0,1.0);
            randomize.seed(100);     
    
            double x,y;
            #pragma omp for private(x) reduction(+:sum) 
 
                for(int i = 0;i <= n;i++){
                    x=a + (b - a)*unirnd(randomize);    
                    y=h*unirnd(randomize);  
                        if (y<=f(x)){
                                    i_in++; 
                            #pragma omp atomic 
                            sum+=f(x)/(n_in/n);
                        }
            }
            ans=sum / n;     
        }
    }
    while(eps >= ans);  
    cout << ans;     
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2020, 21:00
Ответы с готовыми решениями:

алгоритм фон Неймана
блин... помогите пожалуйста... надо упорядочить массив по неубыванию с помощью алгоритма...

Простая модель ЭВМ фон Неймана
задача с классами (ввод данных, операции над ними) Программа должна содержать 2-3 метода в 2-3...

Архитектура Фон Неймана: Как процессор различает команды и данные?
Недавно читал статью про архитектуру вот наткнулся на такую строчку &quot;В памяти компьютера как данные...

Распараллелить метод Гаусса (OpenMP)
Доброго времени суток, дамы и господа! Столкнулась с проблемой следующего рода - не получается...

3
4598 / 3093 / 1294
Регистрация: 07.05.2019
Сообщений: 9,570
Записей в блоге: 1
21.01.2020, 21:35 2
Цитата Сообщение от tratatanichka Посмотреть сообщение
Уже голову сломала, как можно исправить, чтобы заработало?
А что именно не работает?
Без openmp работает?
0
бах-бах и в продакшен!
1715 / 1023 / 387
Регистрация: 23.09.2014
Сообщений: 3,302
Записей в блоге: 4
22.01.2020, 01:59 3
Цитата Сообщение от tratatanichka Посмотреть сообщение
как можно исправить, чтобы заработало?
Исправил деление на ноль.
Ответ 23.5517
А какой должен быть???
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <random>
#include <omp.h>
#include <cmath>
 
using std::cout;
using std::endl;
 
double f(double x)
{   return (x * x * x * sin(x) * sin(x)) / sqrt(x * x + 8);
}
 
int main()
{   double sum  = 0.0, a = 0.0, b = 3.14, eps = 0.007, ans, h = 1.92117;
    int    n    = 10000000;
    double n_in = 0.;
 
    do
    {   
        #pragma omp parallel
        {   std::default_random_engine randomize;
            std::uniform_real_distribution<double> unirnd(0.0, 1.0);
            randomize.seed(100);
 
            double x,y;
            
            #pragma omp for private(x) reduction(+:sum)
            for(int i = 0; i <= n; i++)
            {   x = a + (b - a)*unirnd(randomize);
                y = h*unirnd(randomize);
                if (y <= f(x))
                {   n_in++;
                    #pragma omp atomic
                    sum += f(x)/(n_in/n);
                }
            }
            
            ans = sum / n;
        }
    } while(eps >= ans);
    
    cout << ans;
    return 0;
}
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 2
22.01.2020, 06:01  [ТС] 4
Цитата Сообщение от XLAT Посмотреть сообщение
Ответ 23.5517
А какой должен быть???
Должно быть 2.422 ну и погрешность какая-то, но тут очень большая получается...

Цитата Сообщение от XLAT Посмотреть сообщение
while(eps >= ans);
еще думаю, что вот это неправильно, но на что исправить, я не знаю, смысла ведь нет считать разницу между итерациями?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2020, 06:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

C++ OpenMP Определенный интеграл - метод Симпсона
Ребят, имею следующее задание. В С++ не мастер, но я никак не могу понять, как реализовать этот...

Распараллелить метод Зейделя-Гаусса используя OpenMP
Сама программа вот: #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;math.h&quot; #include...

OpenMP. Время выполнения программы больше чем без OpenMP
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там...

Создать шаблон функции, выполняющий сортировку слиянием (Метод Фон Неймана) в массиве
Создать шаблон функции, выполгяющий сортировку слиянием (Метод Фон Неймана) в массиве....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.