1.什么是蒙特卡洛方法(Monte Carlo method)
2.蒙特卡洛方法的基本思想
3.蒙特卡洛求定积分
在此图中,做了四次随机采样,得到了四个随机样本 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4,并且得到了这四个样本的 f ( x i ) f(x_i) f(xi)的值分别为 f ( x 1 ) , f ( x 2 ) , f ( x 3 ) , f ( x 4 ) f(x_1), f(x_2), f(x_3), f(x_4) f(x1),f(x2),f(x3),f(x4)。对于这四个样本,每个样本能求一个近似的面积值,大小为 f ( x i ) ∗ ( b − a ) f(x_i)*(b-a) f(xi)∗(b−a)。为什么能这么干么?对照图下面那部分很容易理解,每个样本都是对原函数f的近似,所以我们认为 f ( x ) f(x) f(x)的值一直都等于 f ( x i ) f(x_i) f(xi)。
按照图中的提示,求出上述面积的数学期望,就完成了蒙特卡洛积分。
当然实际应用中,我们最常用的还是取 f X f_X fX为均匀分布:
f X ( x ) = 1 b − a , a ≤ x ≤ b f_X(x) = \frac{1}{b – a}, a \le x \le b fX(x)=b−a1,a≤x≤b
此时
g ∗ ( x ) = ( b − a ) g ( x ) g^*(x) = (b-a)g(x) g∗(x)=(b−a)g(x)
代入积分表达式有:
I = ( b − a ) ∫ a b g ( x ) 1 b − a d x I = (b-a) \int_a^b g(x) \frac{1}{b-a}dx I=(b−a)∫abg(x)b−a1dx
4.蒙特卡洛方法python实例
首先看一个经典的用蒙特卡洛方法求 π \pi π值。
import random def calpai(): n = r = 1.0 a, b = (0.0, 0.0) x_neg, x_pos = a - r, a + r y_neg, y_pos = b - r, b + r count = 0 for i in range(0, n): x = random.uniform(x_neg, x_pos) y = random.uniform(y_neg, y_pos) if x*x + y*y <= 1.0: count += 1 print (count / float(n)) * 4
def integral(): n = x_min, x_max = 0.0, 1.0 y_min, y_max = 0.0, 1.0 count = 0 for i in range(0, n): x = random.uniform(x_min, x_max) y = random.uniform(y_min, y_max) # x*x > y,表示该点位于曲线的下面。所求的积分值即为曲线下方的面积与正方形面积的比。 if x*x > y: count += 1 integral_value = count / float(n) print integral_value
代码运行的结果为:
0.
由此可见,与解析值的结果误差还是比较小的。
参考文献:
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204342.html原文链接:https://javaforall.net
