formelsammlung/scripts/distributions.py

142 lines
3.6 KiB
Python
Raw Normal View History

2024-07-10 07:43:50 +02:00
from numpy import fmax
2025-02-15 16:01:05 +01:00
from formulary import *
2025-02-02 22:59:33 +01:00
import itertools
2024-07-10 07:43:50 +02:00
def get_fig():
fig, ax = plt.subplots(figsize=size_half_half)
ax.grid()
ax.set_xlabel(f"$x$")
ax.set_ylabel("PDF")
return fig, ax
# GAUSS / NORMAL
def fgauss(x, mu, sigma_sqr):
return 1 / (np.sqrt(2 * np.pi * sigma_sqr)) * np.exp(-(x - mu)**2 / (2 * sigma_sqr))
def gauss():
fig, ax = get_fig()
x = np.linspace(-5, 5, 300)
for mu, sigma_sqr in [(0, 1), (0, 0.2), (0, 5), (-2, 2)]:
y = fgauss(x, mu, sigma_sqr)
label = texvar("mu", mu) + ", " + texvar("sigma^2", sigma_sqr)
ax.plot(x, y, label=label)
ax.legend()
return fig
# CAUCHY / LORENTZ
def fcauchy(x, x_0, gamma):
return 1 / (np.pi * gamma * (1 + ((x - x_0)/gamma)**2))
def cauchy():
fig, ax = get_fig()
x = np.linspace(-5, 5, 300)
for x_0, gamma in [(0, 1), (0, 0.5), (0, 2), (-2, 1)]:
y = fcauchy(x, x_0, gamma)
label = f"$x_0 = {x_0}$ , {texvar('gamma', gamma)}"
ax.plot(x, y, label=label)
ax.legend()
return fig
# MAXWELL-BOLTZMANN
def fmaxwell(x, a):
return np.sqrt(2/np.pi) * x**2 / a**3 * np.exp(-x**2 /(2*a**2))
def maxwell():
fig, ax = get_fig()
x = np.linspace(0, 20, 300)
for a in [1, 2, 5]:
y = fmaxwell(x, a)
label = f"$a = {a}$"
ax.plot(x, y, label=label)
ax.legend()
return fig
2025-02-02 22:59:33 +01:00
# GAMMA
@np.vectorize
def fgamma(x, alpha, lam):
return lam**alpha / scp.special.gamma(alpha) * x**(alpha-1) * np.exp(-lam*x)
def gamma():
fig, ax = get_fig()
x = np.linspace(0, 20, 300)
for (alpha, lam) in itertools.product([1, 2, 5], [1, 2]):
y = fgamma(x, alpha, lam)
label = f"$\\alpha = {alpha}, \\lambda = {lam}$"
ax.plot(x, y, label=label)
ax.set_ylim(0, 1.1)
ax.set_xlim(0, 10)
ax.legend()
return fig
# BETA
@np.vectorize
def fbeta(x, alpha, beta):
return x**(alpha-1) * (1-x)**(beta-1) / scp.special.beta(alpha, beta)
def beta():
fig, ax = get_fig()
x = np.linspace(0, 20, 300)
for (alpha, lam) in itertools.product([1, 2, 5], [1, 2]):
y = fgamma(x, alpha, lam)
label = f"$\\alpha = {alpha}, \\beta = {lam}$"
ax.plot(x, y, label=label)
ax.set_ylim(0, 1.1)
ax.set_xlim(0, 10)
ax.legend()
return fig
2024-07-10 07:43:50 +02:00
# POISSON
def fpoisson(k, l):
return l**k * np.exp(-l) / scp.special.factorial(k)
def poisson():
fig, ax = get_fig()
k = np.arange(0, 21, dtype=int)
for l in [1, 4, 10]:
y = fpoisson(k, l)
label = texvar("lambda", l)
ax.plot(k, y, color="#555")
ax.scatter(k, y, label=label)
ax.set_xlabel(f"$k$")
ax.set_ylabel(f"PMF")
ax.legend()
return fig
# BINOMIAL
def binom(n, k):
return scp.special.factorial(n) / (
scp.special.factorial(k) *
scp.special.factorial((n-k))
)
def fbinomial(k, n, p):
return binom(n, k) * p**k * (1-p)**(n-k)
def binomial():
fig, ax = get_fig()
n = 20
k = np.arange(0, n+1, dtype=int)
for p in [0.3, 0.5, 0.7]:
y = fbinomial(k, n, p)
label = f"$n={n}$, $p={p}$"
ax.plot(k, y, color="#555")
ax.scatter(k, y, label=label)
ax.set_xlabel(f"$k$")
ax.set_ylabel(f"PMF")
ax.legend()
return fig
2025-02-02 22:59:33 +01:00
if __name__ == '__main__':
export(gauss(), "distribution_gauss")
export(cauchy(), "distribution_cauchy")
export(maxwell(), "distribution_maxwell-boltzmann")
export(gamma(), "distribution_gamma")
export(beta(), "distribution_beta")
export(poisson(), "distribution_poisson")
export(binomial(), "distribution_binomial")
2024-07-10 07:43:50 +02:00
2025-02-02 22:59:33 +01:00
# FERMI-DIRAC
# BOSE-EINSTEIN
# see stat-mech