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

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

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

Студворк — интернет-сервис помощи студентам
Всем доброго время суток. Написать программу для вычисления методом Монте-Карло площади 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.11.2012, 16:05
Ответы с готовыми решениями:

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

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

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

28
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
12.11.2012, 18:46
В чём проблемы-то? Неясен сам принцип Монте-Карло, или логарифмы считать не получается?
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
12.11.2012, 23:12  [ТС]
Суть метода начал понимать: Фигура лежит внутри некоторой области известной площади 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
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
13.11.2012, 19:06
Проверка осуществляется очень просто. Очевидно, что прямая будет проходить над гиперболой. Слева и снизу наша фигура ограничена осями 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
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
13.11.2012, 22:28  [ТС]
Спасибо за пояснения попробовал сам, кое-что написать, но получается полный бред с границами по 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
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
14.11.2012, 18:39
Замечание первое. Не найдено решение системы уравнений, определяющее границы квадрата (то самое b).
Замечание второе. Вычисления, выполняющиеся внутри циклов, лишены какого бы то ни было смысла.
Замечание третье. Метод Монте-Карло подразумевает использование не регулярной сетки, а случайных чисел.
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
14.11.2012, 21:16  [ТС]
Я не знаю как вычислить параметр b или как его выразить через a???? Весь интернет облазил кругом сухая теория нет ни одного практического примера. На сколько я понял площадь искомой фигуры есть разность площадей отрезка прямой и отрезка гиперболы, помещенные в квадрат. Ума не приложу как это реализовать на C++???? Люди добрые помогите пожалуйста???? Четвертые сутки бьюсь. Заранее огромное спасибо.

Добавлено через 5 минут
Если бы на парах вместо сухой теории разбирали больше практику не пришлось бы так часто спрашивать на форуме. Препод отвратный приверженец Бейсика и Паскаля, C++ не в зуб нагой поэтому дает сухую теорию.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
14.11.2012, 22:11
Для начала надо определиться с математикой. Решить простую скучную систему уравнений 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
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
15.11.2012, 12:03  [ТС]
Решил систему уравнений у меня получились два корня: 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
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
15.11.2012, 18:46
Система решена неверно. Решения не подходят второму уравнению.
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
18.11.2012, 16:29  [ТС]
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
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
19.11.2012, 16:10
Вот теперь программа похожа на правду.
Рекомендации:
- квадрат 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
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
19.11.2012, 23:20  [ТС]
Цитата Сообщение от 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
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.11.2012, 18:26
Для 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
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
20.11.2012, 23:08  [ТС]
Спасибо огромное за ответ. На сколько я понял для проверки 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
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
21.11.2012, 17:59
Функция InsideFigure будет одна, но в ней будет проверяться выполнение обоих условий.
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
21.11.2012, 21:59  [ТС]
Подскажите пожалуйста как правильно записать программу уже все пере пробовал:
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
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
25.11.2012, 15:04  [ТС]
Записал условие для 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
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
25.11.2012, 15:45
Посмотрим на запись функций. InsideFigure принимает 2 координаты и параметр a. Теперь поглядим, как её вызывают. Координаты, вычисленные через RandFloat, ей передаются, а третий параметр - упущен.
Функции RandFloat не нужны параметры min, max. Достаточно b0, b1.
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
25.11.2012, 22:10  [ТС]
Спасибо за ответ исправил как вы советуете:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2012, 22:10
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru