首页 > 编程语言 >【数值计算方法】蒙特卡洛方法积分的Python实现

【数值计算方法】蒙特卡洛方法积分的Python实现

时间:2024-08-24 21:52:52浏览次数:10  
标签:2d Python 积分 float high scipy low 蒙特卡洛 计算方法

原理不做赘述,参见【数值计算方法】数值积分&微分-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

标签:2d,Python,积分,float,high,scipy,low,蒙特卡洛,计算方法
From: https://www.cnblogs.com/aksoam/p/18378332

相关文章

  • 一篇讲完自动化基础-Python【万字详细讲解】
    ​​您好,我是程序员小羊!前言这篇文章主要学习Python的语法,为后续的自动化打基础Python+requests接口自动化Python+seleniumweb自动化Python+appium移动端自动化(手机app)这篇文章分六个阶段百分比进行划分,到时可以选节查看什么是python?Python是......
  • 【Python脚本】爬取网络小说
    作为重度小说爱好者,小说下载网站经常被打击,比如:笔趣阁,奇书网,爱书网,80电子书.这些网站的下载链接经常会失效,所以,我想自己动手写一个爬虫程序,抓取网络小说,并下载到本地.给出两种思路的python脚本,脚本并不对所有小说网站通用,具体使用时,需要根据网站的网页结构进行......
  • python元组
    元组是不可改变的序列,同list一样,元组是可以存放任意类型的容器元组的表示方法创建空元组t=()#用括号创建空元组t_1=tuple()#用tuple创建空列表创建非空元组,单个元素用()创建时,元素后面加逗号(,)区分单个对象还是元组t=(1,)#注意,单个元素必须加(,),......
  • Python内置函数zip()——《Python内置函数手册》Python老吕编著
    Python内置函数zip——《Python内置函数手册》Python老吕编著Python内置函数`zip()`1.引言1.1迭代器和序列的概念1.2`zip()`函数概述2.`zip()`函数的基础知识2.1函数定义与语法2.2参数说明2.3返回值解释3.`zip()`函数的应用场景3.1将多个......
  • 讲解Python提供的若干第三方数据分析库
    一.数据分析什么是数据分析?网络数据分析(WebDataAnalysis)是指采用合适的统计分析方法,建立正确的分析模型,对Web网络数据进行分析,提取有价值的信息和结论,挖掘出数据的价值,从而造福社会和人类。数据分析可以帮助人们做出预测和提前判断,以便采取适当行动解决问题。数据分析的目......
  • 【Python爬虫】批量爬取图片的简单案例
    @目录1.原理2.寻找批量的图片URL的储存地址2.1百度2.2搜狗2.3必应2.4总结3.处理存储图片URL的请求头4.完整demo1.原理网页中的图片有自己的URL,访问这些URL可以直接得到图片,譬如,访问下面这个URL,你就能得到一张图片:https://img-blog.csdnimg.cn/a3bad4725ba94301b7cba7dd820......
  • Python 潮流周刊#66:Python 的预处理器(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,1则音视频,全文2100字。以下是本期摘要:......
  • 基于python+flask框架的物流管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展和全球贸易的日益紧密,物流行业已成为现代经济不可或缺的重要组成部分。然而,传统物流管理模式在应对海量订单、复杂......
  • 基于python+flask框架的中小学生心理平台管理系统的设计与实现(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,随着社会竞争的加剧和生活节奏的加快,中小学生的心理健康问题日益凸显,成为社会各界关注的焦点。学生面临着学业压力、人际关系困扰、......
  • 基于python+flask框架的在线课程查询管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,教育领域正经历着前所未有的变革。在线教育以其灵活性、便捷性和资源共享的优势,逐渐成为人们获取知识的重要途径......