Форум программистов, компьютерный форум, киберфорум
OpenMP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 2
1

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

21.01.2020, 21:00. Показов 2453. Ответов 3

Author24 — интернет-сервис помощи студентам
Всем привет! Помогите разобраться, пожалуйста, с программой.
Необходимо вычислить интеграл методом исключения с точностью ε=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
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.01.2020, 21:35 2
Цитата Сообщение от tratatanichka Посмотреть сообщение
Уже голову сломала, как можно исправить, чтобы заработало?
А что именно не работает?
Без openmp работает?
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,072
Записей в блоге: 3
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
22.01.2020, 06:01
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
Copyright ©2000 - 2024, CyberForum.ru