R语言:蒙特卡洛方法求积分

article/2025/8/21 19:09:15

蒙特卡洛方法(MC)

  • 一、蒙特卡洛方法简介
  • 二、利用蒙特卡罗方法计算圆周率
  • 三、利用蒙特卡洛方法求定积分
      • 例1
      • 例2
      • 例3
    • 总结:

一、蒙特卡洛方法简介

蒙特卡洛方法得名于摩纳哥的蒙特卡洛赌场,是大数定律的经典应用,即用大样本数据计算出来的频率估计概率,采样越多,越近似最优解,但永远不是最优解。
蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,可以借助计算机进行模拟,例如在物理中,对光子传输的模拟、分子运动的模拟以及犹豫不决,量子力学;或者经济学上,模拟市场走势等。
另一类是所求解的问题可以转化为概率分布问题,通过统计实验结果来求解。例如求圆周率,求定积分。

二、利用蒙特卡罗方法计算圆周率

在这里插入图片描述
代码:

N = 1000
x = matrix(runif(N*2), N, 2)
plot(x)
L = x[,1]^2 + x[,2]^2 < 1
points(x[L,], col = 'red')
n = sum(L)
p = 4*n/N

没什么高深的内核 咱就是说暴力美学出奇迹(bushi)

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

首先,需要了解连续随机变量X的期望定义为:
E ( X ) = ∫ − ∞ + ∞ x f ( x ) d x E(X) = \int_{- \infty}^{+ \infty} xf(x) dx E(X)=+xf(x)dx
连续变量X的任意函数g(x)也是一个随机变量,于是下式成立:
E ( X ) = ∫ − ∞ + ∞ g ( x ) f ( x ) d x E(X) = \int_{- \infty}^{+ \infty} g(x)f(x) dx E(X)=+g(x)f(x)dx

利用蒙特卡罗方法求定积分的主要思想在于,将积分转换为期望的形式,再利用矩估计,用样本均值代替总体期望,样本均值也就近似为定积分结果: ∫ − ∞ + ∞ g ( x ) d x = 1 f ( x ) ∫ − ∞ + ∞ g ( x ) f ( x ) d x = 1 f ( x ) E ( X ) \int_{- \infty}^{+ \infty} g(x)dx=\frac{1}{f(x)}\int_{- \infty}^{+ \infty} g(x)f(x) dx=\frac{1}{f(x)}E(X) +g(x)dx=f(x)1+g(x)f(x)dx=f(x)1E(X)
可以通过以下几个例子,加深理解。

例1

计算下列定积分
∫ 0 1 x d x \int_{0}^{1} x dx 01xdx
手工推导:
在这里插入图片描述

代码展示:

# MC estimator
n = 3000
x = runif(n)  # 生成n个0到1之间服从均匀分布的随机数
g = x  # g(x)
mean(g)  # 矩估计:样本均值代替总体期望

例2

计算下列定积分
∫ 0 1 e − x d x \int_{0}^{1} e^{-x} dx 01exdx
手工推导:
在这里插入图片描述
代码展示:

n = 3000
x = runif(n)
g = exp(1)^(-x)
mean(g)
1-1/exp(1)  # 解析解

例3

计算下列定积分
∫ 4 8 x 2 d x \int_{4}^{8}x^{2} dx 48x2dx
手工推导:
在这里插入图片描述
代码展示:

n = 3000
x = runif(n,4,8)
g = x**2
(8-4)*mean(g)

总结:

经过上面三个练习,可以将原理推广为:
∫ a b g ( x ) d x = ( b − a ) ∫ − ∞ + ∞ g ( x ) f ( x ) d x = ( b − a ) E ( X ) \int_{a}^{b} g(x)dx=(b-a )\int_{- \infty}^{+ \infty} g(x)f(x) dx=(b-a)E(X) abg(x)dx=(ba)+g(x)f(x)dx=(ba)E(X)
但是该方法存在一个极大的缺点就是,计算效率低!!!但是耐不住它效果好,与解析解误差较小,所以应用依旧很广泛。


http://chatgpt.dhexx.cn/article/sSB2bWIL.shtml

相关文章

计算方法(一)——计算机求积分方法,机械求积法

机械求积法 转载请注明出处! 一、引言 随着人工智能的兴起,在计算机领域又一次掀起了数学热,不管是传统的机器学习,还是现在的深度学习,都离不开积分的支撑,那计算机在底层到底是怎样求积分的呢?小编同大家一起探讨。 二、理论推导 我们知道,在我们所学的微积分中我们是…

C++实现龙贝格求积分算法

1. 算法原理简介 T(0)(b-a)(f(a)f(b))/2&#xff1b; H(0)(b-a)f( (ab)/2 )&#xff1b; T(i)(T(i-1)H(i-1))/2。 T(i) 的语义是将积分区间做 2i 等分时复化梯形求积分公式算出的近似值。 H(i) 的语义是将积分区间做 2i 等分时&#xff0c;将每个小区间的长度乘该小区间中点处…

c#求定积分

步骤&#xff1a; 1 安装和使用NuGet插件 教程链接&#xff1a;https://blog.csdn.net/qq_36456952/article/details/55252913 2 安装 C# 科学计算库 Math.NET Numerics 教程链接: https://blog.csdn.net/heray1990/article/details/72467304 注意&#xff1a;在安装 C#…

人工智能数学基础---不定积分4:有理函数求积分的方法

一、引言 在《人工智能数学基础–不定积分2&#xff1a;利用换元法求不定积分》、《人工智能数学基础—不定积分3&#xff1a;分部积分法》分别介绍了换元积分法和分步积分法。但有些函数表达式很复杂&#xff0c;如果直接用换元积分法和分步积分法不好计算积分&#xff0c;这…

求积分方法及积分知识点-----专升本

求积分 一般&#xff08;常见&#xff09;求不定积分方法 一般&#xff08;常见&#xff09;定积分方法 带三角函数的求积分 凑微分法&#xff0c;拆开&#xff0c;三角代换&#xff0c;分部积分&#xff0c;整体法&#xff0c; 倒三角变正三角&#xff0c;奇拆偶降 几分之一圆…

二维数组、指针详解

二维数组、指针详解&#xff1a; 目录 二维数组、指针详解&#xff1a; 1.研究二维数组的表示。 2.现在研究关于二维数组和指针的关系 1.研究二维数组的表示。 首先&#xff0c;用代码运行进行测试&#xff0c;验证的相关结果&#xff0c; // C.cpp : 定义控制台应用程序…

二维数组与指针

转载自&#xff1a;https://www.cnblogs.com/chenyangyao/p/5222696.html 声明&#xff1a;本文为原创博文&#xff0c;如有转载&#xff0c;请注明出处。若本文有编辑错误、概念错误或者逻辑错误&#xff0c;请予以指正&#xff0c;谢谢。 指针与数组是C/C编程中非常重要的元…

二维数组指针,指针数组与数组指针的区别,一看就懂

目录 一.二维数组基本概念 二.指针数组和数组指针的区别 1.数组指针 2.指针数组 3.总结 三.二维数组的首地址和数组名 四.二维数组如何运用指针&#xff1f; 五.代码分析,加深了解。 一.二维数组基本概念 二维数组在概念上是二维的&#xff0c;有行和列&#xff0c;但在…

二维数组与数组指针详解

二维数组 深入理解二维数组 首先定义一个二维数组 int a[2][3]{{1,2,3},{4,5,6}}; #or int a[2][2]{1,2,3,4};新的理解&#xff1a;我们可以这样认为&#xff0c;a可以看作是一个一维数组&#xff0c;包含2个元素&#xff0c;每个元素恰好是包含3个整型的元素&#xff0c;a这个…

c语言——二维指针数组

1 一维度数组与指针 1.1一维数组元素在内存分布 #include<stdio.h> #include<stdlib.h> #include<string.h>#define ARRAY_SIZE 8void main() {int data[ARRAY_SIZE]{0,1,2,3,4,5,6,7};int i;printf("data address:0x%-8x\r\n",data);for(i0; i&l…

c++二维数组指针

&#xff11;.定义指针指向二维数组 为了方便根据用户输入动态定义二维数组的行和列&#xff0c;引入变量rowsNum(行)&#xff0c;colsNum(列&#xff09;。 以定义&#xff15;行&#xff14;列的二维数组为例&#xff0c; int rowsNum 4;int colsNum 5;float** a new fl…

二维数组名是指针的指针吗?

我们知道一维数组名是常量指针&#xff0c;我们可以将一维数组名赋给一个指针类型再对一维数组进行相关的操作&#xff0c;那二维数组名又是什么&#xff1f; 我们这样初始化一个二维数组int A[3][3]{1,2,3,4,5,6,7,8}或者为int A[3][3]{ {1,2,3},{4,5,6}&#xff0c;{7,8,9}}…

c++二维数组中指针详解

二维数组 a[2][3]{{1,2,3},{4,5,6}};指针p有如下几种表达形式&#xff1a; 1 方式一&#xff1a;int (*p)[3]a (或&a[0]&#xff09;; 一定要加上括号&#xff0c;因为[]的优先级高于*&#xff1b;意思是定义一个指向3个int类型变量的指针。p代表二维数组中第一个…

C语言 二维数组和指针

二维数组可以看成是元素为一维数组的数组&#xff0c;假设有一个三行四列的二维数组a&#xff0c;它定义为&#xff1a; int a[3][4] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; a 是二维数组名。a 数组包含 3 行&#xff0c;即 3 个行元素&#xff1a;a[0]&#xff0c;a[1]…

C/C++指向二维数组的指针

1. 二维数组 设有整型二维数组a[3][4]如下&#xff1a;     0 1 2 3     4 5 6 7     8 9 10 11   它的定义为&#xff1a;       int a[3][4]{{0,1,2,3},{4,5,6,7},{8,9,10,11}}  设数组a的首地址为1000&#xff0c;各下标变量的首地址及其值如图所…

二维数组与二级指针

关于二维数组与二级指针那些你必须知道的事 首先,来看一个例子一个error嗯,我是解析指针数组与数组指针 首先,来看一个例子 #include <iostream>using namespace std;int main(void) {int **p;pnew int*[5];for(int i0;i<5;i){p[i]new int[5];}return 0; }不严格地说…

C语言二维数组指针用法

目录 题目 背景概念梳理 一维线性 数组指针 指针步长 数组名与指向其的指针变量名等价 数组的初始化与取元素 数组指针转换关系 解题过程 选项A&#xff1a;* (( * prt1)[2]) 选项B&#xff1a;* ( * (p5)) 选项C&#xff1a;( * prt1)2 选项D&#xff1a; * ( * (…

二维数组指针表示,C语言指针引用二维数组详解

指针变量可以指向一维数组中的元素&#xff0c;当然也就可以指向二维数组中的元素。但是在概念和使用方法上&#xff0c;二维数组的指针比一维数组的指针要复杂一些。要理解指针和二维数组的关系首先要记住一句话&#xff1a;二维数组就是一维数组&#xff0c;这句话该怎么理解…

C语言二维数组指针(指向二维数组的指针)详解

声明&#xff01;本文转载仅为方便学习使用&#xff01; 如有需要&#xff0c;请访问C语言指针数组&#xff08;数组每个元素都是指针&#xff09;详解C语言二维数组指针&#xff08;指向二维数组的指针&#xff09;详解 二维数组在概念上是二维的&#xff0c;有行和列&#x…

c语言 二维数组指针

文章目录 前言一、二维数组指针的定义&#xff1a;二、二维数组指针遍历数组元素&#xff1a;总结 前言 前面我们讲了一维数组指针&#xff0c;今天我们讲一下二维数组指针。 一、二维数组指针的定义&#xff1a; 概述&#xff1a; 二维数组指针的定义就是把一维数组换成二维…