原理不做赘述,参见【数值计算方法】数值积分&微分-python实现 - FE-有限元鹰 - 博客园,直接上代码,只实现1d,2d积分,N维积分的蒙特卡洛方法也类似.

  • 代码
from typing import Callable,Union,List
def MonteCarloInt2d(f:Callable,x:Union[float,List[float]],
y:Union[float,List[float]],n:int=10000)->float:
"""蒙特卡洛2d积分""" import random
rseed=random.randint(0,10000)
np.random.seed(rseed)
n=int(n)
low_x,high_x=x
low_y,high_y=y S=(high_x-low_x)*(high_y-low_y)
# 生成随机浮点数在[low_x,high_x]和[low_y,high_y]之间的坐标
xys=np.random.uniform(low=[low_x,low_y], high=[high_x,high_y], size=(n,2))
return (S/n)*sum([f(xys[ind,0],xys[ind,1]) for ind in range(xys.shape[0])]) def MonteCarloInt2d(f:Callable,x:Union[float,List[float]],
y:Union[float,List[float]],n:int=10000)->float:
"""蒙特卡洛2d积分""" import random
rseed=random.randint(0,10000)
np.random.seed(rseed)
n=int(n)
low_x,high_x=x
low_y,high_y=y S=(high_x-low_x)*(high_y-low_y)
# 生成随机浮点数在[low_x,high_x]和[low_y,high_y]之间的坐标
xys=np.random.uniform(low=[low_x,low_y], high=[high_x,high_y], size=(n,2))
return (S/n)*sum([f(xys[ind,0],xys[ind,1]) for ind in range(xys.shape[0])])
  • 测试: 1d积分
import scipy
def f(x):
return x**2 + 2*x + 1 a,b=-1,2
v=MonteCarloInt1d(f,a,b,1e6)
print(f"integral of f(-1,2) is {v:.4f}") scipy_result,error = scipy.integrate.quad(f, a, b)
print(f"SciPy积分结果: {scipy_result},error: {error}") # <!-- 输出结果 -->
# integral of f(-1,2) is 8.9909
# SciPy积分结果: 9.0,error: 9.992007221626409e-14
  • 测试: 2d积分
from scipy.integrate import dblquad
def f(x, y):
return x**2 + y**2 # 使用SciPy计算2d积分
def scipy_integrate_2d(f, a, b, c, d):
result, error = dblquad(f, a, b, lambda x: c, lambda x: d)
return result a, b = 0, 1
c, d = 0, 1 # 使用蒙特卡洛方法计算2d积分
monte_carlo_result = MonteCarloInt2d(f, [a,b],[ c, d])
print(f"蒙特卡洛2d积分结果: {monte_carlo_result}") # 使用SciPy计算2d积分
scipy_result = scipy_integrate_2d(f, a, b, c, d)
print(f"SciPy 2d积分结果: {scipy_result}") # <!-- 输出结果 -->
# 蒙特卡洛2d积分结果: 0.6676998082037032
# SciPy 2d积分结果: 0.6666666666666669

【数值计算方法】蒙特卡洛方法积分的Python实现的更多相关文章

  1. 用蒙特卡洛方法计算派-python和R语言

    用蒙特卡洛方法算pi-基于python和R语言 最近follow了MOOC上一门python课,开始学Python.同时,买来了概率论与数理统计,准备自学一下统计.(因为被鄙视过不是统计专业却想搞数据 ...

  2. 从随机过程到马尔科夫链蒙特卡洛方法(MCMC)

    从随机过程到马尔科夫链蒙特卡洛方法 1. Introduction 第一次接触到 Markov Chain Monte Carlo (MCMC) 是在 theano 的 deep learning t ...

  3. (转)Monte Carlo method 蒙特卡洛方法

    转载自:维基百科  蒙特卡洛方法 https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%9 ...

  4. 强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods)

    强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods) 学习笔记: Reinforcement Learning: An Introduction, Richard S ...

  5. paip.截取字符串byLastDot方法总结uapi python java php c# 总结

    paip.截取字符串byLastDot方法总结uapi python java php c# 总结 ========uapi   left_byLastDot   right_byLastDot 目前 ...

  6. JavaScript四种数值取整方法

    一.Math.trunc() 1.定义 Math.trunc()方法去除数字的小数部分,保留整数部分. 2.语法 Math.trunc(value) 3.示例 console.log(Math.tru ...

  7. 数值计算方法 | C语言实现几个数值计算方法(实验报告版)

    目录 写在前面 实验一 牛顿插值方法的实现 实验二 龙贝格求积算法的实现 实验三 高斯列主元消去法的实现 实验四 最小二乘方法的实现 写在前面 使用教材:<数值计算方法>黄云清等编著 科学 ...

  8. 蒙特卡洛方法计算圆周率的三种实现-MPI openmp pthread

    蒙特卡洛方法实现计算圆周率的方法比较简单,其思想是假设我们向一个正方形的标靶上随机投掷飞镖,靶心在正中央,标靶的长和宽都是2 英尺.同时假设有一个圆与标靶内切.圆的半径是1英尺,面积是π平方英尺.如果 ...

  9. 量化投资_轻松实现MATLAB蒙特卡洛方法建模

    1 目录 * MATLAB随机数的产生 - Uniform,Normal & Custom distributions * 蒙特卡洛仿真 * 产生股票价格路径 * 期权定价 - 经典公式 - ...

  10. Linux日志切割方法[Logrotate、python、shell实现方式]

    Linux日志切割方法[Logrotate.python.shell实现方式] ​ 对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分 ...

随机推荐

  1. 如何使用Jet家软件进行学习(intellij、idea、IDEA、Pycharm……)

    如何使用Jet家软件进行学习 本文档提供方法只用于学习研究,不得用于其他用途 以下,萌狼蓝天将会提供两种方式 目录 如何使用Jet家软件进行学习 第一种方式:使用EAP版本 第二种方式:使用插件 (1 ...

  2. jmeter接口测试 -- 连接数据库(MySQL)

    三个步骤 一.下载MySQL的连接驱动 1.先查看MySQL的版本 1)服务器上查看:mysql --version 2)在连接工具上查看 2.下载连接驱动,下载地址:https://dev.mysq ...

  3. MyBatis-Plus乐观锁: Parameter ‘MP_OPTLOCK_VERSION_ORIGINAL‘ not found. Available parameters are [

    新版本的 mybatisplus-plus 会出现这个问题,当我们根据官方文档使用乐观锁的相关代码时会出现这个问题:注意 OptimisticLockerInterceptor 不要写成 Optimi ...

  4. 【高清视频方案分享】12G-SDI与CameraLink输入输出,基于RK3588J+FPGA工业平台

    CameraLink协议介绍 CameraLink是一种用于机器视觉和工业成像应用的标准化数字接口协议.它由自动化成像协会(Automated Imaging Association)开发,旨在解决传 ...

  5. Redis 的DB多个数据库使用

    Redis 自己安装默认提供了16个数据库. 每个数据库都有一个id, 从 0 开始,(0,15). 不同的数据库中数据隔离保存.我们可以通过修改redis的配置文件进行修改数据库的数量. /etc/ ...

  6. 导出 wireshark 网络包二进制数据的三种方法

    Wireshark 是一款很好用的 UI 抓包工具,在 Windows.macOS 上都可以使用.最近开发的一个统计日志上报功能,发送的网络请求明明可以收到 server 正确的响应,但却捞取不到相关 ...

  7. vue.js中vue.config.js的配置说明

    如果你的项目没有vue.config.js,请在根目录新建一个. vue.config.js里面的代码如下: module.exports = { /** 区分打包环境与开发环境 * process. ...

  8. UWP 检查是否试用版模式

    //老版本的方法: // var check= CurrentAppSimulator.LicenseInformation.IsActive && CurrentAppSimulat ...

  9. IDEA神器插件-40款

    IDEA 插件安装 步骤 IDEA里面,选择打开 File --> Settings --> Plugins 在Plugins里面, 可以搜索需要的插件 (下面的标题),然后安装 如下图: ...

  10. [Java] Solon 框架的三大核心组件之一插件扩展体系

    1.Solon 的三大核心组件 核心组件 说明 Plugin 插件扩展机制 提供"编码风格"的扩展体系 Ioc/Aop 应用容器 提供基于注入依赖的自动装配体系 Context+H ...