Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Kurvetilpasning av PERT

Authors
Affiliations
SINTEF Energi
SINTEF Energi
SINTEF Energi

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 = 10
Source
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 ax

Sammenlikning 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
 
<Figure size 800x450 with 1 Axes>
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
 
<Figure size 800x450 with 1 Axes>