Как стать автором
Обновить

Использование численного метода Монте-Карло для вычисления многомерных интегралов

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров6.7K
Всего голосов 7: ↑5 и ↓2+5
Комментарии50

Комментарии 50

ЗакрепленныеЗакреплённые комментарии

Почему вы не хотите добавить примеры вывода вашего кода? И ещё можно было бы нарисовать красивый график, чтобы видеть как от числа шагов зависит качество аппроксимации.

import matplotlib.pylab as plt
import seaborn as sns

sns.lineplot(x=np.arange(N), y=Monte_Carlo_Approximation, color='b')
plt.title('Аппроксимация интеграла функции методом Монте-Карло')
plt.xlabel('Шаг')
plt.ylabel('Интеграл')
val = (128*np.pi)/15
plt.plot([0, N], [val, val], 'g--')
Картинка
Картинка

Долго пытался понять, насколько хорошим получилось приближение, но так и не понял. Результат точного вычисления вручную нашел, приближение - нет. Заранее прошу прощения, если проглядел

Где значение приближения?
Где значение приближения?

В коде)

Почему вы не хотите добавить примеры вывода вашего кода? И ещё можно было бы нарисовать красивый график, чтобы видеть как от числа шагов зависит качество аппроксимации.

import matplotlib.pylab as plt
import seaborn as sns

sns.lineplot(x=np.arange(N), y=Monte_Carlo_Approximation, color='b')
plt.title('Аппроксимация интеграла функции методом Монте-Карло')
plt.xlabel('Шаг')
plt.ylabel('Интеграл')
val = (128*np.pi)/15
plt.plot([0, N], [val, val], 'g--')
Картинка
Картинка

Посмотрите немного более раскрытую сейчас статью пожалуйста?) очень хочется услышать Ваше мнение ! Спасибо за Ваши комментарии!

Помню такое было в школьном учебнике
Помню такое было в школьном учебнике

Да, введение в метод Монте-Карло начинается с обыкновенного интеграла, а вот многомерные интегралы уже посложнее) к сожалению, Монте-Карло не самый удачный метод для обычного интеграла, тк его приближение можно вычислить быстрее и точнее с помощью других методов, например через метод Симпсона. А вот для многомерных интегралов Монте-Карло в самый раз!

Насчет посложнее - это смотря какой уровень абстракции. По мне так просто число переменных (размер базиса) больше

Вы совершенно правы :)

Какие же классные тогда делали учебники.

У меня появилось такое же мнение, когда прочитала комментарий:) жаль, я обучалась уже не по таким) хотя и современные учебники дают много полезной информации:)

О, у меня был такой дома. В школе учебника по информатике вообще не выдали, а дома такой был, видимо родители купили. Я его сам заботал, прорешивая задачи на спектруме. Шикарный учебник - в нём обясняется и принцип работы микросхемы на уровне транзисторов и логических вентилей, и примеры по программированию для школы отличные, а ещё местами даже основы экономики - в задачах на экономическую оптимизацию. Но слишком затянуто введение в азы - первая половина книги бесконечно мусолит простые примеры на циклы и опрератор ветвления. А потом уровень сложности материала резко прет в гору, и примеры становится интересными.

НЛО прилетело и опубликовало эту надпись здесь

Очень интересная статья! Спасибо, что поделились:)

Такой шикарный метод, и такая убогая статья: почему не \TeX, откуда такая ненависть к глазам читателей? Почему нет примеров, оценок результатов и их точности, сравнения с другими методами? Почему содержательные вещи только в комментариях появляются, да так, что цитаты из советского учебника (правда, Свореня, с ним трудно тягаться) выглядят выгоднее и интереснее?

Так напишите свою ))

Не переносите с больной головы на здоровую: я обсуждаю Вашу работу и не вижу в ней смысла на фоне уже написанных и уже опубликованных здесь статей по этой теме. Отсутствие у меня публикации о методе Монте-Карло никоим образом не искупает и не оправдывает проблем Вашей статьи.

Хорошо, отвечаю на каждый Ваш пункт. Это моя первая статья на Хабре и я не полностью была знакома с возможностями использовать разные шрифты. По моему мнению, написанная мной статья, оформлена красиво, и ни для кого не составляет труда прочитать всё, что в ней написано. Спасибо за рекомендацию, я обязательно обращусь к другим шрифтам в моих последующих статьях.

Пример в моей статье есть, под заголовком «применение», описанный очень подробно.

Точно также, как и точность. В предоставленном мной коде есть возможность посчитать абсолютную погрешность для каждой выборки, которую предоставит компьютер. Поскольку в методе Монте-Карло точки выбираются случайным образом, каждый раз, когда мы будем прогонять код, мы будем получать разный ответ и разную погрешность, и именно поэтому я не стала предоставлять результаты одной «прогонки» кода. Для тех, кого заинтересовал метод, есть возможность скопировать код и посмотреть результаты.

Сравнения с другими методами я не посчитала нужным вставлять в статью, мне хотелось рассказать именно про работу этого метода, нежели про то, стоит ли его использовать.

Насчет советских учебников комментарий дать не могу, я была рождена уже в 2000-х:)

Это моя первая статья на Хабре и я не полностью была знакома с возможностями использовать разные шрифты

Это вопрос не шифтов, а того, как оформлять правильно тексты с формулами в XXI веке (четверть от него уже прошла, обращаю Ваше внимание). Вы использовали не какие-то там не те шрифты, а просто "на отвали" понатыкали картинок вместо текста математических выражений. То, что это Ваша первая статья никоим образом не освобождает от обязанности (да-да, обязанности -- как в любом приличном журнале надо ознакомиться с правилами публикации материалов сначала) читать другие статьи на ресурсе, прежде чем публиковать там свою. А заодно вообще почитать, что написано по Вашей теме хотя бы здесь -- и не тратить своё и чужое время, если Вы ничего нового и ценного сказать не можете.

По моему мнению, написанная мной статья, оформлена красиво, и ни для
кого не составляет труда прочитать всё, что в ней написано.

Ваше мнение ошибочно. Растровые изображения вместо формул всегда плохи, и всегда хуже любых набранных руками формул. Я, как и многие, читаю с телефона, и у меня не видно ничего. Телефон хороший, с отличным экраном и проблема явно не в нём.

Пример в моей статье есть, под заголовком «применение», описанный очень подробно.

Ваш пример съели формулы вразнобой: читать невозможно, я и не смог (Вы в примере смогли написать руками несколько формул и выражений, что помешало сделать так для всех формул?).

Точно также, как и точность. В предоставленном мной коде есть
возможность посчитать абсолютную погрешность для каждой выборки, которую предоставит компьютер.

Я должен увидеть всё, что предоставит код, не запуская его. Это совершенно очевидно для статьи: Вы не можете требовать от читателей, чтобы они запускали и проверяли Ваш код, чтобы узнать то, чего не было достаточно освещено в статье. А вдруг я вдалеке от интерпретатора Python, но работаю с источниками и пишу своё исследование? Я должен из статьи узнать всё, код только запускамый пример или сырье для другого использования.

Поскольку в методе Монте-Карло точки выбираются случайным образом,каждый раз, когда мы будем прогонять код, мы будем получать разный ответ и разную погрешность, и именно поэтому я не стала предоставлять результаты одной «прогонки» кода.

Я правильно понимаю, что у метода Монте-Карло и любых других, у которых ответ может меняться от запуска к запуску погрешность оценить нельзя? Перед публикацией своей статьи запустите несколько раз код и хотя бы среднее посчитайте -- я не вижу Вашей работы с Вашим кодом (или он не Ваш?).

Сравнения с другими методами я не посчитала нужным вставлять в статью, мне хотелось рассказать именно про работу этого метода, нежели про то, стоит ли его использовать.

То есть, Вы считаете, что то, что никто не сможет оценить пригодность Вашего кода для своих исследований -- это нормально и его всё равно стоит публиковать? Так вот, это не так. Инженерная работа состоит на 90% из выбора подходящих методов для своей задачи. В своей статье Вы сделали всё, чтобы максимально усложнить анализ метода и оценку. В некотором смысле, с Вашей статьей хуже, чем без неё. Надо людям помогать читать и понимать, а не мешать и совать им в нос сырой материал. В противном случае теряется смысл публикации: если Вы не можете рассказать, стоит ли его использовать, то зачем печатать что-то? Чтобы рассказать, как он работает? Так Станислав Улам и Винер уже всё рассказали, спасибо.

Насчет советских учебников комментарий дать не могу, я была рождена уже в 2000-х:)

Это просто фееричный ответ: да, как раз в 00е мир создавали заново, а когда создавали, то уничтожили все книги, написанные до 00х гг, вместе с библиотеками, а осташиеся случайно запретили читать, да-да.
Вы бы хоть постеснялись такое говорить.

Спасибо за Ваш комментарий, обязательно все учту в будущем :)

Лучше бы Вы это учли в прошлом и не публиковали что попало.

В прошлом не от кого было услышать конструктивную критику :)

Но можно было с карандашом в руках почитать перед публикациями чужие статьи на Хабре про метод Монте-Карло и сразу сделать нужные выводы. До всего, о чем я говорю можно и нужно догадаться самому.

Но обвинять в плагиате это конечно не очень красиво:) код написан очень подробно, с пояснением к каждой линии. Не думаю, что могут возникнуть сомнения о честности его написания !

Может быть, но у меня вот возникли, и я их высказал (уж больно код похож на школьный, а ссылок в статье на источники нет, разумеется).
Бывает, что очень подробный код с пояснением к каждой строке (эти линии называются строками) пишут и другие люди, поверьте мне.

Статью как у Вас это не просто некрасиво было публиковать -- а прямо ужасно плохо, но Вас же это не остановило, так что Вам ли говорить про красоту.

В моей статье 5 ссылок на источники, они обозначены под «[]» и сразу же имеют гиперссылку на веб-сайты с которых я брала информацию. Мой код был написан полностью мной без использование каких-либо линий из какого-либо источника, писала я его с нуля благодаря знаниями, приобретенными осенью этого года в университете.

Хочу напомнить, что каждая статья проходить модерацию перед публикацией, так что думаю Ваше мнение не было разделенно.

Спасибо за Вашу беседу, было очень интересно, постараюсь Вас не подвести на следующей статье)

В моей статье 5 ссылок на источники, они обозначены под «[]» и сразу же имеют гиперссылку на веб-сайты с которых я брала информацию.

Это неправильно оформленные ссылки, их оформляют либо сразу в тексте тоже текстом (пусть и со встроенной сслыкой), либо делают список литературы внизу статьи и ссылаются на пункты из него. Почему это важно и надо делать именно так? Объясняю: ссылка [2] битая и никуда не ведет у меня (куда-то в облако Амазона), и это означает, что ссылки нет, материала нет, и Вы ни на что не сослались.

Мой код был написан полностью мной без использование каких-либо линий из какого-либо источника, писала я его с нуля благодарными знаниями, приобретенными осенью этого года в университете.

Я не знаю, что такое "благодарные знания", но в них явно не содержатся правила оформления текста с источниками, так что, возможно, проведенное в университете время прошло зря. Я уже не говорю о том, что Вы использовали СТРОКИ, составленные из команд языка Python, опубликованные в его стандартах, так что даже формально Вы очень много чего много откуда использовали, но постеснялись указать, что и где.

Хочу напомнить, что каждая статья проходить модерацию перед публикацией, так что думаю Ваше мнение было неразделенно.

Это фразу я понял с трудом (правильно писать "не разделяется", "не было разделено", хотя это стилистическая ошибка, пожалуй). Каждая статья проходит модерацию среди неспециалистов и модерация не является рецензированием (зато примерно для этого как раз комментарии под статьями, их можно считать рецензией), и они не проверяют качество и правильность подачи материала, у них нет мнения, которое бы конфликтовало с моим.

Спасибо за Вашу беседу, было очень интересно, постараюсь Вас не подвести на следующей статье)

Можно просто удалить эту статью и мы в расчёте.

Спасибо за Ваше мнение :)

Долго искал за что поблагодарить Вас -- и понял, что теперь буду использовать Вашу статью как отличный пример того как не надо писать статьи. Наверное, это тоже полезно, антипример тоже вещь.

Конечно)

Кстати, неработающие ссылки у Вас в тексте -- не мнение, а факт, Вы слишком часто и невпопад используете слово "мнение": я Вам не мнение частное излагаю, а говорю о реальных проблемах Вашего текста.

Спасибо за факт)

Кстати, да, поскольку код работает быстро, тут вполне можно было бы собрать статистику на многих запусках и на её основе доверительный интервал посчитать и нарисовать. )
Для случаев, когда результат выдаётся случайный у науки статистики давно всякие полезные методы были придуманы. Случайность эту можно оценить и нарисовать.

Сделаю, спасибо)

Я правильно понимаю, что у метода Монте-Карло и любых других, у которых ответ может меняться от запуска к запуску погрешность оценить нельзя?

Совсем не знаю Питона, но подозреваю, что в нем (как и в других нормальных языках) должна существовать возможность опционально генерировать ту же самую последовательность псевдослучайных чисел, повторяющуюся при каждом запуске. Это, в частности, необходимо для целей отладки и воспроизводимости результатов. По крайней мере, во Free Pascal такая возможность есть

UPD. Какой там Free Pascal, это было и в Turbo Pascal 5.0, т.е. практически было всегда

В Python, как и в других языках программирования, есть возможность генерировать повторяющиеся последовательности псевдослучайных чисел. Для этого используется установка "seed". Это делается с помощью модуля random. Чтобы каждый раз при запуске программы получать одну и ту же последовательность чисел, нужно использовать random.seed()

В Python, как и в других языках программирования, есть возможность генерировать повторяющиеся последовательности псевдослучайных чисел

Большое спасибо за уточнение, но почему тогда вы, зная об этом, не привели в статье результат для какой-то фиксированной последовательности? Неужели я должен устанавливать себе Питон, чтобы узнать, насколько результат применения метода Монте-Карло отличается от истинного? Результат для заданной последовательности не поздно привести прямо сейчас, разом ответив на все недоумения по поводу его отсутствия

Сегодня утром добавила !) и в оригинальный код, и в применении, также как и в график верификации погрешности. Посмотрите пожалуйста и отпишите свое мнение если пожелаете!)

Сегодня утром добавила

Спасибо, наконец-то. Можно было бы еще добавить пару результатов с увеличинным N, чтобы было наглядно видно, что ошибка уменьшается

Не могу с Вами не согласиться!) но сделала это немного другим способом: смотрите, из формулы Монте-Карло в статье я вывела формулу погрешности, и, обращая внимание на то, что бОльшую часть формулы (подкорневое выражение) занимает стандартное отклонение, пришла к выводу, что погрешность зависит от N^(-1/2). То есть для уменьшении погрешности нужно увеличить N aka выборку. Для того, чтобы доказать, что это правда, я построила график погрешности и сравнила его параллельность с прямой N^(-1/2). Сделала я это рассчитывая среднее значение аппроксимации при разном размере выборки. Две прямые получились практически параллельными (неидеальными из-за рандомности выборки). Но таким образом, более сложным, но научным и подробным, я доказала и показала, что от роста выборки уменьшается погрешность. Подробнее можете прочитать в разделе «проверка» !) спасибо

Но таким образом, более сложным, но научным и подробным, я доказала и показала, что от роста выборки уменьшается погрешность

Знаете, иногда следует отступать от "научности" в пользу наглядности. Куда нагляднее была бы табличка для увеличивающихся N, которая бы показывала уменьшение ошибки. Кстати, в этом случае следовало бы использовать именно одну и ту же последовательнось псевдослучайных чисел, у которой бы увеличивалась только длина

Спасибо за обратную связь! Я понимаю вашу точку зрения и согласна, что для наглядности график с увеличивающимся N мог бы быть полезным.

Однако, моя цель была не только продемонстрировать уменьшение погрешности при увеличении выборки, но и подтвердить теоретическую зависимость погрешности от N^(-1/2).

Думаю , что в этом случае надо было включить и то, и то. Сделаю!) спасибо еще раз

Концепт статьи интересный, но над реалезацией все же стоит поработать. Спасибо за попытку.

Спасибо :)

Вот, кстати, картинка с доверительным интервалом. Как-то оно медленно сходится, кстати. Вначале быстро, а потом не очень.

CI
CI

Вы совершенно правы, сходимость доверительного интервала у метода Монте-Карло действительно может быть неравномерной. Вначале, когда количество выборок невелико, добавление каждой новой точки заметно улучшает аппроксимацию. Но по мере увеличения объема выборки, добавление новых выборок уменьшает погрешность медленнее. Тк погрешность Монте Карло зависит от N^(-1/2), (доказано в статье) чтобы уменьшить ошибку в 2 раза, нужно увеличить выборку в 4 раза !)

Статья стала походить на статью. Уже лучше (попробуйте формулы и знаки в тесте записать через \TeX-- и станет ещё лучше). Но у меня вопрос:

0,77777778, что примерно равно 0,785

Вы не могли бы привести правило округления, согласно которому у Вас получился результат 0.785, а не 0.78?

Скорее было сравнение двух результатов, где один 0.78 грубо говоря и другой 0.79 грубо говоря. Они приблизительно равны, что показывает, что Монте-Карло работает)

Охотно верю. Но округление категорически неправильное, надо исправить.

Скорее было сравнение двух результатов

Почему сразу так не написали? Почему не указали явно, что дальше Вас интересует среднее двух близких результатов и вместо этого нарисовали неправильное округление?

Пока что не кандидат наук) могу иногда неправильно сформулировать ))

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации