# Demo Statistical Functions version 2.3
#
# Copyright (c) 1991, 1992 Jos van der Woude, jvdwoude@hut.nl

# History:
#    -- --- 1992 Jos van der Woude:  1st version
#    06 Jun 2006 Dan Sebald:  Added some variety and plotting techniques for
#                             better visual effect.  More tutorial in nature.
#           2019 BM: Use Unicode, loops and arrays

print "                   Statistical Library Demo, version 2.3"
print "\n          Copyright (c) 1991, 1992, Jos van de Woude, jvdwoude@hut.nl"
print "\n"
print "                      Press Ctrl-C to exit right now"
pause   -1 "                      Press Return to start demo ..."

load "stat.inc"

save_encoding = GPVAL_ENCODING
set encoding utf8

eps = 1.0e-10  # Supposed to be float resolution (nice if were defined internally)

## Gamma function
xmin = -5.5
xmax = 5
ymin = -10
ymax = 10
unset key
set xzeroaxis
gsampfunc(t,n) = t<0?0.5*1/(-t+1.0)**n:1.0-0.5*1/(t+1.0)**n
set parametric
set trange [-1:1]
set sample 200
set xrange [xmin : xmax]
set yrange [ymin : ymax]
set xlabel "x"
set ylabel "Γ(x)"
set for [i=1:6] arrow i from 1-i,ymin to 1-i,ymax nohead lt 0
set title "Gamma function Γ, very useful function for probability"
plot \
  gsampfunc(5*t,5)-6, gamma(gsampfunc(5*t,5)-6) lt 1, \
  for [i=5:1:-1] \
     gsampfunc(5*t,i)-i, gamma(gsampfunc(5*t,i)-i) lt 1, \
  5*gsampfunc(5*t,2), gamma(5*gsampfunc(5*t,2)) lt 1
pause -1 "Hit return to continue"
ymin = ymin/2
ymax = ymax/2
set yrange [ymin:ymax]
set ylabel "lgamma(x)"
set for [i=1:6] arrow i from 1-i,ymin to 1-i,ymax nohead lt 0
set title "log gamma function, similarly very useful function"
plot gsampfunc(5*t,5)-6, lgamma(gsampfunc(5*t,5)-6) lt 1, \
     gsampfunc(5*t,5)-5, lgamma(gsampfunc(5*t,5)-5) lt 1, \
     gsampfunc(5*t,4)-4, lgamma(gsampfunc(5*t,4)-4) lt 1, \
     gsampfunc(5*t,3)-3, lgamma(gsampfunc(5*t,3)-3) lt 1, \
     gsampfunc(5*t,3)-2, lgamma(gsampfunc(5*t,3)-2) lt 1, \
     gsampfunc(5*t,3)-1, lgamma(gsampfunc(5*t,3)-1) lt 1, \
     5*gsampfunc(5*t,3), lgamma(5*gsampfunc(5*t,3)) lt 1
pause -1 "Hit return to continue"
unset for [i=1:6] arrow i
unset sample
unset parametric
unset xzeroaxis
set key

# Arcsinus PDF and CDF
r = 2.0
mu = 0.0
sigma = r / sqrt2
xmin = -(r+1)
xmax = r+1
unset key
set zeroaxis
set xrange [xmin : xmax]
set yrange [-0.2 : 1.2]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.1f"
set sample 50*xmax+1
set title "arcsin PDF with r = 2.0"
plot arcsin(x, r)
pause -1 "Hit return to continue"
set title "arcsin CDF with r = 2.0"
set yrange [-0.2 : 1.2]
plot carcsin(x, r)
pause -1 "Hit return to continue"

# Beta PDF and CDF
p = 5.0; q = 3.0
mu = p / (p + q)
sigma = sqrt(p**q) / ((p + q ) * sqrt(p + q + 1.0))
xmin = 0.0
xmax = 1.0
#Mode of beta PDF used
ymax = (p < 1.0 || q < 1.0) ? 2.0 : 1.4 * beta((p - 1.0)/(p + q - 2.0), p, q)
set key right box
set zeroaxis
set xrange [xmin : xmax]
set yrange [0 : ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.1f"
set sample 200
set title "beta PDF"
plot beta(x, 0.5, 0.7) title "p = 0.5, q = 0.7", \
     beta(x, 5.0, 3.0) title "p = 5.0, q = 3.0", \
     beta(x, 0.5, 2.5) title "p = 0.5, q = 2.5"
pause -1 "Hit return to continue"
set yrange [0:1.1]
set title "incomplete beta CDF"
set key left box
plot cbeta(x, 0.5, 0.7) title "p = 0.5, q = 0.7", \
     cbeta(x, 5.0, 3.0) title "p = 5.0, q = 3.0", \
     cbeta(x, 0.5, 2.5) title "p = 0.5, q = 2.5"
pause -1 "Hit return to continue"

# Binomial PDF and CDF
n = 25; p = 0.15
mu = n * p
sigma = sqrt(n * p * (1.0 - p))
xmin = int(mu - 4.0 * sigma)
xmin = xmin < -2 ? -2 : xmin
xmax = int(mu + 4.0 * sigma)
xmax = xmax < n+2 ? n+2 : xmax
ymax = 1.1 * binom(int((n+1)*p), n, p) #Mode of binomial PDF used
unset key
unset zeroaxis
set xrange [xmin : xmax]
set yrange [0 : ymax]
set xlabel "k"
set ylabel "probability density"
set ytics 0, ymax / 10, ymax
set format x "%2.0f"
set format y "%3.2f"
set sample (xmax - xmin) + 1
set title "binomial PDF with n = 25, p = 0.15"
plot binom(x, n, p) with impulses
pause -1 "Hit return to continue"
set ytics autofreq
set xzeroaxis
set title "binomial CDF with n = 25, p = 0.15"
set yrange [-0.1 : 1.1]
set ytics 0, 0.1, 1.0
plot cbinom(x, n, p) with steps
pause -1 "Hit return to continue"

# Cauchy PDF and CDF
a = 0.0; b = 2.0
#cauchy PDF has no moments
xmin = a - 5.0 * b
xmax = a + 5.0 * b
ymax = 1.1 * cauchy(a, a, b) #Mode of cauchy PDF used
set key left box
set zeroaxis
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.2f"
set sample 100
set title "Cauchy PDF"
a=0
b=2
plot [xmin:xmax] [0:ymax] cauchy(x, 0, 2) title "a = 0, b = 2", \
                          cauchy(x, 0, 4) title "a = 0, b = 4"
pause -1 "Hit return to continue"
set title "Cauchy CDF"
plot [xmin:xmax] [0:1.0] ccauchy(x, 0, 2) title "a = 0, b = 2", \
                         ccauchy(x, 0, 4) title "a = 0, b = 4"
pause -1 "Hit return to continue"

# Chi-square PDF and CDF
k = 4.0
mu = k
sigma = sqrt(2.0 * k)
xmin = mu - 4.0 * sigma
xmin = xmin < 0 ? 0 : xmin
xmax = int(mu + 4.0 * sigma)
k = 2.0
ymax = (k > 2.0 ? 1.1*chisq(k - 2.0, k) : 0.5) #Mode of chi PDF used
set key right box
set zeroaxis
set xrange [xmin+eps : xmax] #Discontinuity at zero for k < 2
set yrange [0:ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.2f"
set sample 100
set title "Chi-square χ^2 PDF"
set key right box
set samples 15*20+1
keystr(k) = sprintf("k = %d", k)
plot k = 1, x==0?1/0:chisq(x, k) title keystr(k), \
     k = 2, x==0?1/0:chisq(x, k) title keystr(k), \
     for [k = 3:8] chisq(x, k) title keystr(k)
pause -1 "Hit return to continue"
set yrange [0:1.1]
set key bottom right box
set title "Chi-square χ^2 CDF"
plot for [k = 1:8] cchisq(x, k) title keystr(k)
pause -1 "Hit return to continue"

# Erlang PDF and CDF
lambda = 1.0; n = 2.0
mu = n / lambda
sigma = sqrt(n) / lambda
xmax = int(mu + 5.0 * sigma)
n = 1.0
ymax = n < 2.0 ? 1.0 : 1.1 * erlang((n - 1.0) / lambda, n, lambda) #Mode of erlang PDF used
set zeroaxis
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.1f"
set sample 100
set title "Erlang PDF"
set key top right box
l1 = 1.0; l2 = 0.5
set arrow 1 from 2,0.8 to 0.33,erlang(0.33,1,l1)
set arrow 2 from 2,0.8 to 0.33,erlang(0.33,1,l2)
set label 1 "n = 1, exponential r.v." at 2.1,0.8 left
keystr(n,lambda) = sprintf("λ = %0.1f, n = %d", lambda, n)
plot [0:xmax] [0:ymax] n = 1, lambda = l1, erlang(x, n, lambda) title keystr(n,lambda), \
                       n = 1, lambda = l2, erlang(x, n, lambda) title keystr(n,lambda), \
                       n = 2, lambda = l1, erlang(x, n, lambda) title keystr(n,lambda), \
                       n = 2, lambda = l2, erlang(x, n, lambda) title keystr(n,lambda)
pause -1 "Hit return to continue"
unset label 1
unset arrow 1; unset arrow 2
set title "Erlang CDF"
set key bottom right box
plot [0:xmax] [0:1.1] n = 1, lambda = l1, cerlang(x, n, lambda) title keystr(n,lambda), \
                      n = 1, lambda = l2, cerlang(x, n, lambda) title keystr(n,lambda), \
                      n = 2, lambda = l1, cerlang(x, n, lambda) title keystr(n,lambda), \
                      n = 2, lambda = l2, cerlang(x, n, lambda) title keystr(n,lambda)
pause -1 "Hit return to continue"

# Thanks to mrb2j@kelvin.seas.Virginia.EDU for telling us about this.
# Extreme (Gumbel extreme value) PDF and CDF
alpha = 1.0; u = 0.0
mu = u + (0.577215665/alpha)   # Euler's constant
sigma = pi/(sqrt(6.0)*alpha)
xmin = mu - 6.0 * sigma
xmax = mu + 6.0 * sigma
ymax = 1.1 * extreme(u, u, alpha) #Mode of extreme PDF used
ymax = int(10*ymax)/10.0
set zeroaxis
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.2f"
set sample 100
set title "extreme PDF"
set key top left box
plot [xmin:xmax] [0:ymax] extreme(x, 1.0, 0.5) title "α = 0.5, u = 1.0", \
                          extreme(x, 0.0, 1.0) title "α = 1.0, u = 0.0"
pause -1 "Hit return to continue"
set title "extreme CDF"
plot [xmin:xmax] [0:1.1] cextreme(x, 1.0, 0.5) title "α = 0.5, u = 1.0", \
                         cextreme(x, 0.0, 1.0) title "α = 1.0, u = 0.0"
pause -1 "Hit return to continue"

# F PDF and CDF
df1 = 5.0; df2 = 9.0
mu = df2 < 2.0 ? 1.0 : df2 / (df2 - 2.0)
sigma = df2 < 4.0 ? 1.0 : mu * sqrt(2.0 * (df1 + df2 - 2.0) / (df1 * (df2 - 4.0)))
xmin = mu - 3.0 * sigma
xmin = xmin < 0 ? 0 : xmin
xmax = int(mu + 3.0 * sigma)
#Mode of F PDF used
ymax = df1 < 3.0 ? 1.0 : 1.1 * f((df1 / 2.0 - 1.0) / (df1 / 2.0 + df1 / df2), df1, df2)
set zeroaxis
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.2f"
set sample 100
set title "F PDF"
set key right box
plot [xmin:xmax] [0:ymax] f(x, 5.0, 9.0) title "d_1 = 5, d_2 = 9", \
                          f(x, 7.0, 6.0) title "d_1 = 7, d_2 = 6"
pause -1 "Hit return to continue"
set title "F CDF"
set key left box
plot [xmin:xmax] [0:1.1] cf(x, 5.0, 9.0) title "d_1 = 5, d_2 = 9", \
                         cf(x, 7.0, 6.0) title "d_1 = 7, d_2 = 6"
pause -1 "Hit return to continue"

# Gamma PDF and incomplete gamma CDF
rho = 1.0; lambda = 1.3
mu = rho / lambda
sigma = sqrt(rho) / lambda
xmin = mu - 4.0 * sigma
xmin = xmin < 0 ? 0 : xmin
xmax = mu + 4.0 * sigma
ymax = rho < 1.0 ? 2.0 : 1.1 * gmm((rho - 1.0) / lambda, rho, lambda) #Mode of gamma pdf used
set zeroaxis
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.1f"
set sample 100
set title "Gamma Γ PDF"
set key right
array r[7] = [0.5, 1.0, 1.0, 1.3, 2.0, 4.0, 6.0]
array l[7] = [1.0, 1.0, 1.3, 1.3, 2.0, 2.0, 2.0]
set arrow 1 from 1,1.3 to 0.15,gmm(0.15,r[1],l[1])
set label 1 "ρ < 1, tends to infinity" at 1.1,1.3 left
set arrow 2 from 1.15,1.1 to 0.35,gmm(0.35,r[3],l[3])
set label 2 "ρ = 1, finite, nonzero limit" at 1.25,1.1 left
set arrow 3 from 1.5,0.9 to 1.0,gmm(1.0,r[5],l[5])
set label 3 "ρ > 1, tends to zero" at 1.6,0.9 left
keystr(rho,lambda) = sprintf("ρ = %0.1f, λ = %0.1f", rho, lambda)
plot [0:5] [0:1.5] \
  for [i = 1:7] rho = r[i], lambda = l[i], gmm(x, rho, lambda) title keystr(rho,lambda)
pause -1 "Hit return to continue"
unset label 1; unset label 2; unset label 3
unset arrow 1; unset arrow 2; unset arrow 3
set title "incomplete gamma CDF"
set key right bottom
plot [0:5] [0:1.1] \
  for [i = 1:7] rho = r[i], lambda = l[i], cgmm(x, rho, lambda) title keystr(rho,lambda)
pause -1 "Hit return to continue"
undefine r l

# Geometric PDF and CDF
p = 0.4
mu = (1.0 - p) / p
sigma = sqrt(mu / p)
xmin = int(mu - 4.0 * sigma)
xmin = xmin < -1 ? -1 : xmin
xmin = -1
xmax = int(mu + 4.0 * sigma)
ymax = 1.1 * geometric(0, p) #mode of geometric PDF used
unset key
unset zeroaxis
set xrange [xmin : xmax]
set yrange [0 : ymax]
set xlabel "k"
set ylabel "probability density"
set ytics 0, ymax / 10, ymax
set format x "%2.0f"
set format y "%3.2f"
set sample (xmax - xmin) + 1
set title "geometric PDF with p = 0.4"
plot geometric(x, p) with impulses
pause -1 "Hit return to continue"
set title "geometric CDF with p = 0.4"
set yrange [0 : 1.1]
set ytics 0, 0.1, 1.0
plot cgeometric(x, p) with steps
pause -1 "Hit return to continue"

# Half normal PDF and CDF
mu = sqrt2invpi
sigma = 1.0
s = sigma*sqrt(1.0 - 2.0/pi)
xmin = -0.2
xmax = mu + 4.0 * s
ymax = 1.1 * halfnormal(0, sigma) #Mode of half normal PDF used
unset key
set zeroaxis
set xrange [xmin: xmax]
set yrange [-0.1: ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.1f"
set sample 100
set parametric
set trange [xmin:xmax]
set title "half normal PDF, σ = 1.0"
set arrow 1 from 0.5,0.13 to 0.0,0.4
set label 1 "Discontinuity achieved by plotting\ntwice with limited parametric ranges" at 0.2,0.1 left
plot t<0?t:-eps, halfnormal(t<0?t:-eps, sigma) ls 1, t<0?0.0:t, halfnormal(t<0?0.0:t, sigma) ls 1
pause -1 "Hit return to continue"
set title "half normal CDF, σ = 1.0"
set yrange [-0.1:1.1]
set arrow 1 from 0.45,0.1 to 0.05,0.01
set label 1 "Cusp achieved by plotting twice\nwith limited parametric ranges" at 0.5,0.1 left
plot t<0?t:-eps, chalfnormal(t<0?t:-eps, sigma) ls 1, t<0?0.0:t, chalfnormal(t<0?0.0:t, sigma) ls 1
pause -1 "Hit return to continue"
unset label 1
unset arrow 1
unset parametric

# Hypergeometric PDF and CPF
N = 75; C = 25; d = 10
p = real(C) / N
mu = d * p
sigma = sqrt(real(N - d) / (N - 1.0) * d * p * (1.0 - p))
xmin = int(mu - 4.0 * sigma)
xmin = xmin < -1 ? -1 : xmin
xmax = int(mu + 4.0 * sigma)
xmax = xmax < d+1 ? d+1 : xmax
ymax = 1.1 * hypgeo(int(mu),N,C,d) # approximate mode of hypergeometric PDF used
unset key
unset zeroaxis
set xrange [xmin : xmax]
set yrange [0 : ymax]
set xlabel "k"
set ylabel "probability density"
set ytics 0, ymax / 10, ymax
set format x "%2.0f"
set format y "%3.2f"
set sample (xmax - xmin) + 1
set title "hypergeometric PDF with N = 75, C = 25, d = 10"
plot hypgeo(x,N,C,d) with impulses
pause -1 "Hit return to continue"
set yrange [0 : 1.1]
set ytics 0, 1.0 / 10.0, 1.1
set title "hypergeometric CDF with N = 75, C = 25, d = 10"
plot chypgeo(x,N,C,d) with steps
pause -1 "Hit return to continue"

# Laplace PDF
mu = 0.0; b = 1.0
sigma = sqrt(2.0) * b
xmin = mu - 4.0 * sigma
xmax = mu + 4.0 * sigma
ymax = 1.1 * laplace(mu, mu, b) #Mode of laplace PDF used
unset key
set zeroaxis
set xrange [xmin: xmax]
set yrange [0: ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.2f"
set sample 100+1
set title "Laplace (or double exponential) PDF with µ = 0, b = 1"
set arrow 1 from -0.95,0.5 to -0.1,0.5
set label 1 "Cusp achieved by selecting point\nas part of function samples" at -1.0,0.5 right
plot laplace(x, mu, b)
pause -1 "Hit return to continue"
unset label 1
unset arrow 1
set title "Laplace (or double exponential) CDF with µ = 0, b = 1"
set yrange [0: 1.1]
plot claplace(x, mu, b)
pause -1 "Hit return to continue"

# Logistic PDF and CDF
a = 0.0; lambda = 2.0
mu = a
sigma = pi / (sqrt(3.0) * lambda)
xmin = mu - 4.0 * sigma
xmax = mu + 4.0 * sigma
ymax = 1.1 * logistic(mu, a, lambda) #Mode of logistic PDF used
unset key
set zeroaxis
set xrange [xmin: xmax]
set yrange [0: ymax]
unset key
set zeroaxis
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.1f"
set sample 100
set title "logistic PDF with a = 0, λ = 2"
plot logistic(x, a, lambda)
pause -1 "Hit return to continue"
set title "logistic CDF with a = 0, λ = 2"
set yrange [0: 1.1]
plot clogistic(x, a, lambda)
pause -1 "Hit return to continue"

# Lognormal PDF and CDF
mu = 1.0; sigma = 0.5
m = exp(mu + 0.5 * sigma**2)
s = sqrt(exp(2.0 * mu + sigma**2) * (2.0 * exp(sigma) - 1.0))
xmin = m - 4.0 * s
xmin = xmin < 0 ? 0 : xmin
xmax = m + 4.0 * s
ymax = 1.1 * lognormal(exp(mu - sigma**2), mu, sigma) #Mode of lognormal PDF used
unset key
set zeroaxis
set xrange [xmin: xmax]
set yrange [0: ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.2f"
set format y "%.2f"
set sample 100
set title "lognormal PDF with µ = 1.0, σ = 0.5"
plot lognormal(x, mu, sigma)
pause -1 "Hit return to continue"
set title "lognormal CDF with µ = 1.0, σ = 0.5"
set yrange [0: 1.1]
plot clognormal(x, mu, sigma)
pause -1 "Hit return to continue"

# Maxwell PDF
a = 0.5
mu = 2.0 / sqrt(pi) / a
sigma = sqrt(3.0 - 8.0/pi) / a
xmin = int(mu - 3.0 * sigma)
xmin = xmin < 0 ? 0 : xmin
xmax = int(mu + 3.0 * sigma)
a = 1.5
ymax = 1.1 * maxwell(1.0 / a, a) + 0.5 #Mode of maxwell PDF used
ymax = int(ymax + 0.5)
set zeroaxis
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.1f"
set sample 100
set title "Maxwell PDF"
set key right top box
plot [xmin:xmax] [0:ymax] maxwell(x, 1.5) title "a = 1.5", \
                   maxwell(x, 1.0) title "a = 1.0", \
                   maxwell(x, 0.5) title "a = 0.5"
pause -1 "Hit return to continue"
set title "Maxwell CDF"
set key right bottom box
plot [xmin:xmax] [0:1.1] cmaxwell(x, 1.5) title "a = 1.5", \
                         cmaxwell(x, 1.0) title "a = 1.0", \
                         cmaxwell(x, 0.5) title "a = 0.5"
pause -1 "Hit return to continue"

# Negative binomial PDF and CDF
r = 8; p = 0.4
mu = r * (1.0 - p) / p
sigma = sqrt(mu / p)
xmin = int(mu - 4.0 * sigma)
xmin = xmin < 0 ? 0 : xmin
xmax = int(mu + 4.0 * sigma)
ymax = 1.1 * negbin(int(mu - (1.0-p)/p), r, p) #mode of gamma PDF used
unset key
unset zeroaxis
set xrange [xmin-1 : xmax]
set yrange [0 : ymax]
set xlabel "k"
set ylabel "probability density"
set ytics 0, ymax / 10, ymax
set format x "%2.0f"
set format y "%3.2f"
set sample (xmax - xmin+1) + 1
set title "negative binomial (or Pascal or Polya) PDF with r = 8, p = 0.4"
plot negbin(x, r, p) with impulses
pause -1 "Hit return to continue"
set yrange [0 : 1.1]
set ytics 0, 0.1, 1.0
set title "negative binomial (or Pascal or Polya) CDF with r = 8, p = 0.4"
plot cnegbin(x, r, p) with steps
pause -1 "Hit return to continue"

# Negative exponential PDF and CDF
lambda = 2.0
mu = 1.0 / lambda
sigma = 1.0 / lambda
xmax =  mu + 4.0 * sigma
ymax = lambda #No mode
unset key
set zeroaxis
set xrange [0: xmax]
set yrange [0: ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.2f"
set format y "%.1f"
set sample 100
set title "negative exponential (or exponential) PDF with λ = 2.0"
plot nexp(x, lambda)
pause -1 "Hit return to continue"
set title "negative exponential (or exponential) CDF with λ = 2.0"
set yrange [0: 1.1]
plot cnexp(x, lambda)
pause -1 "Hit return to continue"

# Normal PDF and CDF
mu = 0.0; sigma = 1.0
xmin = mu - 4.0 * sigma
xmax = mu + 4.0 * sigma
mu = 2.0; sigma = 0.5
ymax = 1.1 * normal(mu, mu, sigma) #Mode of normal PDF used
set zeroaxis
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.1f"
set sample 100
set title "normal (also called Gauss or bell-curved) PDF"
set key left top box
plot [xmin:xmax] [0:ymax] normal(x, 0, 1.0) title "µ = 0, σ = 1.0", \
                          normal(x, 2, 0.5) title "µ = 2, σ = 0.5", \
                          normal(x, 1, 2.0) title "µ = 1, σ = 2.0"
pause -1 "Hit return to continue"
set title "normal (also called Gauss or bell-curved) CDF"
set key left top box
plot [xmin:xmax] [0:1.1] mu = 0, sigma = 1.0, cnormal(x, mu, sigma) title "µ = 0, σ = 1.0", \
                         mu = 2, sigma = 0.5, cnormal(x, mu, sigma) title "µ = 2, σ = 0.5", \
                         mu = 1, sigma = 2.0, cnormal(x, mu, sigma) title "µ = 1, σ = 2.0"
pause -1 "Hit return to continue"

# Pareto PDF and CDF
a = 1.0; b = 3.0
mu = a * b / (b - 1.0)
sigma = a * sqrt(b) / (sqrt(b - 2.0) * (b - 1.0))
xmin = mu - 4.0 * sigma
xmin = xmin < 0 ? 0 : xmin
xmax = int(mu + 4.0 * sigma)
ymax = 1.1 * pareto(a, a, b) #mode of pareto PDF used
ymin = -0.1 * pareto(a, a, b)
unset key
set zeroaxis
set xrange [xmin: xmax]
set yrange [ymin: ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.1f"
set sample 200+1
set title "Pareto PDF with a = 1, b = 3"
# Discontinuity at a
set parametric
set trange [0:1-eps]
x1(t) = -1 + 2*t
x2(t) =  1 + 3*t
set arrow 1 from 1.75,0.8 to 1.0,0.8
set arrow 2 from 1.0,0.0 to 1.0,3.0 nohead lt 0
set label 1 "Discontinuity achieved by plotting twice\nwith affine mapped parametric ranges" at 1.8,0.8 left
plot x1(t), pareto(x1(t), a, b) ls 1, x2(t), pareto(x2(t), a, b) ls 1
pause -1 "Hit return to continue"
unset arrow 2
set title "Pareto CDF with a = 1, b = 3"
unset parametric
set yrange [-0.1: 1.1]
set arrow 1 from 1.45,0.1 to 1.05,0.01
set label 1 "Cusp achieved by selecting point\nas part of function samples" at 1.5,0.1 left
plot cpareto(x, a, b)
pause -1 "Hit return to continue"
unset label 1
unset arrow 1

# Poisson PDF and CDF
mu = 4.0
sigma = sqrt(mu)
xmin = int(mu - 4.0 * sigma)
xmin = xmin < -1 ? -1 : xmin
xmax = int(mu + 4.0 * sigma)
ymax = 1.1 * poisson(mu, mu) #mode of poisson PDF used
unset key
set zeroaxis
set xrange [xmin : xmax]
set yrange [0 : ymax]
set xlabel "k"
set ylabel "probability density"
set ytics 0, ymax / 10, ymax
set format x "%2.0f"
set format y "%3.2f"
set sample (xmax - xmin) + 1
set title "Poisson PDF with µ = 4.0"
plot poisson(x, mu) with impulses
pause -1 "Hit return to continue"
set yrange [-0.1 : 1.1]
set ytics -0.1, 0.1, 1.1
set title "Poisson CDF with µ = 4.0"
plot cpoisson(x, mu) with steps
pause -1 "Hit return to continue"

# Rayleigh PDF and CDF
lambda = 2.0
mu = 0.5 * sqrt(pi / lambda)
sigma = sqrt((1.0 - pi / 4.0) / lambda)
xmax = mu + 4.0 * sigma
ymax = 1.1 * rayleigh(1.0 / sqrt(2.0 * lambda), lambda) #Mode of rayleigh PDF used
unset key
set zeroaxis
set xrange [0: xmax]
set yrange [0: ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.2f"
set format y "%.1f"
set sample 100
set title "Rayleigh PDF with λ = 2.0"
plot rayleigh(x, lambda)
pause -1 "Hit return to continue"
set title "Rayleigh CDF with λ = 2.0"
set yrange [0: 1.1]
plot crayleigh(x, lambda)
pause -1 "Hit return to continue"

# Sine PDF and CDF
a = 3.2; f = 2.6
mu = a / 2.0
sigma = sqrt(a * a / 3.0 * (1.0 - 3.0 / (2.0 * n * n * pi * pi)) - mu * mu)
xmin = 0.0
xmax = a - eps
a = 2; f = 1.0
ymax = 1.1 * 2.0 / a #Mode of sine PDF used
set zeroaxis
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.2f"
set format y "%.1f"
set sample 250
set title "sine PDF"
set key bottom outside
keystr(a, f) = sprintf("a = %0.1f, f = %0.1f", a, f)
array aa[4] = [2.0, 2.0, 3.25, 2.75]
array fa[4] = [1.0, 3.0, 2.6, 0.0]
a1 = 2.0; a2 = 3.25; a3 = 2.75
f1 = 1.0; f2 = 3.0; f3 = 2.6; f4 = 0.0
plot [xmin:xmax] [0:ymax] a = a1, f = f1, sine(x, f, a) title keystr(a, f), \
                          a = a1, f = f2, sine(x, f, a) title keystr(a, f), \
                          a = a2, f = f3, sine(x, f, a) title keystr(a, f), \
                          a = a3, f = f4, sine(x, f, a) title keystr(a, f) with steps
pause -1 "Hit return to continue"
set title "sine CDF"
set key top left
plot [xmin:xmax] [0:1.1] a = a1, f = f1, csine(x, f, a) title keystr(a, f), \
                         a = a1, f = f2, csine(x, f, a) title keystr(a, f), \
                         a = a2, f = f3, csine(x, f, a) title keystr(a, f), \
                         a = a3, f = f4, csine(x, f, a) title keystr(a, f) with steps
pause -1 "Hit return to continue"

# t PDF and CDF
nu = 20
mu = 0
sigma = nu > 2 ? sqrt(nu / (nu - 2.0)) : 1.0
xmin = mu - 4.0 * sigma
xmax = mu + 4.0 * sigma
ymax = 1.1 * t(mu, nu) #Mode of t PDF used
set key inside center left title "degrees of freedom"
set zeroaxis
set xrange [xmin: xmax]
set yrange [0: ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.2f"
set sample 100
set title "t PDF (and Gaussian limit)"
ks(nu) = sprintf("ν = %d", nu)
array nu[6] = [1, 2, 3, 4, 10, 20]
plot \
  for [i=1:6] t(x, nu[i]) ti ks(nu[i]), \
  normal(x, 0, 1) ti "normal"
pause -1 "Hit return to continue"
set title "t CDF (and Gaussian limit)"
set yrange [0: 1.1]
plot \
  for [i=1:6] ct(x, nu[i]) ti ks(nu[i]), \
  cnormal(x, 0, 1) ti "normal"
pause -1 "Hit return to continue"
undefine nu

# Thanks to efrank@upenn5.hep.upenn.edu for telling us about this
# triangular PDF and CDF
m = 3.0
g = 2.0
mu = m
sigma = g/sqrt(6.0)
xmin = m - 1.1*g
xmax = m + 1.1*g
ymax = 1.1 * triangular(m, m, g) #Mode of triangular PDF used
ymin = -ymax/11.0;
unset key
set zeroaxis
set xrange [xmin: xmax]
set yrange [ymin: ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.1f"
set format y "%.2f"
set sample 50*1.1*g+1
set title "triangular PDF with m = 3.0, g = 2.0"
plot triangular(x, m, g)
pause -1 "Hit return to continue"
set title "triangular CDF with m = 3.0, g = 2.0"
set yrange [-0.1: 1.1]
plot ctriangular(x, m, g)
pause -1 "Hit return to continue"

# Uniform PDF and CDF
a = -2.0; b= 2.0
mu = (a + b) / 2.0
sigma = (b - a) / sqrt(12.0)
xmin = a - 0.1*(b - a)
xmax = b + 0.1*(b - a)
ymax = 1.1 * uniform(mu, a, b) #No mode
ymin = -0.1 * uniform(mu, a, b)
unset key
set zeroaxis
set xrange [xmin: xmax]
set yrange [ymin: ymax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%.2f"
set format y "%.2f"
set sample 120+1
set title "uniform PDF with a = -2.0, b = 2.0"
plot uniform(x, a, b) with steps
pause -1 "Hit return to continue"
set title "uniform CDF with a = -2.0, b = 2.0"
set yrange [-0.1 : 1.1]
plot cuniform(x, a, b)
pause -1 "Hit return to continue"

# Weibull PDF and CDF
lambda = 1.0/5; a = 1.0
mu = 1.0 / lambda * gamma(1.0 / a) / a
sigma = sqrt(lambda**(-2.0) * (2.0 * gamma(2.0 / a) / a - (gamma(1.0 / a) / a)**2))
xmin = mu - 4.0 * sigma
xmin = xmin < 0 ? 0 : xmin
#Mode of weibull PDF used
ymax = 1.8 * (a >= 1.0 ? weibull(((a - 1.0) / a)**(1.0 / a) / lambda, a, lambda) : 2.0)
lambda = 1.0/15; a = 10.0
mu = 1.0 / lambda * gamma(1.0 / a) / a
sigma = sqrt(lambda**(-2.0) * (2.0 * gamma(2.0 / a) / a - (gamma(1.0 / a) / a)**2))
xmax = int(mu + 4.0 * sigma)
set key on title "" inside top right
set zeroaxis
set grid
set xrange [xmin : xmax]
set xlabel "x"
set ylabel "probability density"
set xtics autofreq
set ytics autofreq
set format x "%g"
set format y "%g"
set sample 100
set title "Weibull PDF"
ks(a,lambda) = sprintf("λ = 1/%g, a = %0.1f", 1.0/lambda, a)
a1 = 0.5; a2 = 1.0; a3 = 2.0; a4 = 10.0
lambda1 = 1.0/5; lambda2 = 1.0/15
set arrow 1 from 3.8,0.27 to 0.5,weibull(0.5,a1,lambda1)
set label 1 "a < 1, rate decreasing over time" at 4,0.27 left
set arrow 2 from 8,0.19 to 6.4,weibull(6.4,a3,lambda1)
set arrow 3 from 10.5,0.19 to 13,weibull(13,a4,lambda2)
set label 2 "a > 1, rate increasing over time" at 9,0.2 center
plot [] [0:ymax] lambda = lambda1, a = a1, weibull(x, a, lambda) ti ks(a, lambda), \
                 lambda = lambda1, a = a2, weibull(x, a, lambda) ti ks(a, lambda), \
                 lambda = lambda1, a = a3, weibull(x, a, lambda) ti ks(a, lambda), \
                 lambda = lambda2, a = a4, weibull(x, a, lambda) ti ks(a, lambda)
pause -1 "Hit return to continue"
unset label 1; unset label 2
unset arrow 1; unset arrow 2; unset arrow 3
set key at 9,0.4 center
set title "Weibull CDF"
plot [] [0:1.1] lambda = lambda1, a = a1, cweibull(x, a, lambda) ti ks(a, lambda), \
                lambda = lambda1, a = a2, cweibull(x, a, lambda) ti ks(a, lambda), \
                lambda = lambda1, a = a3, cweibull(x, a, lambda) ti ks(a, lambda), \
                lambda = lambda2, a = a4, cweibull(x, a, lambda) ti ks(a, lambda)
pause -1 "Hit return to continue"
reset

set encoding save_encoding
