蒙特卡洛方法的基本介绍和简单应用(求圆周率和定积分)

news2024/11/26 7:40:53

目录

一、什么是蒙特卡洛方法

二、蒙特卡洛方法的基本思想

三、用蒙特卡洛方法求圆周率 π

四、用蒙特卡洛方法求定积分


你听说过 "蒙特卡洛法" 吗?哦,那是一种计算不规则图形面积的计算机程序算法,具体做法是在软件中用大量的小球随机击打那块不规则图形,被击中的地方不再重复打击,这样,达到一定的数量后,图形的所有部分就会都被击中一次,这时统计图形区域内小球的数量,就得到了图形的面积,当然,球越小结果越精确。

这种方法虽然简单,却展示了数学中的一种用随机的蛮力对抗精确逻辑的思想方法,一种用数量得到质量的计算思想。这就是我解决三体问题的策略。


一、什么是蒙特卡洛方法

蒙特卡洛方法(Monte Carlo method)也称统计模拟方法,是 1940 年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法,是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。

20 世纪 40 年代,在冯·诺依曼,斯塔尼斯拉夫·乌拉姆和尼古拉斯·梅特罗波利斯在洛斯阿拉莫斯国家实验室为核武器计算工作时,发明了蒙特卡洛方法。因为乌拉姆的叔叔经常在摩纳哥的蒙特卡洛赌场输钱而得名,而蒙特卡洛方法正是以概率为基础的方法,与它对应的时确定性算法。


二、蒙特卡洛方法的基本思想

通常蒙特卡洛方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。例如在核物理研究中,分析中子在反应堆中的传输过程。中子与原子核作用受到量子力学规律的制约,人们只能知道它们相互作用发生的概率,却无法准确获得中子与原子核作用时的位置以及裂变产生的新中子的行进速率和方法。科学家依据其概率进行随机抽样得到裂变位置、速度和方向,这样模拟大量中子的行为后,经过统计就能获得中子传输的范围,作为反应堆设计的依据。

另一种类型是所求解问题可以转换为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解。这种方法多用于求解复杂的多维积分问题。


三、用蒙特卡洛方法求圆周率 π

正方形内部有一个四分之一圆,圆和正方形的面积之比是 π / 4。现在,在这个正方形内部,随机产生 n 个点,计算它们与圆心的距离,并且判断是否落在圆的内部。若这些点均匀分布,则圆周率 π = 4 * in_circle / n,其中 in_circle 表示落在圆内的点数。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
​
double GetPi(const int n)
{
    srand((unsigned int)time(NULL));
    double x = 0.0;
    double y = 0.0;
    int in_circle = 0;
    for (int i = 0; i < n; ++i)
    {
        x = (double)rand() / RAND_MAX; 
        y = (double)rand() / RAND_MAX;
        if (x * x + y * y < 1.0)
        {
            ++in_circle;
        }
    }
    return 4.0 * in_circle / n;
}
​
int main()
{
    printf("%lf\n", GetPi(100000));
    return 0;
}


四、用蒙特卡洛方法求定积分

例如我们想求 \int_0^1 x^2 dx 的值。

int main()
{
    const int n = 100000;
    srand((unsigned int)time(NULL));
    double x = 0.0;
    double y = 0.0;
    int count = 0;
    for (int i = 0; i < n; ++i)
    {
        x = (double)rand() / RAND_MAX;
        y = (double)rand() / RAND_MAX;
        if (y < x * x)  // y < x * x 表示该点位于曲线下面 
        {
            ++count;
        }
    }
    printf("%lf\n", 1.0 * count / n);
    return 0;
}

参考资料:初学者都能看懂的蒙特卡洛方法以及python实现_蒙特卡洛算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【银河麒麟V10】【服务器】麒麟容器常见问题

一、麒麟容器镜像下载链接 &#xff08;1&#xff09;kylin-V10-SP1-0711-x86_64 docker镜像下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/10WyBYRoOykqgnagjnoxdXw?pwdt4h5 提取码&#xff1a;t4h5 二、容器基础使用 #导入镜像 docker load < k…

6.100ASK_V853-PRO开发板支持MIPI摄像头

0.前言 ​ 100ASK_V853-PRO开发板支持4LINE的MIPI摄像头和2LINE的MIPI摄像头&#xff0c;使用百问网提供的Tina SDK包生成的镜像&#xff0c;系统已经配置好了&#xff0c;可以直接使用。本章介绍如何去适配一个MIPI摄像头&#xff0c;本文所用的2LINE的MIPI摄像头&#xff0c…

什么是应用交付网络(ADN)

从CDN到ADN CDN&#xff08;内容分发网络&#xff09;在90年代末受到麻省理工学院的启发并完成发明&#xff0c;00年代初成立第一家成功的CDN商业企业Akamai。CDN的目标是相对于最终用户在空间上分配服务&#xff0c;以提供高可用性和高性能。随着互联网的发展&#xff0c;CDN…

建筑行业搭建BI数据可视化平台,已成为大势所趋

建筑行业的项目管理是一个系统而复杂的过程&#xff0c;其重点主要是寻求造价、质量、工期等几个方面的平衡点&#xff0c;并且对项目的整个过程必须要有一个清晰和直观的了解。 因此可以通过BI数据可视化分析将各个节点的系统数据、业务数据完整的呈现&#xff0c;将各管理层…

数字孪生园区可视化大屏系统-广州华锐互动

工业园区是现代工业化生产的重要组成部分&#xff0c;也是推动经济发展和提升城市形象的重要载体。而数字孪生园区可视化大屏系统作为一种新兴的技术应用&#xff0c;可以为工业园区的建设、管理和发展带来很大的价值。 首先&#xff0c;数字孪生园区可视化大屏系统可以帮助工业…

[C++]普通二叉搜索树实现

目录 1 二叉搜索树的基本概念 2 二叉搜索树的构建 2.1 二叉搜索树的结点 2.2 搜索树类的结构 3 成员函数 3.1 插入 3.2 查找 3.3 删除&#xff08;重点&#xff09; 3.4 默认成员函数的辅助函数 4 普通的二叉搜索树的效率 1 二叉搜索树的基本概念 二叉搜索树又称二叉…

Java框架学习05(Spring事务详解)

1、什么是事务&#xff1f; 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 我们系统的每个业务方法可能包括了多个原子性的数据库操作&#xff0c;比如下面的 savePerson() 方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的&…

相亲交友app开发上线运营的整个流程是什么

一、相亲交友app开发基本流程 1、需求分析&#xff1a;需求分析是相亲交友app源码开发的第一步&#xff0c;也是最重要的一步。在需求分析阶段&#xff0c;可以了解客户对于系统的需求&#xff0c;确定系统功能实现的大致方向和功能。 2、系统架构&#xff1a;系统架构阶段就是…

这里有一份教你每天用领英获取20个询盘的免费课程,手慢无

于2023年3月22日&#xff0c;我们圆满完成了深圳宝安的外贸分享交流会&#xff0c;时隔两个月即将迎来我们的广州场。 在上次深圳会议&#xff0c;有幸邀请到江西省跨境电商协会会长莅临 给大家分享了&#xff1a; 如何帮助传统制造业从“0”开始做外贸、如何借助平台为企业…

浅谈霍尔电流传感器在电池柜监测中的应用

安科瑞 耿敏花 摘要&#xff1a;本文分析了霍尔电流传感器的工作原理&#xff0c;浅谈其在电池柜监测中的应用。 关键词&#xff1a;霍尔电流传感器 工作原理 充放电电流 电池柜 引言 大多数的工厂里&#xff0c;使用到的电池柜&#xff0c;它是将许多的新组装的电池一起…

不合格机器人工程讲师为何不分享成功的案例

不合格机器人工程讲师如何坦然面对失败 除了失败&#xff0c;更多的失败&#xff0c;也并非一无所获。 博客分享过&#xff0c;但是关注度&#xff08;浏览量&#xff09;不高&#xff0c;大部分成功案例都是学生/毕业生自身努力的结果&#xff0c;教育引导的作用小于他们自身…

中国品牌日:海尔智家向世界展示“中国”

品牌&#xff0c;在任何时候都是一个厚重的话题。什么是品牌&#xff1f;被咬掉一口的苹果、圆润张扬的对号、还有那个大大的黄色M&#xff0c;在诞生之初也不过是个商标。只是后来&#xff0c;它们跟智能手机、体育和快餐划上了等号&#xff0c;讲出了故事、收获了口碑&#x…

Android Framework——Binder 监控方案

作者&#xff1a;低性能JsonCodec 在 Android 应用开发中&#xff0c;Binder 可以说是使用最为普遍的 IPC 机制了。我们考虑监控 Binder 这一 IPC 机制&#xff0c;一般是出于以下两个目的&#xff1a; 卡顿优化&#xff1a;IPC 流程完整链路较长&#xff0c;且依赖于其他进程…

操作系统基础知识介绍之内存层次结构(一)

传统上&#xff0c;内存层次结构的设计者专注于优化平均内存访问时间&#xff0c;这由缓存访问时间、未命中率和未命中惩罚决定。 然而&#xff0c;最近&#xff0c;功率已成为主要考虑因素。 在高端微处理器中&#xff0c;可能有 60 MiB 或更多的片上高速缓存&#xff0c;并且…

并查集-- 一种路径压缩实现

并查集用于计算图连通分量。 比如回答这样的问题&#xff1a; 社交媒体中&#xff0c;用户A和用户B是否属于同一个圈子里的&#xff1f;一个城市到另一个城市是否是可达的&#xff1f; 并查集适用于并不需要计算出图上具体的路径&#xff0c;只需要计算是否连通。 public i…

JavaScript 链表

&#xff08;成功的唯一秘诀——坚持最终一分钟。——柏拉图&#xff09; 链表 众所周知&#xff0c;数组的查询比链表快&#xff0c;但插入比链表慢。 这是因为链表是一种动态的数据结构&#xff0c;不同于数组的是&#xff0c;链表分配内存空间的灵活性&#xff0c;它不会像…

解决车载U盘:USB设备未连接 问题

U盘是一种常用的便携式存储设备&#xff0c;用于存储和传输数据。在U盘上使用的文件系统类型决定了它可以支持的文件大小、安全性和其他特性。以下是几种常见的U盘文件系统类型&#xff1a; 1. FAT32:这是U盘上最常用的文件系统类型之一。FAT32文件系统支持的最大文件大小为4GB…

Revit楼板:建筑楼板和结构楼板区别和垫层生成

一、Revit中建筑楼板和结构楼板的区别 Revit中&#xff0c;在我们做项目时楼板是最常见的结构之一&#xff0c;几乎每次都需要使用它。分为建筑楼板和结构楼板&#xff0c;是不是有很多小伙伴就很好奇,为什么分为两种楼板&#xff0c;那么他们是什么时候使用的呢?之间又有何区…

从测试小白成功转型自动化测试,我是如何一步步掌握坚持下来的?

目录 学习自动化测试的初衷 克服困难&#xff0c;掌握自动化测试技能 自动化测试在日常工作中的应用 第一个自动化测试脚本的完成 自动化测试技能带来的机会和挑战 【自动化测试工程师学习路线】 学习自动化测试的初衷 作为一名测试新人&#xff0c;刚进入测试行业的时候…

工业视觉检测的8个技术优势

工业4.0时代&#xff0c;自动化生产线成为了这个时代的主旋律&#xff0c;而工业视觉检测技术也成为其中亮眼的表现&#xff0c;其机器视觉技术为设备提供了智慧的双眼&#xff0c;让自动化的脚步得以加速&#xff01; 在实际的生产应用中&#xff0c;视觉技术方案往往先被着手…