计算定积分的值

来源:互联网 发布:如何登陆我的淘宝店铺 编辑:程序博客网 时间:2024/04/30 09:11

1、概率算法1

设a, b, c和d是实数,且a ≤ b, c ≤ d, f:[a, b] → [c, d]是一个连续函数,写一概率算法计算积分:这里写图片描述

#include <iostream>#include <stdlib.h>#include <ctime>#include <cmath>#include <iomanip>#define N 100000000using namespace std;double f(double x){    return sqrt(1-x*x);}double hitOrMiss(int a, int b, int c, int d, double (*f)(double), int n){    srand((unsigned)time(NULL));    double x=0.0, y=0.0;    unsigned int k=0;    for(unsigned i=0; i<n; ++i){        x = a + (b-a)*rand()/(RAND_MAX*1.0);        y = c + (d-c)*rand()/(RAND_MAX*1.0);        if(y <= f(x))            ++k;    }    cout << k << " " << n << endl;    return (double)k*(b-a)*(d-c)/n;}int main(){    cout.precision(6);    cout << std::fixed << 4*hitOrMiss(0, 1, 0, 1, f, N);    return 0;}----------output-----------78533807 1000000003.141352

2、概率算法2

更有效的概率算法是: 在积分区间上随机均匀地产生点,求出这些点上的函数值的算术平均值,再乘以区间的宽度:
这里写图片描述

#include <iostream>#include <stdlib.h>#include <ctime>#include <cmath>#include <iomanip>#define N 100000000using namespace std;double f(double x){    return sqrt(1-x*x);}double crude(int a, int b, double (*f)(double), int n){    srand((unsigned)time(NULL));    double x=0.0;    double sum = 0;    for(unsigned int i=0; i<n; ++i){        x = a + (b-a)*rand()/(RAND_MAX*1.0);        sum += f(x);    }    //cout << sum << endl;    return (double)(b-a)*sum/n;}int main(){    cout.precision(6);    cout << std::fixed << 4*crude(0, 1, f, N);    return 0;}

3、确定的算法

梯形算法,将区间分为n-1个子区间,每个子区间内的长度为δ,则
这里写图片描述

#include <iostream>#include <stdlib.h>#include <ctime>#include <cmath>#include <iomanip>#define N 100000using namespace std;double f(double x){    return sqrt(1-x*x);}double trapezoid(int a, int b, double (*f)(double), int n){    double sum = (f(a)+f(b))/2;    double delta = (double)(b-a)/(n-1); // 必须强制类型转换    for(double x=a+delta; x<b-delta; x+=delta){        sum += f(x);    }    cout << sum << " " << n << endl;    return (double)delta*sum;}int main(){    cout.precision(6);    cout << std::fixed << 4*trapezoid (0, 1, f, N);    return 0;}-------output-----------78539 1000003.141593

一般地,在同样的精度下,梯形算法的迭代次数少于MC(Monte Carlo)积分,有时确定型积分算法求不出解,则不能用梯形算法,需用MC算法。另外,在确定算法中,为了达到一定的精度,采样点的数目随着积分维数成指数增长,例如,一维积分若有100个点可达到一定的精度,则二维积分可能要计算1002个点才能达到同样的精度,三维积分则需计算1003个点。但概率算法对维数的敏感度不大,仅是每次迭代中计算的量稍增一点,实际上,MC积分特别适合用于计算4或更高维数的定积分。

0 0
原创粉丝点击