python - Python从正态分布生成随机麦克斯韦分布
问题描述
我有一组遵循正态分布的数据,我可以在其中拟合直方图并获得均值和 sigma。
为了举例,我将通过生成如下的随机正态分布来近似它:
from scipy.stats import maxwell
import math
import random
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy.optimize import curve_fit
from IPython import embed # put embed() where you want to stop
import matplotlib.ticker as ticker
data = random.gauss(307, 16)
N, bins, patches = plt.hist(data, bins=40, density=True, alpha=0.5, histtype='bar', ec='black')
mu, std = norm.fit(data)
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)
plt.plot(x, p, 'k', linewidth=2, label= r'$\mu$ = '+'{:0.1f}'.format(mu)+r' $\pm$ '+'{:0.1f}'.format(std))
我接下来想做的是从这个“正态”分布生成麦克斯韦分布并能够拟合
我已阅读scipy.stats.maxwell网页和其他几个相关问题,但无法从“高斯分布”生成这样的分布并适合它。任何帮助将不胜感激。
解决方案
好吧,知道每个麦克斯韦是分子速度绝对值的分布,每个分量都是正态分布的,你可以像下面的代码一样进行采样
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import maxwell
def maxw(size = None):
"""Generates size samples of maxwell"""
vx = np.random.normal(size=size)
vy = np.random.normal(size=size)
vz = np.random.normal(size=size)
return np.sqrt(vx*vx + vy*vy + vz*vz)
mdata = maxw(100000)
h, bins = np.histogram(mdata, bins = 101, range=(0.0, 10.0))
x = np.linspace(0.0, 10.0, 100)
rv = maxwell()
fig, ax = plt.subplots(1, 1)
ax.hist(mdata, bins = bins, density=True)
ax.plot(x, rv.pdf(x), 'k-', lw=2, label='Maxwell pdf')
plt.title("Maxwell")
plt.show()
这是采样和 Maxwell PDF 重叠的图片
推荐阅读
- vue.js - Vue,单击收音机后禁用所有其他输入
- r - gganimate col 图表中的值与原始数据值不同
- azure - 在 AAD 应用注册中显示与托管服务标识服务主体关联的应用程序
- javascript - 在画布上选择和取消选择绘制的对象并移动到鼠标 X 和 Y
- javascript - 将 ID 从 foreach 传递给 modal
- c++ - 相扑客户端c ++中setCompleteRedYellowGreenDef后的异常
- ios - 推送通知并检索其数据时如何在 ViewController 上执行操作
- python - 函数定义后的闭包
- python - 将参数传递给 Print
- angular - CORB跨源请求被阻止如何在角度项目中允许