С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 98, средняя оценка - 4.86
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
#1

Вычисление площади методом Монте-Карло - C++

11.11.2012, 16:05. Просмотров 14992. Ответов 28
Метки нет (Все метки)

Всем доброго время суток. Написать программу для вычисления методом Монте-Карло площади S тела, ограниченного кривыми x*y = a и http://www.cyberforum.ru/cgi-bin/latex.cgi?x + y = \frac{5}{2}*a. Параметр a > 0 вводится пользователем. Сравнить результат с точным значением http://www.cyberforum.ru/cgi-bin/latex.cgi?S = (\frac{15}{8} - 2 * ln2)*{a}^{2} http://www.cyberforum.ru/cgi-bin/latex.cgi?S = (\frac{15}{8} - 2 * ln2)*{a}^{2}. Искал на форуме, но таких тем практический нет. Помогите пожалуйста???? Заранее огромное спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2012, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисление площади методом Монте-Карло (C++):

Определение площади заштрихованной фигуры методом Монте-Карло - C++
Составить программу для определения методом Монте-Карло пло- щади заштрихованой фигуры. Вычислить фактическую площадь и сравнить ее с...

Составить программу для определения методом Монте-Карло площади заштрихованой фигуры - C++
Всем привет! Помогите,пожалуйста , решить задачу .Нужно найти площадь фигуры методом Монте Карла.Я про этот метод впервые слышу ,поэтому...

Вычисление числа Пи методом Монте-Карло - C++
Всем доброго время суток. Написать программу для вычисления значения \pi с помощью метода Монте-Карло. Для этого рассмотреть квадрат с...

Вычисление числа Пи методом Монте-Карло - C++
Решаю задачи по рандомным числам и столкнулся вот с такой"Вычисление числа Пи методом Монте-Карло". Подскажите как это реализовать в С++,...

Вычисление интеграла методом Монте-Карло - C++
Здравствуйте! Задача такая: пользователь в текстовом файле задает координаты точек (любое количество точек), программа считывает...

Вычисление интеграла методом Монте-Карло - C++
Нужно вычислить интеграл, как показано на первой картинке внизу темы. На второй картинке сам интеграл. Написал программу, но она выдает это...

28
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
21.11.2012, 17:59 #16
Функция InsideFigure будет одна, но в ней будет проверяться выполнение обоих условий.
0
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
21.11.2012, 21:59  [ТС] #17
Подскажите пожалуйста как правильно записать программу уже все пере пробовал:
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<cstdio> 
#include<cmath>
#include<ctime>
#include<cstdlib> 
#include<iostream> 
using namespace std;
bool InsideFigure(double x, double y, double a)
{
    return (a*a/ x) < y < (2.5*a - x);
}
bool InsideFigure(double x, double y, double a)
{
    return y > (a*a/ x);
}
 
double RandFloat(double b0, double b1);
 
 
    
int main() {
    double a = 0;
    
    cin >> a;   // В дальнейшем нам может понадобиться проверка введённого значения, но сейчас предположим, оно заведомо корректно.
    const double b0 = a/2, b1 = a*2; // Диапазон (одинаковый по осям x и y)
    const double S0 = (b1 - b0)*(b1 - b0);  // Площадь квадрата, в который вписана фигура
    const int N = 100000;  // Общее количество точек
    int n = 0;   // Количество точек внутри фигуры
    
    for(int i=0; i < N; ++i)
    {
        
        if (InsideFigure(RandFloat(b0, b1), RandFloat(b0, b1)))  // Проверяем пару координат на принадлежность фигуре
            ++n;  // Увеличиваем счётчик
    cout << "Monte-Carlo area: " << (S0 * n) / N << endl;
    cout << "Exact area: " << (1.875 - 2*log(2.0))*a*a << endl;
}
    system("pause");
    return 0;
}
 
double RandFloat(double min, double max, double b0, double b1)
 
{
    return double(rand()) / RAND_MAX * (b1 - b0) + b0;
}
Постоянно выскакивает ошибка: 1 IntelliSense: too few arguments in function call c:\users\администратор\documents\visual studio 2010\projects\c++\console\p1922\monte-carlo metod\monte-carlo metod\monte-carlo metod.cpp 32 62 Monte-Carlo metod????????? Заранее огромное спасибо.
0
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
25.11.2012, 15:04  [ТС] #18
Записал условие для InsideFigure() используя операции &&. Но осталась еще одна проблема записал функцию для RandFloat():
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
#include<cstdio> 
#include<cmath>
#include<ctime>
#include<cstdlib> 
#include<iostream> 
using namespace std;
bool InsideFigure(double x, double y, double a)
{
    return (a*a/ x) < y && y < (2.5*a - x);
}
 
double RandFloat(double min, double max, double b0, double b1)
 
{
    return double(rand()) / RAND_MAX * (b1 - b0) + b0;
}
 
 
    
int main() {
    double a = 0;
    
    cin >> a;   // В дальнейшем нам может понадобиться проверка введённого значения, но сейчас предположим, оно заведомо корректно.
    const double b0 = a/2, b1 = a*2; // Диапазон (одинаковый по осям x и y)
    const double S0 = (b1 - b0)*(b1 - b0);  // Площадь квадрата, в который вписана фигура
    const int N = 100000;  // Общее количество точек
    int n = 0;   // Количество точек внутри фигуры
    
    for(int i=0; i < N; ++i)
    {
        
        if (InsideFigure(RandFloat(b0, b1), RandFloat(b0, b1)))  // Проверяем пару координат на принадлежность фигуре
            ++n;  // Увеличиваем счётчик
    cout << "Monte-Carlo area: " << (S0 * n) / N << endl;
    cout << "Exact area: " << (1.875 - 2*log(2.0))*a*a << endl;
}
    system("pause");
    return 0;
}
Но при компиляции выскакивают ошибки:
1 IntelliSense: too few arguments in function call c:\users\администратор\documents\visual studio 2010\projects\c++\console\p1923\monte-carlo method\monte-carlo method\monte-carlo method.cpp 32 42 Monte-Carlo method
2 IntelliSense: too few arguments in function call c:\users\администратор\documents\visual studio 2010\projects\c++\console\p1923\monte-carlo method\monte-carlo method\monte-carlo method.cpp 32 61 Monte-Carlo method
3 IntelliSense: too few arguments in function call c:\users\администратор\documents\visual studio 2010\projects\c++\console\p1923\monte-carlo method\monte-carlo method\monte-carlo method.cpp 32 62 Monte-Carlo method
Каких исправить???? Заранее огромное спасибо.
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
25.11.2012, 15:45 #19
Посмотрим на запись функций. InsideFigure принимает 2 координаты и параметр a. Теперь поглядим, как её вызывают. Координаты, вычисленные через RandFloat, ей передаются, а третий параметр - упущен.
Функции RandFloat не нужны параметры min, max. Достаточно b0, b1.
0
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
25.11.2012, 22:10  [ТС] #20
Спасибо за ответ исправил как вы советуете:
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
#include<cstdio> 
#include<cmath>
#include<ctime>
#include<cstdlib> 
#include<iostream> 
using namespace std;
bool InsideFigure(double x, double y, double a)
{
    return (a*a/ x) < y && y < (2.5*a - x);
}
 
double RandFloat( double b0, double b1)
 
{
    return double(rand()) / RAND_MAX * (b1 - b0) + b0;
}
 
 
    
int main() {
    double a = 0;
    
    cin >> a;   // В дальнейшем нам может понадобиться проверка введённого значения, но сейчас предположим, оно заведомо корректно.
    const double b0 = a/2, b1 = a*2; // Диапазон (одинаковый по осям x и y)
    const double S0 = (b1 - b0)*(b1 - b0);  // Площадь квадрата, в который вписана фигура
    const int N = 100000;  // Общее количество точек
    int n = 0;   // Количество точек внутри фигуры
    
    for(int i=0; i < N; ++i)
    {
        
        if (InsideFigure(RandFloat(b0, b1), RandFloat(b0, b1)))  // Проверяем пару координат на принадлежность фигуре
            ++n;  // Увеличиваем счётчик
    cout << "Monte-Carlo area: " << (S0 * n) / N << endl;
    cout << "Exact area: " << (1.875 - 2*log(2.0))*a*a << endl;
}
    system("pause");
    return 0;
}
Но ошибка осталась тоже самая, но теперь одна:
1 IntelliSense: too few arguments in function call c:\users\администратор\documents\visual studio 2010\projects\c++\console\p1923\monte-carlo method\monte-carlo method\monte-carlo method.cpp 32 62 Monte-Carlo method???????
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
26.11.2012, 00:54 #21
Цитата Сообщение от isaak Посмотреть сообщение
too few arguments in function call
Перевести?
В строке 32 функция InsideFigure() по-прежнему вызывается с двумя аргументами, хотя ей нужно 3.
0
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
26.11.2012, 09:37  [ТС] #22
Я кажется понял в чем ошибка внес исправления:
C++
1
if (InsideFigure(RandFloat(b0, b1), RandFloat(b0, b1), S0))
Но компилятор сейчас не ругается, но программа как то страно считает площадь методом Монте-Карло. В чем опять ошибка???? Заранее огромное спасибо.
0
Миниатюры
Вычисление площади методом Монте-Карло  
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
26.11.2012, 15:19  [ТС] #23
Какой третий нужен параметр?????? Скорей всего так:
C++
1
if (InsideFigure(RandFloat(b0, b1), RandFloat(b0, b1), a))
Да??????
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
26.11.2012, 19:37 #24
Цитата Сообщение от isaak Посмотреть сообщение
Скорей всего так:
Разумеется, ведь именно a мы и используем при проверке - эта-то буковка и задаёт нашу фигуру.
1
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
26.11.2012, 21:59  [ТС] #25
А как повысить точность до 4 знаков, после запятой? Реально ли это сделать? Заранее огромное спасибо.
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
26.11.2012, 22:01 #26
Больше точек, да может ещё генератор получше - и точность повысится.
1
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
26.11.2012, 22:21  [ТС] #27
Nick Alte, а как сделать генератор по лучше?
На что нужно заменить
C++
1
2
3
4
5
double RandFloat( double b0, double b1)
 
{
    return double(rand()) / RAND_MAX * (b1 - b0) + b0;
}
Заранее огромное спасибо!
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
27.11.2012, 19:39 #28
По-хорошему надо, конечно, взять просто другой алгоритм, получше. Но чтобы не возиться, можно замутить что-то и из обычного rand:
C++
1
2
3
4
5
6
7
8
9
double RandFloat(double b0, double b1)
{
    double rv = 1;
    const double d = b1 - b0;
    const int iMax = 7 + (rand()%37);
    for(int i = 0; i < iMax; ++i)
        rv = fmod((rv + 1) * d * rand() / RAND_MAX, d);
    return rv + b0;
}
Разумеется, вычисляться такая функция будет уже не в пример дольше прежней.
1
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
27.11.2012, 20:28  [ТС] #29
Спасибо огромное !
0
27.11.2012, 20:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 20:28
Привет! Вот еще темы с ответами:

Вычисление интеграла геометрическим методом Монте-Карло - C++
Всем доброго времени суток. В универе дали задание: вычислить интеграл \int_{0}^{1}dx\int_{0}^{1-x}(1-x-y)dy геометрическим методом...

Вычисление объема произвольного тела методом Монте-Карло - C++
Всем доброго время суток. Написать программу для вычисления методом Монте-Карло объема V тела, ограниченного поверхностями: z = {x}^{2}...

Метод Монте-Карло в вычислении площади многоугольника - C++
Ребята, добрый день!! Мне нужно набросать программу для вычисления площади выпухлого n-угольника с использованием ООП и STL; Помогите...

Интегрирование методом Монте-Карло - C++
доброго времени суток форумчане, была поставлена задача написать программу которая будет вычислять интеграл методом Монте-Карло вот что я...


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

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

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