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

Метод Монте Карло (неправильные значения)

25.05.2015, 00:27. Просмотров 418. Ответов 2
Метки нет (Все метки)

Пишу программу для подсчета определенного интеграла 3мя способами: прямоугольников, трапеций и Монте Карло. Первые 2 реализованы правильно, судя по результатам тестирования, а вот МК не универсален. Он работает правильно, например от 0 до 3, а от 1 до 3 в данной формуле выдает неправильное значение. Если значение интеграла должно быть отрицательным, то он выдает положительное число, большее, чем нужно. Вот материал, которым пользовался при реализации:
Вычисление интеграла методом Монте-Карло
Рассчет определенного интеграла методом Монте-Карло.

Сам код:
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
#include "iostream"
#include "cmath"
#include <time.h>
using namespace std;
 
//метод прямоугольников, трапеций, Монте-Карло
 
double Func(double x) 
{
    return pow(x,2)*sin(x);
}
 
double Method_Pr(double a, double b, int n) 
{
    int i;
    double result, h;
    result = 0;
    h = (b - a) / n; 
    for (i = 0; i < n; i++)
    {
        result += Func(a + h * (i + 0.5)); 
    }
    result *= h;
    return result;
}
 
double Method_Trap(double a, double b, int n)
{
    double result, h;
    result = 0;
    h = (b - a) / n;
    double the_result = (Func(a) + Func(b)) / 2;
    while (a<b-h)
    {   
        a = a + h;
        result += Func(a);
    }
    result = h*(the_result + result);
    return result;
}
 
 
double Method_Monte_Carlo(double a, double b, int n)
{
    srand(time(NULL));
    double t, x, z;
    double result;
    int i, HIT=0;
    double minz,maxz;
    maxz = Func(a);
    minz = Func(a);
 
    for (x=a; x <= b; x+=(b-a)/n) 
    {
        if (Func(x) > maxz)
            maxz = Func(x);
        if (Func(x) < minz)
            minz = Func(x);
    }
    for (i = 0; i < n; i++) 
    {
        x = (double)a+(b-a)*rand();
        z = (double)(minz+(maxz-minz))*rand();
        
        if (z < Func(x))
            HIT++;
    }
 
    result = (double)HIT*(maxz-minz)*(b-a) / n;
    return result;
}
 
int main()
{
    double integral;
    integral = Method_Pr(1, 6, 100);
    printf("The value of the integral(pr) is: %lf \n", integral);
    integral = Method_Trap(1, 6, 1000);
    printf("The value of the integral(trap) is: %lf \n", integral);
    integral = Method_Monte_Carlo(1, 6, 1000);
    printf("The value of the integral(mc) is: %lf \n", integral);   
    system("pause");
    return 0;
}
Добавлено через 28 минут
Добавил кое-что
C++
1
2
x = (double)a+(b-a)*rand()/RAND_MAX;
z = (double)(minz+(maxz-minz))*rand()/RAND_MAX
В некоторых случаях помогло, но все равно не то, что нужно. От -3 до 3 два первых метода выдают 0, а он выдал 11.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2015, 00:27
Ответы с готовыми решениями:

Метод Монте-Карло
С помощью метода Монте-Карло найдите оценку объема шара, центр которой...

Метод Монте-Карло
как мне перевести этот код на с++..... помогите пожалуста(( program...

Метод монте Карло
Здравствуйте! Посмотрите, пожалуйста, почему программа неправильно считает...

Метод Монте-Карло
Помогите написать программу на С++. Из множества 1, 2, ..., n, случайным...

метод Монте-Карло
Трехмерное тело образовано объединением нескольких сфер произвольного размера и...

2
zss
Модератор
Эксперт С++
7258 / 6703 / 4244
Регистрация: 18.12.2011
Сообщений: 17,692
Завершенные тесты: 1
25.05.2015, 08:07 2
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
double Method_Monte_Carlo(double a, double b, int n)
{
    srand(time(NULL));
    double maxz=Func(a);
    double minz=maxz;
    for (double x=a; x <= b; x+=(b-a)/n) 
    {
        double y=Func(x);
        if (y > maxz)
            maxz = y;
        if y < minz)
            minz = y;
    }
   const int N=100000; // N - это количество испытаний
   int HIT=0;
   for (i = 0; i < N; i++) 
   {
        x = a+(b-a)*rand()/RAND_MAX;
        z = minz+(maxz-minz)*rand()/RAND_MAX;
        double y=Func(x);
        if (y>0 && z<y)
            HIT++;
       else if(y<0 && z>y)
           HIT--;
    }
 
    result = (maxz-minz)*(b-a)*HIT/ N;
    return result;
}
0
vladbutler
0 / 0 / 1
Регистрация: 19.04.2015
Сообщений: 4
25.05.2015, 10:06  [ТС] 3
Попробовал с вашими исправлениями, стало немного лучше: теперь на интервале от -3 до 3 работает правильно, но от -3 до 4 выдает не правильное значение и, как прежде, от 1 до 3 - тоже неправильное.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2015, 10:06

Метод Монте-Карло
Помогите написать программу для вычисления определенного интеграла методом...

метод Монте-Карло
всем привет, у меня вопрос по методу Монте - Карло, у меня есть код, #include...

вроде метод монте карло
распишите пожалуйста что делает это программа?? int i,a,b,n,k,c,d,e,f; double...


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

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

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