Kurvetilpasning av PERT
Kurvetilpasning ved bruk av modifisert PERT-fordeling er en alternativ metode, dersom det er vanskelig å angi ekspertvurderinger i form av persentiler. I stedet for å ta inn persentiler som input, bruker metoden realistiske verdier for minimum og maksimum til å avgrense fordelingen på x-aksen, modus for å angi mest sannsynlige verdi, i tillegg til en formfaktor som bestemmer spredningen av fordelingen.
Source
# importer nødvendige python-moduler
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta as beta_dist
import matplotlib as mpl
mpl.rcParams.update({
"figure.facecolor": "none",
"axes.facecolor": "none",
"savefig.facecolor": "none",
})Fontconfig error: No writable cache directories
Input fra eksperter¶
# ekspert 1
lav = 10 # laveste realistiske verdi, f(lav) = 0
høy = 60 # høyeste realistiske verdi, f(høy) = 0
modus = 15 # mest sannsynlige verdi, f(modus) = max(f)
formfaktor = 15 # form på kurve (høyere=smalere)
# ekspert 2
lav2 = 0
høy2 = 40
modus2 = 12
formfaktor2 = 10Source
def modified_pert_params(low: float, peak: float, high: float, shape: float):
"""
Compute the scaled Beta parameters (alpha, beta, loc, scale) for a Modified PERT.
low, peak, high : floats with low < peak < high
shape : > 0, larger -> sharper peak (commonly 4 ≤ shape ≤ 10)
"""
if not (low < peak < high):
raise ValueError("Require low < peak < high.")
if shape <= 0:
raise ValueError("shape must be > 0.")
scale = high - low
alpha = 1.0 + shape * (peak - low) / scale
beta_ = 1.0 + shape * (high - peak) / scale
loc = low
return alpha, beta_, loc, scale
def pert_pdf(x, low, peak, high, shape):
"""Evaluate the Modified PERT PDF at x."""
alpha, beta_, loc, scale = modified_pert_params(low, peak, high, shape)
y = (np.asarray(x) - loc) / scale # map to [0,1]
pdf_unit = beta_dist.pdf(y, a=alpha, b=beta_) # Beta on [0,1]
return pdf_unit / scale # scale factor
def plot_pert_pdf(low, peak, high, shape, n_points=600, ax=None, title=None, label = None, color = None):
alpha, beta_, loc, scale = modified_pert_params(low, peak, high, shape)
x = np.linspace(low, high, n_points)
pdf = pert_pdf(x, low, peak, high, shape)
if ax is None:
fig, ax = plt.subplots(figsize=(8, 4.5))
ax.fill_between(x, pdf, color=color, alpha=0.3,label = label)
ax.plot(x, pdf, color=color, lw=2)
ax.plot(low,0,'v', markersize = 10,color=color,label = 'Lav, Høy, Modus')
ax.plot(peak,0,'v', markersize = 10,color=color)#, label = 'Modus')
ax.plot(high,0,'v', markersize = 10,color=color)#,label = 'Grense høy')
ax.set_xlim(0, 60)
ax.set_ylim([-0.01,0.11])
ax.set_title(title)
ax.set_xlabel("Tid (år)",fontsize = 12)
ax.set_ylabel("f(t)", fontsize = 12)
ax.legend()
txt = (f"Scaled beta parameters:\n"
f"alpha = {alpha:.3f}\n"
f"beta = {beta_:.3f}\n"
f"loc = {loc:.3f}\n"
f"scale = {scale:.3f}")
#ax.text(0.99, 0.95, txt, ha="right", va="top",
# transform=ax.transAxes, fontsize=9,
# bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="#90a4ae"))
print(txt)
print(' ')
return axSammenlikning av forskjellige ekspertinput¶
plot_pert_pdf(lav, modus, høy, formfaktor,label = 'Ekspert 1',color='b')
plt.tight_layout()
plt.grid()
plt.show()Scaled beta parameters:
alpha = 2.500
beta = 14.500
loc = 10.000
scale = 50.000

ax = plot_pert_pdf(lav2, modus2, høy2, formfaktor2,label = 'Ekspert 2',color='r')
plt.tight_layout()
plt.grid()
plt.show()Scaled beta parameters:
alpha = 4.000
beta = 8.000
loc = 0.000
scale = 40.000
