打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
粒子滤波

无迹卡尔曼滤波-2中我们曾举过一个例子,对服从二维正态分布的随机变量X产生1000个点,然后将其进行非线性变换,计算变换后点的均值,当产生的点越多计算结果越接近理想值。这实际上是采用了蒙特卡洛法的思想:Using a finite number of randomly sampled points to compute a result is called a Monte Carlo (MC) method. The idea is simple. Generate enough points to get a representative sample of the problem, run the points through the system you are modeling, and then compute the results on the transformed points.

下面是一个使用蒙特卡洛法计算圆周率的例子。我们定义一个半径为1的圆,这个圆被边长为2的正方形包围,因此正方形的面积为4。我们随机的向这个正方形中撒一些点,然后计算出落在圆内点的数量与总点数的比例,根据这个比例计算出圆的面积A,从而根据公式A=πr2计算出pi。显而易见,撒的点越多结果越精确。

 1 # -*- coding: utf-8 -*- 2 import matplotlib.pyplot as plt 3 import numpy as np 4 from numpy.random import uniform  5  6 N = 20000               # 随机产生的点数 7 radius = 1.0            # 圆的半径 8 area = (2*radius)**2    # 正方形面积 9 pts = uniform(-1, 1, (N, 2)) # 均匀分布产生随机点10 11 # distance from (0,0) 12 dist = np.linalg.norm(pts, axis=1)  13 in_circle = dist <= 1   # 判断点是否在园内14 pts_in_circle = np.count_nonzero(in_circle) # 统计非零值(True)数目15 pi = area * (float(pts_in_circle) / N)      # 根据比例关系计算pi16 17 print('mean pi(N={})= {:.4f}'.format(N, pi))18 print('err  pi(N={})= {:.4f}'.format(N, np.pi-pi))19 # 绘制圆内的点20 plt.scatter(pts[in_circle,0], pts[in_circle,1], marker=',', edgecolor='k', s=1)21 # 绘制圆外的点22 plt.scatter(pts[~in_circle,0], pts[~in_circle,1], marker=',', edgecolor='r', s=1)23 plt.axis('equal')24 plt.show()

结果如下:

>>>
mean pi(N=20000)= 3.1564
err     pi(N=20000)= -0.0148

下面考虑另一个问题。对随机变量X其概率密度函数为f(x),则a≤X≤b的概率为:

对于服从正态分布的随机变量来说,计算上面的积分很容易,但是对于任意的f(x),如下面的曲线,这个积分就难以求出解析解,我们同样可以用蒙特卡洛法的思想进行数值积分计算。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
蒙特卡罗(Monte Carlo)方法计算圆周率π
无用技能之——如何用霰弹枪计算圆周率?
金字塔的比例是多少 金字塔长宽高尺寸比例图解
Python 中的Sympy详细使用
用MATLAB计算积分题示例
Python笔记分享:用Python实现基于蒙特卡洛算法小实验
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服