概率算法-Numerical和Monte Carlo

Numerical

  随机性被最早用于求数字问题的近似解,例如PI值的计算。

概率算法可以在较短时间内获得一个近似解, 但通常算法执行时间越长,结果精度就越高。

Monte Carlo

蒙特卡洛算法是J.Von Neumann在1945年进行核武器模拟提出的。它是以概率和随机统计的理论与方法为基础的一种数值计算方法,它是双重近似:一是用概率模型模拟近似的数值计算,二是用伪随机数模拟真正的随机变量的样本。

很多定积分无法用数学进行求解,此时可以考虑使用MC方法进行求解。

 

     

  一种思路是利用微积分原理将定义域分成n-1个小区间,即梯形法。

梯形法求积分
 1 #include <stdio.h>
2 #include <time.h>
3 #include <math.h>
4 double jiecheng(int n)
5 {
6 double result=1;
7 while (n>1)
8 {
9 result=result*n;
10 n--;
11 }
12 return result;
13 }
14 double f(double x)
15 {
16 double result=sin(jiecheng(100)*3.1415926*x);
17 return result*result;
18 }
19 double Trapezoid (double (*f)(double ),int a,int b,double c,double d,int n)
20 {
21 double delta=(double)(b-a)/n;
22 double sum=(c+d)/2;
23 double i;
24 for(i=a+delta;i<b;i+=delta){
25 sum=sum+f(i);
26 }
27 return sum*delta;
28 }
29 int main()
30 {
31
32 printf("%lf\n",Trapezoid(f,0,1,0,0,101));
33 return 0;
34 }

另一种是模拟向边长为1的正方形内随机投点,然后统计落入定积分面积内的点数。

随机模拟法求积分
 1 #include <stdio.h>
2 #include <time.h>
3 #include <math.h>
4 double jiecheng(int n)
5 {
6 double result=1;
7 while (n>1)
8 {
9 result=result*n;
10 n--;
11 }
12 return result;
13 }
14 double f(double x)
15 {
16 double result=cos(jiecheng(100)*3.1415926*x*2);
17 return (1-result)/2;
18 }
19 double HitorMiss(double (*f)(double ),int a,int b,double c,double d,int n)
20 {
21 int k=0;
22 int i;
23 double x,y;
24 srand( (unsigned)time( NULL ) );
25 for(i=1;i<=n;i++){
26 x=a+(b-a)*(rand())/32768.0;
27 y=c+(d-c)*(rand())/32768.0;
28 if (y<=f(x))
29 k++;
30 }
31 return (double)k/n;
32 }
33 int main()
34 {
35
36 printf("%lf\n",HitorMiss(f,0,1,0,1,101));
37 return 0;
38 }



 

 

你可能感兴趣的:(算法)