对一个简单函数做积分
这是一个引入 Monte Carlo 积分概念的简单练习。
这里我们将计算一个简单的定积分 $ \int_0^1 x e^{x} dx$。我们知道精确答案是 $1$,但用模拟只能得到近似解,所以可以预期结果会接近 $1$。正如视频中所示,过程很简单。对于单变量函数 $f(x)$:
- 获得 x 轴的取值范围 \((x_{min}, x_{max})\) 和 y 轴的范围 $(\max(f(x)), \min(\min(f(x)), 0))$。
- 在这个矩形框内生成若干均匀分布的随机点。
- 用矩形框的面积($(\max(f(x) - \min(f(x))\times(x_{max}-x_{min})$)乘以落在 \(f(x)\) 曲线之下的点所占比例。
完成后,您将掌握用 Monte Carlo 积分处理定积分的基本框架。
本练习是课程的一部分
Python 中的统计模拟
练习说明
- 在
sim_integrate()函数中,生成位于xmin与xmax之间的均匀随机数并赋值给x。 - 生成位于 \(\min(\min(f(x)), 0)\) 与 \(\max(f(x))\) 之间的均匀随机数并赋值给
y。 - 返回小于 \(f(x)\) 的点的比例与面积的乘积($(\max(f(x) - \min(f(x))\times(x_{max}-x_{min})$)。
- 最后,使用 lambda 函数将
func定义为 $x e^{x}$。
交互式实操练习
通过完成这段示例代码来试试这个练习。
# Define the sim_integrate function
def sim_integrate(func, xmin, xmax, sims):
x = np.random.uniform(____, ____, sims)
y = np.random.uniform(____, ____, sims)
area = (max(y) - min(y))*(xmax-xmin)
result = area * sum(____(____) < abs(func(x)))/sims
return result
# Call the sim_integrate function and print results
result = sim_integrate(func = lambda x: ____, xmin = 0, xmax = 1, sims = 50)
print("Simulated answer = {}, Actual Answer = 1".format(result))