source: trunk/UTIL/PYTHON/powerlaw/previous_tests/randht.py @ 1242

Last change on this file since 1242 was 1053, checked in by aslmd, 11 years ago

UTIL PYTHON. tools to study dust devils in LES.

File size: 4.6 KB
Line 
1from math import *
2from random import *
3
4# function x=randht(n, varargin)
5
6# RANDHT generates n observations distributed as some continous heavy-
7# tailed distribution. Options are power law, log-normal, stretched
8# exponential, power law with cutoff, and exponential. Can specify lower
9# cutoff, if desired.
10#
11#    Example:
12#       x = randht(10000,'powerlaw',alpha);
13#       x = randht(10000,'xmin',xmin,'powerlaw',alpha);
14#       x = randht(10000,'cutoff',alpha, lambda);
15#       x = randht(10000,'exponential',lambda);
16#       x = randht(10000,'lognormal',mu,sigma);
17#       x = randht(10000,'stretched',lambda,beta);
18#
19#    See also PLFIT, PLVAR, PLPVA
20#
21#    Source: http://www.santafe.edu/~aaronc/powerlaws/
22
23
24# Version 1.0.2 (2008 April)
25# Copyright (C) 2007 Aaron Clauset (Santa Fe Institute)
26
27# Ported to python by Joel Ornstein (2011 August)
28# (joel_ornstein@hmc.edu)
29
30# Distributed under GPL 2.0
31# http://www.gnu.org/copyleft/gpl.html
32# RANDHT comes with ABSOLUTELY NO WARRANTY
33#
34# Notes:
35#
36def randht(n,*varargin):
37    Type   = '';
38    xmin   = 1;
39    alpha  = 2.5;
40    beta   = 1;
41    Lambda = 1;
42    mu     = 1;
43    sigma  = 1;
44
45
46    # parse command-line parameters; trap for bad input
47    i=0; 
48    while i<len(varargin): 
49        argok = 1; 
50        if type(varargin[i])==str: 
51            if varargin[i] == 'xmin':
52                xmin = varargin[i+1]
53                i = i + 1
54            elif varargin[i] == 'powerlaw':
55                Type = 'PL'
56                alpha  = varargin[i+1]
57                i = i + 1
58            elif varargin[i] == 'cutoff':
59                Type = 'PC';
60                alpha  = varargin[i+1]
61                Lambda = varargin[i+2]
62                i = i + 2
63            elif varargin[i] == 'exponential':
64                Type = 'EX'
65                Lambda = varargin[i+1]
66                i = i + 1
67            elif varargin[i] == 'lognormal':
68                Type = 'LN';
69                mu = varargin[i+1]
70                sigma = varargin[i+2]
71                i = i + 2
72            elif varargin[i] == 'stretched':
73                Type = 'ST'
74                Lambda = varargin[i+1]
75                beta = varargin[i+2]
76                i = i + 2
77            else: argok=0
78       
79     
80        if not argok: 
81            print '(RANDHT) Ignoring invalid argument #' ,i+1 
82     
83        i = i+1 
84
85    if n<1:
86        print '(RANDHT) Error: invalid ''n'' argument; using default.\n'
87        n = 10000;
88
89    if xmin < 1:
90        print '(RANDHT) Error: invalid ''xmin'' argument; using default.\n'
91        xmin = 1;
92
93
94
95
96    x=[]
97    if Type == 'EX':
98        x=[]
99        for i in range(n):
100            x.append(xmin - (1./Lambda)*log(1-random()))
101    elif Type == 'LN':
102        y=[]
103        for i in range(10*n):
104            y.append(exp(mu+sigma*normalvariate(0,1)))
105
106        while True:
107            y= filter(lambda X:X>=xmin,y)
108            q = len(y)-n;
109            if q==0: break
110
111            if q>0:
112                r = range(len(y));
113                shuffle(r)
114                ytemp = []
115                for j in range(len(y)):
116                    if j not in r[0:q]:
117                        ytemp.append(y[j])
118                y=ytemp
119                break
120            if (q<0):
121                for j in range(10*n):
122                    y.append(exp(mu+sigma*normalvariate(0,1)))
123           
124        x = y
125       
126    elif Type =='ST':
127        x=[]
128        for i in range(n):
129            x.append(pow(pow(xmin,beta) - (1./Lambda)*log(1.-random()),(1./beta)))
130    elif Type == 'PC':
131       
132        x = []
133        y=[]
134        for i in range(10*n):
135            y.append(xmin - (1./Lambda)*log(1.-random()))
136        while True:
137            ytemp=[]
138            for i in range(10*n):
139                if random()<pow(y[i]/float(xmin),-alpha):ytemp.append(y[i])
140            y = ytemp
141            x = x+y
142            q = len(x)-n
143            if q==0: break;
144
145            if (q>0):
146                r = range(len(x))
147                shuffle(r)
148
149                xtemp = []
150                for j in range(len(x)):
151                    if j not in r[0:q]:
152                        xtemp.append(x[j])
153                x=xtemp
154                break;
155           
156            if (q<0):
157                y=[]
158                for j in range(10*n):
159                    y.append(xmin - (1./Lambda)*log(1.-random()))
160
161
162    else:
163        x=[]
164        for i in range(n):
165            x.append(xmin*pow(1.-random(),-1./(alpha-1.)))
166
167    return x
168                             
169
Note: See TracBrowser for help on using the repository browser.