您的位置:首页 > 编程语言 > Python开发

高斯分布的点落入心形曲线的一个解决方案

2017-03-05 13:29 169 查看
给定心形曲线(x2+y2−1)3=x2y3,给定任意一点的坐标(X,Y)其中X~N(X,σx),<
10174
span style="display: inline-block; position: relative; width: 5.369em; height: 0px; font-size: 123%;">Y~N(Y,σy)求点(X,Y)落入心形曲线内的概率。

思路:

以(X,Y)为中心,画出3∗σ半径的椭圆,求和心形曲线相交的体积。注意:心形曲线方程可化为x2+y2−1=x2/3y,满足x2+y2−1<=(x2)1/3y在曲线内。利用心形曲线上下左右都有最大值且约等于正负1。可以设定一个分辨率画出图形。

上代码:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

res=0.01#单位每像素
RES=1/res#像素每单位
block=256
map1=np.ones([block,block])
CX=block/2.0
CY=block/2.0
for y in np.arange(0,block):
for x in np.arange(0,block):
if (res*(x-CX))**2+(res*(y-CX))**2-1<=(res*np.abs(x-CX))**(2.0/3.0)*(res*(y-CY)):
map1[y,x]=0
plt.figure(1)
plt.imshow(map1,cmap='gray')

sigmax=0.3
sigmay=0.1
X=0
Y=0
l=max(CX+(X-3*sigmax)*RES,0)
r=min(CX+(X+3*sigmax)*RES,block)
t=max(CY+(Y-3*sigmay)*RES,0)
b=min(CY+(Y+3*sigmay)*RES,block)
print(l,r,t,b)
theta=1/((2.0*np.pi)*(sigmax*sigmay))
ssum=0;
for y in np.arange(l,r+1):
for x in np.arange(t,b+1):
if map1[y,x]==0:
map1[y,x]=np.exp(-0.5*((((x-CX)*res-X)/sigmax)**2+(((y-CY)*res-Y)/sigmay)**2))
ssum=ssum+theta*map1[y,x]

plt.figure(2)
plt.imshow(map1,cmap='gray')
#print(ssum/(np.sum(np.sum(f))))
#print(res**2*theta*np.sum(np.sum(f)))
print(res**2*ssum)
print(np.round(res**2*ssum*10)/10)
plt.show()


效果图:



心形



p=1.0



p=0.9



p=0.5



p=0.4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息