Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Dasha_K
3 / 3 / 0
Регистрация: 21.12.2009
Сообщений: 81
#1

Вычисление интеграла с применением OpenMP - C++

26.04.2012, 06:57. Просмотров 1933. Ответов 10
Метки нет (Все метки)

Всем доброе утро.
Написала программу вычисления интеграла с применением OpenMP, но она выдаёт ошибку, ошибку выдаёт при запуске консоли, я не понимаю почему????
Ошибка такого содержания, типа: "Запуск программы невозможен, т. к. на компьютере отсутствует библиотека vcompd.dll. Попробуйте переустановить программу"
И ещё не могу присвоить количество потоков для распараллеливания..... Что делать??? Может кто подскажет????
Вот собственно сам код:

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Dasha_integral.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <math.h>
#include <omp.h>
#include <stdlib.h>
#include <locale.h>
#include <clocale>
#include <iostream>
#include <stdio.h>
 
 
 
//Количество интервалов, на которые разбиваем область интегрирования
const int n = 10;
//подинтегральная функция
double f(double x)
{
    return ((1/(2*tan(0.7*x)))/((log(x+1.48))/2));
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    //включаем поддержку русского языка
    setlocale(LC_CTYPE,"RUSSIAN");
 
    //объявление переменных для определения затраченного времени на вычисления
    double st_time, end_time, tick, tick1;
    tick = omp_get_wtick();
 
    //диапазон интегрирования
    double a = 0.2, b = 0.5, h;
 
    //отключение выбора потока нитей
    omp_set_dynamic(false);
 
    //задание числа используемых нитей
    omp_set_num_threads(9);
 
    //определение типа переменных блока
int nTheads, theadNum;
#pragma omp parallel  private(nTheads, theadNum)
{
    nTheads = omp_get_num_threads(); //функция для определения количества нитей в текущей параллельной области
    theadNum = omp_get_thread_num(); //функция для определения номера нити в текущей параллельной области
    //вывод на экран номера и количество ичпользуемых нитей
    printf("OpenMP поток №%d из %d потоков \n", theadNum, nTheads);
}
 
//переменная для хранения суммы, значения аргумента
double sum = 0.0, x;
int i;
 
//сохраняем начальное время вычисления
st_time = omp_get_wtime();
 
#pragma omp parallel for default(shared)\
                         private (i) schedule(static,10)\
                         reduction (+:sum)
 
for (i = 0; i<n; i++)
{
    h = (b-a)/n;
    x = a + i*h;
    sum += f(x);
}
 
//сохраняем время окончания вычислений
end_time = omp_get_wtime();
tick1 = end_time - st_time;
 
//выводим сообщение об окончании работы потоками
#pragma omp parallel private(theadNum)
{
    theadNum = omp_get_thread_num();
    printf("Поток №%d окончил вычисление... \n", theadNum);
}
 
//вычисление итогового результата и печать его на экран
sum = sum/n;
printf("Результат равен %f (Ошибка вычисления: %f)\n", sum, 1.0-sum);
 
//выводим время, затраченное на вычисление интеграла
printf("Время затраченное на вычисление %f\n", tick1);
std::system ("pause");
 
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2012, 06:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисление интеграла с применением OpenMP (C++):

Вычисление функции с использованием OpenMP на нескольких ядрах - C++
Дана функция y=\frac{{x}^{2}-7x+10}{{x}^{2}-8x+12} на промежутке . Нужно вычислить её значения и записать время выполнения программы на 1,...

Вычисление квадратного корня с применением рекурсии - C++
Здравствуйте. Помогите, пожалуйста, задача такая: Вычислить значение x = корень(а), используя формулу , xn=1/2(xn-1+a/xn-1 ) в качестве...

OpenMP. Время выполнения программы больше чем без OpenMP - C++
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там сказано:&quot;Директива #pragma omp for...

Вычисление интеграла - C++
Необходимо вычислить интеграл (сам интеграл задан функцией, например Functoin) методом правых прямоугольников, воспользовавшись критерием...

Вычисление интеграла - C++
помогите пожалуйста я вообще не знаю как сделать интеграл

Вычисление интеграла - C++
вычислить интеграл \int_{0}^{6}\frac{exp^sqrt{\frac{6-x}{6+x}}}{(6+x)*\sqrt{36-x^2}} помогите с кодом вычисления данного...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
27.04.2012, 14:24 #2
код копипастила?
OpenMP то подключен?
0
Dasha_K
3 / 3 / 0
Регистрация: 21.12.2009
Сообщений: 81
30.04.2012, 19:56  [ТС] #3
Код я копировала из своей программы, которая была написана за день до моего обращения, но там подключена библиотека OpenMP.
0
f1nger
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 114
14.11.2016, 00:57 #4
Был ли решен вопрос? Так же нуждаюсь в ответе.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
14.11.2016, 01:10 #5
Цитата Сообщение от f1nger Посмотреть сообщение
Был ли решен вопрос? Так же нуждаюсь в ответе.
только шесть лет прошло всего-то. А там много-поточное интегрирование.

Не по теме:

Забавно, действительно, - столько просмотров и столько обломов. Тема - как бригантина, - как назовёшь, так и поплывет. Независимо от того, когда, кем, и из чего построена.

0
f1nger
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 114
14.11.2016, 01:36 #6
Верно подмечено
Заинтересовался потому что искал подобное, обратил вниманние на этот кодом, вот только ошибку найти не могу.
0
Sefihan
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 8
15.12.2016, 21:09 #7
f1nger, Тебе помощь нужна еще?
0
f1nger
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 114
15.12.2016, 21:27 #8
Только ради интереса.
0
Sefihan
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 8
16.12.2016, 15:57 #9
f1nger, Поправил точку входа. Программа считает криво. Погрешности большие.
Если будет интересно, то могу свой вариант скинуть.
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
70
71
72
73
74
75
76
77
78
79
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <omp.h>
 
const int n = 1e4;
 
double f(double x){
    return sin(x);
}
 
int main(int argc, char* argv[])
{
    //включаем поддержку русского языка
    setlocale(LC_CTYPE, "RUSSIAN");
 
    //объявление переменных для определения затраченного времени на вычисления
    double st_time, end_time, tick, tick1;
    tick = omp_get_wtick();
 
    //диапазон интегрирования
    double a = 0, b = 3.14159265358979f, h;
 
    //отключение выбора потока нитей
    omp_set_dynamic(false);
 
    //задание числа используемых нитей
    omp_set_num_threads(9);
 
    //определение типа переменных блока
    int nTheads, theadNum;
    #pragma omp parallel  private(nTheads, theadNum)
    {
        nTheads = omp_get_num_threads(); //функция для определения количества нитей в текущей параллельной области
        theadNum = omp_get_thread_num(); //функция для определения номера нити в текущей параллельной области
        //вывод на экран номера и количество ичпользуемых нитей
        printf("OpenMP поток №%d из %d потоков \n", theadNum, nTheads);
    }
 
    //переменная для хранения суммы, значения аргумента
    double sum = 0.0, x;
    int i;
 
    //сохраняем начальное время вычисления
    st_time = omp_get_wtime();
 
    #pragma omp parallel for default(shared)\
                         private (i) schedule(static,10)\
                         reduction (+:sum)
 
    for (i = 0; i<n; i++)
    {
        h = (b - a) / n;
        x = a + i*h;
        sum += f(x);
    }
 
    //сохраняем время окончания вычислений
    end_time = omp_get_wtime();
    tick1 = end_time - st_time;
 
    //выводим сообщение об окончании работы потоками
#pragma omp parallel private(theadNum)
    {
        theadNum = omp_get_thread_num();
        printf("Поток №%d окончил вычисление... \n", theadNum);
    }
 
    //вычисление итогового результата и печать его на экран
    sum = sum / n;
    printf("Результат равен %f (Ошибка вычисления: %f)\n", sum, 1.0 - sum);
 
    //выводим время, затраченное на вычисление интеграла
    printf("Время затраченное на вычисление %f\n", tick1);
    std::system("pause");
 
    return 0;
}
0
f1nger
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 114
16.12.2016, 17:25 #10
В ЛС, если можете.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
16.12.2016, 17:59 #11
Цитата Сообщение от f1nger Посмотреть сообщение
В ЛС, если можете.
Не может (см. правила форума, п. 4.6).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2016, 17:59
Привет! Вот еще темы с ответами:

Вычисление интеграла - C++
Считаю интеграл на промедутке от -1 до 3... Интеграл a*a*a*a. Точность вычисления 0.00001... Код выполняется 10-12 секунд. Это нормально...

вычисление интеграла - C++
Даны вещественные числа a, b. Значения функции f(x)=(x+1)2√lg x; a=2; b=10; записать в массив. Вычислить значение интеграла, используя: ...

Вычисление интеграла - C++
задача такая Вычислить с точностью\varepsilon интеграл ,где y=f(x) - прямая проходящая через точки A(c,d) и B - точку минимума ...

Вычисление интеграла и табуляция - C++
Доброго времени суток! Написал программу в делфи и паскале, дошла очередь до С++ , а как писать там я не понимаю! Почитал статьи про...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.12.2016, 17:59
Ответ Создать тему
Опции темы

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