Python 从正态分布生成随机麦克斯韦分布

标签 python python-3.x numpy random scipy

我有一组遵循正态分布的数据,我可以在其中拟合直方图并获得平均值和西格玛。

为了举例,我将通过生成随机正态分布来近似它,如下所示:

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 重叠的图片

enter image description here

关于Python 从正态分布生成随机麦克斯韦分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61717317/

相关文章:

python - 为什么 tflite 模型的准确性与 keras 模型如此不同?

python - Python 装饰函数中的参数如何工作

python - 使用 numpy.round 时出现 `AttributeError: rint`

python - 迭代 numpy 数组并保持维度

Python:在列表中查找

python - 如何向 django-tables2 LinkColumn 添加 GET 参数

Python函数来检查是否还活着

python - 如何让 python 在哈希中打印右箭头?

python - 使用代数约束和边界最小化最小二乘法

python - 什么是指向数组数据开头的 Python 缓冲区对象?