-
Notifications
You must be signed in to change notification settings - Fork 0
/
lakemodel_function.py
51 lines (40 loc) · 1.66 KB
/
lakemodel_function.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
'''
Created on May 2, 2017
@author: jhkwakkel
'''
from __future__ import division
import math
import numpy as np
from scipy.optimize import brentq
def lake_problem(
b = 0.42, # decay rate for P in lake (0.42 = irreversible)
q = 2.0, # recycling exponent
mean = 0.02, # mean of natural inflows
stdev = 0.0017, # future utility discount rate
delta = 0.98, # standard deviation of natural inflows
alpha = 0.4, # utility from pollution
nsamples = 100, # Monte Carlo sampling of natural inflows
steps=100,
**kwargs):
decisions = [kwargs[str(i)] for i in range(steps)]
Pcrit = brentq(lambda x: x**q/(1+x**q) - b*x, 0.01, 1.5)
nvars = len(decisions)
X = np.zeros((nvars,))
average_daily_P = np.zeros((nvars,))
decisions = np.array(decisions)
reliability = 0.0
for _ in range(nsamples):
X[0] = 0.0
natural_inflows = np.random.lognormal(
math.log(mean**2 / math.sqrt(stdev**2 + mean**2)),
math.sqrt(math.log(1.0 + stdev**2 / mean**2)),
size = nvars)
for t in range(1,nvars):
X[t] = (1-b)*X[t-1] + X[t-1]**q/(1+X[t-1]**q) + decisions[t-1] +\
natural_inflows[t-1]
average_daily_P[t] += X[t]/float(nsamples)
reliability += np.sum(X < Pcrit)/float(nsamples*nvars)
max_P = np.max(average_daily_P)
utility = np.sum(alpha*decisions*np.power(delta,np.arange(nvars)))
inertia = np.sum(np.abs(np.diff(decisions)) > 0.02)/float(nvars-1)
return max_P, utility, inertia, reliability