Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/196: Рейтинг темы: голосов - 196, средняя оценка - 4.68
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
1

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

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

Author24 — интернет-сервис помощи студентам
Всем доброго время суток. Написать программу для вычисления методом Монте-Карло площади S тела, ограниченного кривыми x*y = a и https://www.cyberforum.ru/cgi-bin/latex.cgi?x + y = \frac{5}{2}*a. Параметр a > 0 вводится пользователем. Сравнить результат с точным значением https://www.cyberforum.ru/cgi-bin/latex.cgi?S = (\frac{15}{8} - 2 * ln2)*{a}^{2} https://www.cyberforum.ru/cgi-bin/latex.cgi?S = (\frac{15}{8} - 2 * ln2)*{a}^{2}. Искал на форуме, но таких тем практический нет. Помогите пожалуйста???? Заранее огромное спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2012, 16:05
Ответы с готовыми решениями:

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

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

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

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

28
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
12.11.2012, 18:46 2
В чём проблемы-то? Неясен сам принцип Монте-Карло, или логарифмы считать не получается?
0
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
12.11.2012, 23:12  [ТС] 3
Суть метода начал понимать: Фигура лежит внутри некоторой области известной площади So. Случайным образом кидаем n точек в эту область. Подсчитываем количество m точек попавших внутрь фигуры (внутрь хотя бы одного прямоугольника). Площадь искомой фигуры Sf = So * m / n. Чем больше точек, тем точнее результат. Но как это реализовать программно тем более на C++ ума не приложу????

Добавлено через 4 минуты
Вот что еще удалось найти, но это только сухая теория: "Предположим, что нам нужно вычислить площадь плоской фигуры S.
Это может быть совсем произвольная фигура с криволинейной границей, заданная графически или аналитически, связная или состоящая из нескольких кусков. Пусть это будет фигура, изображенная на рис. 1, и предположим, что она вся расположена внутри единичного квадрата.
Выберем в квадрате N случайных точек. Обозначим через N' число точек, попавших при этом внутрь S. Геометрически очевидно, что площадь S приближенно равна отношению N'/N. Чем больше будет N, тем больше будет точность этой оценки.
Например,выбрано N=40 точек. Из них N'=12 точек оказались внутри фигуры S. Отношение N'/N=12/40=0,30, в то время как истинная площадь S равна 0,35).
Две особенности метода Монте-Карло. Первая особенность метода — простая структура вычислительного алгоритма. Как правило, составляется программа для осуществления одного случайного испытания (в примере надо выбрать случайную точку в квадрате и проверить, принадлежит ли она S). Затем это испытание повторяется N раз, причем каждый опыт не зависит от всех остальных, и результаты всех опытов усредняются.
Поэтому иногда метод Монте-Карло называют методом статистических испытаний.
Вторая особенность метода: ошибка вычислений, как правило пропорциональна , где D – некоторая постоянная, a N – число испытаний. Из этой формулы видно, что для того, чтобы уменьшить ошибку в 10 раз (иначе говоря, чтобы получить в ответе еще один верный десятичный знак), нужно увеличить N (то есть объем работы) в 100 раз.
Ясно, что добиться высокой точности на таком пути невозможно. Поэтому обычно говорят, что метод Монте-Карло особенно эффективен при решении тех задач, в которых результат нужен с небольшой точностью (5-10%)."

Добавлено через 50 минут
Гипербола - https://www.cyberforum.ru/cgi-bin/latex.cgi?x * y = {a}^{2} и прямая - https://www.cyberforum.ru/cgi-bin/latex.cgi?x + y = \frac{5}{2} * a, проходящая в верхней полуплоскости оси Y. Площадь фигуры полученной при пересечении этих кривых находится в I-ой четверти полуплоскости XOY. Подскажите пожалуйста как это реализовать на C++???? Заранее огромное спасибо.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
13.11.2012, 19:06 4
Проверка осуществляется очень просто. Очевидно, что прямая будет проходить над гиперболой. Слева и снизу наша фигура ограничена осями X и Y. Верхнюю и правую планку возьмём по корням, численно они совпадут, потому что фигура симметрична относительно линии в 45 градусов. Ибо и прямая, и гипербола относительно этой линии симметричны. Итак, мы получим ограничивающую площадь - квадрат со стороной b (эту величину, надеюсь, вычислить сумеешь), диапазоны x и y - от 0 до b. Начинаешь генерировать пары координат в этом диапазоне. Точка находится внутри фигуры, если она выше гиперболы, то есть https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}*{y}>{a}^{2} и одновременно ниже прямой: https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}+{y}<\frac{5}{2}*{a}
0
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
13.11.2012, 22:28  [ТС] 5
Спасибо за пояснения попробовал сам, кое-что написать, но получается полный бред с границами по x и y и с вычислением площади:
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
#include<cstdio> 
#include<cmath>
#include <ctime>
#include<cstdlib> 
using namespace std;
int main() 
{ 
int Nmax;  //Максимальное количество точек
int n =0 ;  //Максимальное количество точек
double a,x,y, S0,S; 
cout <<"Enter Nmax";
cin >> Nmax;
cout <<"Enter a";
cin >> a;
S0 =2*2* a*a;
for (int i= 0; i <= Nmax; i++) {
x =(a*a - (a*a)/2 ) / Nmax;
for (int j = 0; j <= Nmax; j++) {
y = (double(5/2) * a - 2 * a)/Nmax;
}}
S = S0 * n/pow(Nmax +1, 2);
cout << "S = "<<S<<" : " <<((double(15/8) - 2 * log (2) * a*a)) << endl;
return 0;
 }
Помогите пожалуйста????. Заранее огромное спасибо.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
14.11.2012, 18:39 6
Замечание первое. Не найдено решение системы уравнений, определяющее границы квадрата (то самое b).
Замечание второе. Вычисления, выполняющиеся внутри циклов, лишены какого бы то ни было смысла.
Замечание третье. Метод Монте-Карло подразумевает использование не регулярной сетки, а случайных чисел.
0
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
14.11.2012, 21:16  [ТС] 7
Я не знаю как вычислить параметр b или как его выразить через a???? Весь интернет облазил кругом сухая теория нет ни одного практического примера. На сколько я понял площадь искомой фигуры есть разность площадей отрезка прямой и отрезка гиперболы, помещенные в квадрат. Ума не приложу как это реализовать на C++???? Люди добрые помогите пожалуйста???? Четвертые сутки бьюсь. Заранее огромное спасибо.

Добавлено через 5 минут
Если бы на парах вместо сухой теории разбирали больше практику не пришлось бы так часто спрашивать на форуме. Препод отвратный приверженец Бейсика и Паскаля, C++ не в зуб нагой поэтому дает сухую теорию.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
14.11.2012, 22:11 8
Для начала надо определиться с математикой. Решить простую скучную систему уравнений https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{matrix}<br />
x*{y}={a}^{2}\\ <br />
{x}+{y}=\frac{5}{2}*{a}<br />
\end{matrix}\right.. Наибольшее из двух решений будет b.
Насчёт "площадей" прямой и гиперболы можно не заморачиваться, суть не в этом.
Надо сгенерировать нужное количество пар случайных чисел, в интервале от 0 до b. Это будут координаты наших пробных точек. Те точки, что попадают в фигуры (то есть, удовлетворяют приведённому мной ранее условию), надо подсчитывать. Соотношение количества этих точек с общим количеством - примерно такое же, как соотношение площади квадрата и площади нашей фигуры. Простая пропорция.
0
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
15.11.2012, 12:03  [ТС] 9
Решил систему уравнений у меня получились два корня: https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{1}=\frac{13}{2*a},
https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{2}=\frac{7}{2*a} и https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}_{1}= \frac{2*{a}^{3}}{13}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}_{2}= \frac{2*{a}^{3}}{7}. Какое из них будет равно b?????? Как реализовать это на C++ ума не приложу???? Люди добрые помогите пожалуйста!!!! Заранее огромное спасибо.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
15.11.2012, 18:46 10
Система решена неверно. Решения не подходят второму уравнению.
0
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
18.11.2012, 16:29  [ТС] 11
x1 = 2*a, y1= a/2; x2 = a/2, y2 = 2*a.
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
#include<cstdio> 
#include<cmath>
#include <ctime>
#include <iomanip>
#include<cstdlib> 
using namespace std;
int main() 
{ 
int i, N = 1000000, M = 0; 
float S, x, y, x1, x2, y1, y2, a;
cout << "Enter  a";
cin >> a;
x1 = 2*a;
x2 = (float)a/2;
y1 = (float)pow(a,2.0)/x1;
y2 = (float)5/2 * a - x2;
 for ( i = 1; i <= N; i ++ ) { 
  x = RandFloat (x1, x2);  // случайная координата x 
  y = RandFloat (y1, y2);  // случайная координата y 
  if ( InsideFigure(x,y) ) // если точка внутри фигуры, 
    M ++;                  // то увеличить счетчик 
  } 
 S = M * fabs((x2 - x1) * (y2 - y1)) / N; 
}
cout<<"Calc  Value of S : "<<setprecision(5)<<M * fabs((x2 - x1) * (y2 - y1)) / N<<endl;
    cout<<"Check Value of S : "<<setprecision(5)<<((float)15/8  - 2 * log (2))* pow(a,2.0)<<endl;
    cin.get();
    return 0;
}
Люди добрые помогите пожалуйста??????? Неделю бьюсь, всю теорию перечитал??????? Заранее огромное спасибо.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
19.11.2012, 16:10 12
Вот теперь программа похожа на правду.
Рекомендации:
- квадрат a проще и эффективнее записать как a*a;
- воспользоваться тем, что x1 = y2 и x2 = y1;
- сократить ненужные и повторяющиеся вычисления;
- использовать double вместо float;
- объявлять переменные там, где они используются впервые;
- написать RandFloat с использованием стандартного rand;
- написать InsideFigure.
Для простоты предположим положительное a
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
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))*a*a << endl;
}
По поводу случайных чисел: функция rand возвращает целые значения в диапазоне от 0 до достаточно большого числа, определённого константой RAND_MAX. Преобразовать такое число в вещественное в заданном диапазоне (основная цель RandFloat) несложно.

Проверка принадлежности InsideFigure - функция, возвращающая значение bool и проверяющая соблюдение описанных выше условий.
1
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
19.11.2012, 23:20  [ТС] 13
Цитата Сообщение от Nick Alte Посмотреть сообщение
По поводу случайных чисел: функция rand возвращает целые значения в диапазоне от 0 до достаточно большого числа, определённого константой RAND_MAX. Преобразовать такое число в вещественное в заданном диапазоне (основная цель RandFloat) несложно.

Проверка принадлежности InsideFigure - функция, возвращающая значение bool и проверяющая соблюдение описанных выше условий.
Как правильно это сделать я не совсем понимаю??????? Вот, что то сделал, но это бред:
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
#include<cstdio> 
#include<cmath>
#include<ctime>
#include<iomanip>
#include<cstdlib> 
#include<iostream> 
using namespace std;
template <class T>
bool InsideFigure(const char * sMsg, T &val);
static float RandFloat(double b0, double b1)
{
    float t =  (rand()%((int)(b1/100000)-(int)(b0/100000)+1)+(int)(b0/100000));
    return t / 100000;
}
 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;   // Количество точек внутри фигуры
    double RandFloat(b0, b1);
    srand ( time(NULL) );
    for(int i=0; i < N; ++i)
        double RandFloat(b1 - b0) =  (rand() % ((b1 - b0) * 1000))/1000;
        double InsideFigure;
        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))*a*a << endl;
    cin.get();
    return 0;
 }
    template <class T>
bool InsideFigure(const char * sMsg, T &val)
{
    bool bInsideFigure = true;
    cout<<sMsg;
    if(!(cin>>val))
        bInsideFigure = false;
    if(!bInput)
    {
        cin.sync();
        cin.clear();
    }
    return bInsideFigure;
}
Подскажите пожалуйста как правильно записать условия для RandFloat и InsideFigure????? Заранее огромное спасибо.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.11.2012, 18:26 14
Для RandFloat условия не нужны, там обычное вычисление. Надо перевести число из диапазона [0; RAND_MAX] в диапазон
C++
1
[b0; b1]
. Это элементарное линейное преобразование, на основе самой обычной пропорции:
C++
1
2
3
4
double RandFloat(double min, double max)
{
    return double(rand()) / RAND_MAX * (b1 - b0) + b0;
}
Что же до InsideFigure, то я приводил условия, которые надо проверять. Вот проверка первого из них:
C++
1
2
3
4
bool InsideFigure(double x, double y, double a)
{
    return y < (2.5*a - x);
}
1
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
20.11.2012, 23:08  [ТС] 15
Спасибо огромное за ответ. На сколько я понял для проверки InsideFigure нужно выполнить два условия ограничение сверху:
C++
1
2
3
4
bool InsideFigure(double x, double y, double a)
{
    return y < (2.5*a - x);
}
и ограничение снизу
C++
1
2
3
4
bool InsideFigure(double x, double y, double a)
{
    return y > (a*a/ x);
}
Если не правильно поправьте меня.Вот что получилось:
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 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;
}
Подскажите как правильно записать все условия???? У меня неправильно???? Заранее огромное спасибо.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
21.11.2012, 17:59 16
Функция InsideFigure будет одна, но в ней будет проверяться выполнение обоих условий.
0
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
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
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
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
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
25.11.2012, 15:45 19
Посмотрим на запись функций. InsideFigure принимает 2 координаты и параметр a. Теперь поглядим, как её вызывают. Координаты, вычисленные через RandFloat, ей передаются, а третий параметр - упущен.
Функции RandFloat не нужны параметры min, max. Достаточно b0, b1.
0
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
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
25.11.2012, 22:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2012, 22:10
Помогаю со студенческими работами здесь

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

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

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

Вычисление интеграла геометрическим методом Монте-Карло
Всем доброго времени суток. В универе дали задание: вычислить интеграл...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru