Разница между равномерно распределенными переменными, Python - PullRequest
1 голос
/ 03 апреля 2020

Я очень новичок в Python, и я пытался использовать эту проблему в качестве учебного упражнения, но я ничего не могу с этим поделать.

Что я хочу сделать, это показать что для двух случайных переменных, которые равномерно распределены в пределах окна 200 нс, вероятность того, что они окажутся в пределах 7 нс друг от друга, составляет ~ 5%:

X, Y ~ U [0, 200]

Z = X - Y

P (| Z | <7) =? </p>

Я хотел бы знать наиболее аналитический способ сделать это, потому что я думал, что Python может иметь некоторые полезные библиотеки, чтобы помочь, и потому что, если бы я хотел сделать стохастическое моделирование c, я сделал бы это в C ++ ROOT, что заняло бы у меня гораздо меньше времени!

Способ, которым я сделал это ниже , но это отличается от того, что я рассчитал аналитически. Кто-нибудь может предложить лучший / более точный способ решения той же проблемы?

Большое спасибо!

from scipy.stats import uniform, expon
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 1)

a, b = 0, 200
size = 1000000

# Genrating uniform distribution
uniform_distribution = uniform(loc=a, scale=b)
x = uniform_distribution.rvs(size=size)
y = uniform_distribution.rvs(size=size)

z=x-y

ax.hist(z)

zsmall=[z for i in z if abs(i)<7]

n=len(zsmall)

print("probability = ",n/size)

1 Ответ

0 голосов
/ 03 апреля 2020

Редактировать: добавлен некоторый код для улучшения рисунка.


Ваш код в порядке, и результаты соответствуют аналитически полученному значению. Чтобы увидеть это с большей готовностью, я немного изменил ваш код, уменьшив домены X и Y до [0, 1] и вычислив P (| Z | <7/200), так что это все равно эквивалентно вашему первоначальному вопросу. , </p>

from scipy.stats import uniform
import matplotlib.pyplot as plt

a, b = 0, 1
size = 1000000

# generate uniformly distributed x and y
uniform_distribution = uniform(loc=a, scale=b)
x = uniform_distribution.rvs(size=size)
y = uniform_distribution.rvs(size=size)

z = x - y

# set up figure
fig, ax = plt.subplots(figsize = [16, 8])
ax.set_aspect('equal')
ax.set_xlim([-1, 1])
ax.set_ylim([0, 1])
ax.set_xticks([-1, 0, 1])
ax.set_xticklabels([-1, 0, 1], size=20)
ax.set_yticks([0, 1])
ax.set_yticklabels([0, 1], size=20)

# plot histogram with y-axis scaled to show density, 
# increased bin number for better resolution
ax.hist(z, density=True, bins=200, alpha=0.5) 

# plot lines around the area we want to estimate
plt.axvline(-7/200, color='black', linestyle='--')
ax.annotate('x = -7/200', xy=(-7/200, 0.4), xytext=(-0.05, 0.4), fontsize=16, ha='right') 
plt.axvline( 7/200, color='black', linestyle='--')
ax.annotate('x = 7/200', xy=(7/200, 0.2), xytext=(0.05, 0.2), fontsize=16) 

# plot theoretical probability density function
ax.plot([-1, 0], [0, 1], color='gray', linestyle=':')
ax.plot([ 0, 1], [1, 0], color='gray', linestyle=':')

zsmall = [1 for i in z if abs(i) < 7/200]
n = len(zsmall)

print("probability =", n/size)

вероятность = 0,06857

enter image description here

Как видите, это приближается к теоретически ожидаемому три Распределение angular (серые пунктирные линии) уже довольно близко. Для сравнения мы можем рассчитать теоретическую вероятность, которая представляет собой площадь между пунктирными линиями и ниже пунктирных линий. Мы можем вычислить это как площадь всего прямоугольника между пунктирными линиями минус площадь квадрата, состоящего из двух маленьких треугольников над пунктирными линиями:

2*(7/200) - (7/200)**2

= 0.068775

Таким образом, теоретическое значение соответствует вашему результату моделирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...