Initial commit

This commit is contained in:
Pim Nelissen
2024-06-30 11:26:36 +02:00
parent 14fb55cb5e
commit e42049c981
9 changed files with 534 additions and 0 deletions

View File

@ -0,0 +1,62 @@
import numpy as np
from matplotlib import pyplot as plt
from _utils.termcolors import termcolors as tc
class Distribution:
"""
Generates a PDF and CDF for any exponential decay using the half-life.
Arguments:
half_life Half life of the isotope
time_range User-defined range for the distribution
dt Time interval for the time axis
A Amplitude in exponential decay equation
Attributes:
half_life Half life of the isotope
dt Time interval for the decay graph
time_range User-defined range for the distribution
exponential The exponential decay distribution
pdf The (normalised) Probability Density Function (PDF) of the exponential distribution
cdf The cumulative sum of the PDF
"""
def __init__(self, half_life, time_range, time_start=0, A=1):
self.half_life = half_life
self.dt = 5*half_life/10_000
self.time_range = np.arange(time_start, time_range, self.dt)
self.exponential = A * np.exp(- np.log(2) * self.time_range/self.half_life) # exponential decay formula
self.pdf = self.calculate_pdf(self.exponential, self.time_range)
self.cdf = self.calculate_cdf(self.pdf)
def calculate_pdf(self, exp, time_range):
pdf = exp / np.trapz(exp, x=time_range) # normalize the distribution
return pdf
def calculate_cdf(self, pdf):
cdf = np.cumsum(pdf) / np.sum(pdf) # cumulative sum
return cdf
def plot(self, function='all'):
"""
Plot the exponential distribution ('exp'), Probability Density Function ('pdf'), Cumulative Density Function ('cdf'), or all functions.
Keyword arguments:
function Choose between 'all', 'exp', 'pdf', 'cdf' (default 'all')
"""
dists = {'exp': self.exponential, 'pdf': self.pdf, 'cdf': self.cdf}
if function == 'all':
for d in dists.keys():
y = dists[d]
plt.plot(self.time_range, y, label=d)
elif function in dists.keys():
y = dists[function]
plt.plot(self.time_range, y, label=function)
else:
raise ValueError(tc.WARNING + "Invalid function. Leave function kwarg empty to plot all, or choose between 'exp', 'pdf' or 'cdf'." + tc.ENDC)
plt.legend()
plt.grid()
plt.show()