簡體   English   中英

Python 從正態分布生成隨機麥克斯韋分布

[英]Python Generate a random Maxwell distribution from a normal distribution

我有一組遵循正態分布的數據,我可以在其中擬合直方圖並獲得均值和 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重疊的圖片

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM