WizenZhang
10/4/2018 - 2:37 PM

【随机化算法】计算定积分【7.2.2】

基本思想是在矩形区域上随机均匀的投点实现。本算法的基本思想是在积分区间上随机均匀的产生点, 即在[a,b]上随机均匀的取点, 求出由这些点产生的函数值的算术平均值, 再乘以区间宽度, 即可解出定积分得近似解。

//随机化算法 用随机投点法计算定积分
#include "stdafx.h"
#include "RandomNumber.h"
#include <iostream>
using namespace std;
 
double Darts(int n,double a,double b);
double f(double x);
 
int main()
{
	int n1 = 100,n2 = 1000,n3 = 1000,n4 = 10000,n5 = 10000000;
	double a = 2.0,b = 3.0;
	cout<<"n1="<<n1<<",r1="<<Darts(n1,a,b)<<endl;
	cout<<"n2="<<n2<<",r2="<<Darts(n2,a,b)<<endl;
	cout<<"n3="<<n3<<",r3="<<Darts(n3,a,b)<<endl;
	cout<<"n4="<<n4<<",r4="<<Darts(n4,a,b)<<endl;
	cout<<"n5="<<n5<<",r5="<<Darts(n5,a,b)<<endl;
	return 0;
}
 
/*
 * 基本思想是在矩形区域内随机均匀投点,求出由这些点
 * 产生的函数值的算术平均值,再乘以区间宽度,即可得
 * 出定积分的近似解
 */
double Darts(int n,double a,double b)
{
	static RandomNumber dart;
	double sum = 0.0;
	for(int i=0; i<n; i++)
	{
		double x = (b-a)*dart.fRandom() + a;//产生[a,b)之间的随机数
		sum = sum + f(x);
	}
	return (b-a)*sum/n;
}
 
double f(double x)
{
	return x*x;
}