171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
|
|
1 | |
Вычисление площади методом Монте-Карло11.11.2012, 16:05. Показов 37649. Ответов 28
Метки нет (Все метки)
Всем доброго время суток. Написать программу для вычисления методом Монте-Карло площади S тела, ограниченного кривыми x*y = a и . Параметр a > 0 вводится пользователем. Сравнить результат с точным значением . Искал на форуме, но таких тем практический нет. Помогите пожалуйста???? Заранее огромное спасибо.
0
|
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 минут Гипербола - и прямая - , проходящая в верхней полуплоскости оси 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. Начинаешь генерировать пары координат в этом диапазоне. Точка находится внутри фигуры, если она выше гиперболы, то есть и одновременно ниже прямой:
0
|
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
|
||||||
13.11.2012, 22:28 [ТС] | 5 | |||||
Спасибо за пояснения попробовал сам, кое-что написать, но получается полный бред с границами по x и y и с вычислением площади:
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 |
Для начала надо определиться с математикой. Решить простую скучную систему уравнений . Наибольшее из двух решений будет b.
Насчёт "площадей" прямой и гиперболы можно не заморачиваться, суть не в этом. Надо сгенерировать нужное количество пар случайных чисел, в интервале от 0 до b. Это будут координаты наших пробных точек. Те точки, что попадают в фигуры (то есть, удовлетворяют приведённому мной ранее условию), надо подсчитывать. Соотношение количества этих точек с общим количеством - примерно такое же, как соотношение площади квадрата и площади нашей фигуры. Простая пропорция.
0
|
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
|
|
15.11.2012, 12:03 [ТС] | 9 |
Решил систему уравнений у меня получились два корня: ,
и , . Какое из них будет равно 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.
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
Проверка принадлежности InsideFigure - функция, возвращающая значение bool и проверяющая соблюдение описанных выше условий.
1
|
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
|
||||||
19.11.2012, 23:20 [ТС] | 13 | |||||
Как правильно это сделать я не совсем понимаю??????? Вот, что то сделал, но это бред:
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||||||||||||
20.11.2012, 18:26 | 14 | |||||||||||||||
Для RandFloat условия не нужны, там обычное вычисление. Надо перевести число из диапазона [0; RAND_MAX] в диапазон
1
|
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
|
||||||||||||||||
20.11.2012, 23:08 [ТС] | 15 | |||||||||||||||
Спасибо огромное за ответ. На сколько я понял для проверки InsideFigure нужно выполнить два условия ограничение сверху:
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 | |||||
Подскажите пожалуйста как правильно записать программу уже все пере пробовал:
0
|
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
|
||||||
25.11.2012, 15:04 [ТС] | 18 | |||||
Записал условие для InsideFigure() используя операции &&. Но осталась еще одна проблема записал функцию для RandFloat():
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 | |||||
Спасибо за ответ исправил как вы советуете:
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 | |
25.11.2012, 22:10 | |
Помогаю со студенческими работами здесь
20
Вычисление интеграла методом Монте-Карло Вычисление числа Пи методом Монте-Карло Вычисление интеграла методом Монте-Карло Вычисление интеграла геометрическим методом Монте-Карло Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |