蒙特卡洛数值积分实验报告
蒙特卡洛数值积分实验报告
杨韧121180143
问题概述:
概率论中,一切关于大量随机现象之平均结果的稳定性的定理,通称为“大数定理”。大数定理可以用于定积分的近似求解。考察下面的定积分:
其中g(x)为连续函数。为求解这个定积分,向区间[a,b]上均匀接连投n个随机点,它的坐标为n个独立均匀分布的随机变量,显然
由大数定理
当n很大时
用计算机可模拟蒙特卡洛实验,进行积分的近似计算。
本实验程序采用C语言编写,实验代码如下:
#include "stdafx.h"
#include
#include
#include
#include
#include
int _tmain(int argc, _TCHAR* argv[])
{
double a,b,result,x;
unsigned int n,count;
short int contrl = 'Y'; //进行流程控制的变量
double g(double x); //声明被积函数g(x)
srand( (unsigned)time( NULL ) );
while(contrl == 'Y'){
result = 0;
contrl = 0;
printf_s("请输入实验次数\n");
scanf_s("%u",&n);
printf_s("请输入积分范围(a,b):a=?,b=?\n");
scanf_s("%lf %lf",&a,&b);
count = n;
while(count){
x = a + (b-a)*(double)rand() /(double)(RAND_MAX+1); //将unsigned int随机数转换成符合要求的x
result += g(x); //累加结果
--count; //控制循环次数
}
result *= (b-a)/n; //乘上系数
printf_s("积分结果为:%lf\n重新实验?Y/N\n",result);
getchar(); //吸收多余的回车
contrl = getchar();
}
return 0;
}
double g(double x)
{
return (x*exp(x));
}
实验程序中将g(x)独立成为一个被调用子函数,便于根据各种需要将其修改为各种不同的其他函数,可以对任何复杂的定积分进行近似的数值求解。
(部分参考杨润琦同学)