蒙特卡罗积分

本章描述了多维蒙特卡罗积分的例程。其中包括传统的蒙特卡罗方法和自适应算法,如VEGAS和MISER,这些算法使用重要抽样和分层抽样技术。每个算法计算一个多维定积分的估计值,

在一个超立方区域((xl, xu),(yl, yu),…)上使用固定数量的函数调用。例程还提供了结果误差的统计估计。这个误差估计应该作为一个指导,而不是作为一个严格的误差界-随机抽样的区域,可能不会发现函数所有重要特性,导致误差的低估。

这些函数定义在每个例程的独立头文件中,分别是gsl_monte_plain.h、gsl_monte_master .h和gsl_monte_vegas.h。

27.1 接口

所有的蒙特卡罗积分程序都使用相同的通用接口形式。有一个分配器来为控制变量和工作空间分配内存,有一个例程来初始化这些控制变量,积分器本身,以及一个函数来释放空间。

每个积分函数都需要提供一个随机数生成器,并返回积分及其标准差的估计值。结果的准确性由用户指定的函数调用次数决定。如果需要已知的精度水平,可以通过多次调用积分器并对单个结果进行平均,直到获得所需的精度来实现。

蒙特卡罗例程中使用的随机抽样点总是严格地选择在积分区域内,从而自动避免了端点奇点。

要积分的函数有自己的数据类型,定义在头文件gsl_mon.h中。

gsl_monte_function

本数据类型定义了一个带有参数的通用函数用于蒙特卡罗积分。

double (* f) (double * x, size_t dim, void * params)

本函数将返回参数x和参数params的值f(x, params),其中x是一个大小为dim的数组,给出了函数将要计算的点的坐标。

size_t dim

x的维数。

void * params

一个指向函数参数的指针。

这是一个二维二次函数的例子,

其中a=3,b=2,c=1。下面的代码定义了一个gsl_monte_function F,可以传递给一个积分器:

struct my_f_params { double a; double b; double c; };
double my_f (double x[], size_t dim, void * p) { struct my_f_params * fp = (struct my_f_params *)p; if (dim != 2) { fprintf (stderr, "error: dim != 2"); abort (); } return fp->a * x[0] * x[0] + fp->b * x[0] * x[1] + fp->c * x[1] * x[1];
}
gsl_monte_function F;
struct my_f_params params = { 3.0, 2.0, 1.0 };
F.f = &my_f;
F.dim = 2;
F.params = &params;

函数f(x)可以通过下面的宏定义赋值,

#define GSL_MONTE_FN_EVAL(F,x) (*((F)->f))(x,(F)->dim,(F)->params)

27.2 普通蒙特卡洛

普通蒙特卡罗算法从积分区域随机采样点来估计积分及其误差。使用该算法,可以得出N个随机分布点xi的积分E(f;N)的估计值,

其中V是积分区域的体积。此估计的误差σ(E;N)由均值的估计方差计算,

对于大N,这个方差随着Var(f)/N渐近减小,其中Var(f)是函数在积分区域上的真实方差。误差估计本身应减小为σ(f)/N。我们熟悉的误差随1/N的增加而减少的规律——要将误差减少10倍,就需要增加100倍的样本点。

本节中描述的函数声明在头文件gsl_monte_plain.h中。

gsl_monte_plain_state

这是普通蒙特卡洛积分的工作空间。

gsl_monte_plain_state * gsl_monte_plain_alloc(size_t dim)

本函数分配并初始化一个工作空间,用于在dim维数下进行蒙特卡罗积分。

int gsl_monte_plain_init(gsl_monte_plain_state* s)

本函数初始化先前分配的积分状态。这允许现有的工作区用于不同的积分。

int gsl_monte_plain_integrate(gsl_monte_function * f, const double xl[],

const double xu[], size_t dim, size_t calls, gsl_rng * r,

gsl_monte_plain_state * s, double * result, double * abserr)

本函数使用普通蒙特卡罗算法,在由数组xl和xu的上下限定义的dim维超立方区域上对函数f进行积分,每个数组的大小为dim。该积分使用固定数量的函数调用calls,并使用随机数生成器r获得随机采样点。必须提供先前分配的工作空间s。积分的结果以result的形式返回,并带有一个估计的绝对误差abserr。

void gsl_monte_plain_free(gsl_monte_plain_state * s)

本函数释放与积分器状态s相关的内存。

27.3 MISER

Press和Farrar的MISER算法是基于递归分层抽样的。该方法的目的是通过将积分点集中在方差最大的区域来减小总体积分误差。

GSL中的蒙特卡罗积分相关推荐

  1. matlab 2015 积分,Matlab中如何求解积分?

    一谈起Matlab这款软件我想不少人应该都很了解,它是一款功能强大的数学软件,因此有很多人会下载使用它,但是刚接触它,想用使用它会碰到一些难题,最常见的就是Matlab中如何求解积分了,那么遇到这个问 ...

  2. 金融工程中的蒙特卡罗方法

    <金融工程中的蒙特卡罗方法> 基本信息 原书名:Monte Carlo Methods in Financial Engineering 作者: Paul Glasserman 译者: 范 ...

  3. 语音交友app开发中的用户积分系统

    引言 在当今数字时代,语音交友app已成为一种流行的社交工具.它们给用户提供了一个平台,在这里他们可以结交新朋友,分享他们的生活和信仰,并建立深厚的人际关系.然而,市场上存在大量的语音交友app,这使 ...

  4. MATLAB不定积分的运算,matlab中怎么把积分函数 int 得到的不定积分式代入 solve 函数中进行计算?...

    答:syms r x fun=int(r*exp(-2*(r/2)^2),r,0,x); x=solve(fun-0.5) x = 2^(1/2)*log(2)^(1/2) -2^(1/2)*log( ...

  5. 蒙特卡洛积分 matlab,菜鸟之路——数学建模之蒙特卡罗积分(投点法,平均值法)+牛顿法解方程组MATLAB实现...

    蒙特卡罗方法这里不再赘述 1,例题 Matlab代码: %蒙特卡罗法求积分 N=1000; %随机选取1000个点 x=rand(1,N); y=rand(1,N); S=sum(y<=sin( ...

  6. wordpress图像大小_如何在WordPress中添加图像积分(逐步操作)

    wordpress图像大小 Recently, some of our readers asked us about how to properly add image credits in Word ...

  7. Python 中点法求积分

    中点法可以类比于二阶龙格库塔法(超链接点击跳转).与龙格库塔法类似,中点法也主要用于求解被积分函数的原函数.推荐优先阅读二阶龙格库塔法. 这里简单地说一下推导的结果: y n + 1 = y n + ...

  8. [学习SLAM]VINS中IMU预积分的误差推到公式与代码雅克比(协防差/信息矩阵)构建

    //todo /** *IMU预积分中采用中值积分地推jacobian和covariance **/ void midPointIntegration(double _dt, const Eigen: ...

  9. GSL中的非线性最小二乘拟合

    非线性最小二乘拟合 本章描述多维非线性最小二乘拟合的函数.求解非线性最小二乘问题一般有两类算法,即行搜索法和信赖域法.GSL目前只实现信赖域法,并为用户提供对迭代中间步骤的完全访问.用户还能够调优一些 ...

最新文章

  1. linux设置网卡队列,CentOS 修改网卡队列长度
  2. redispython源文件_Redis与Python在项目中的交互
  3. activiti集成spring
  4. 电脑销售渠道_“新冠”影响下,平板电脑市场再现新商机
  5. 【数据库】MySQL数据库(一)
  6. linux添加、修改环境变量
  7. hdu5387(模拟)
  8. cephfs java api_Kubernetes使用cephfs作为后端存储
  9. elementui表格-改变某一列的样式
  10. LeetCode 1689. 十-二进制数的最少数目(脑筋急转弯)
  11. 【管理】如何有效管理自己的时间
  12. 如何把手机变成你的救生设备
  13. 软考中级数据库系统工程师备考经验分享
  14. utils工具 常见函数
  15. win10如何桌面添加计算机,win10系统桌面怎么添加计算机等图标
  16. doGetBean方法——(四)
  17. Linux 下修改时间和时区
  18. rual 1741. Communication Fiend
  19. CentOS 7 中 pptpd安装
  20. python随机排列图片_更改图片中的随机像素,python

热门文章

  1. 计算机专业分流分享大会新闻,计算机学院召开2018级计算机大类专业分流说明会...
  2. itchat和matplotlib的结合使用爬取微信信息
  3. linux企业实战 --MySQL数据库之读写分离
  4. 【阿里巴巴】职级、薪酬、绩效全认知
  5. 申万一级行业日指数_申万一级行业指数市场表现
  6. C++软件技术与编程课程设计-图书管理系统
  7. 关于压缩包伪加密的相关问题
  8. 软件开发中的著名定律
  9. 力扣刷题记录--位运算问题
  10. easyUI dataGrid 隐藏分页工具栏 隐藏表头