omega2[idx] = omega[1:] l = range(i * N, (i + 1) * N) # random phase shift on [0, 2pi) following Saltelli et al. Technometrics 1999 phi = 2 * math.pi * np.random.rand() for j in range(D): g = 0.5 + (1 / math.pi) * np.arcsin(np.sin(omega2[j] * s + phi)) X[l, j] = g scale_samples(X, pf['bounds']) return X if __name__ == "__main__": parser = common_args.create() parser.add_argument('-M', type=int, required=False, default=4, help='M coefficient, default 4') args = parser.parse_args() np.random.seed(args.seed) param_values = sample(args.samples, args.paramfile, M=args.M) np.savetxt(args.output, param_values, delimiter=args.delimiter, fmt='%.' + str(args.precision) + 'e')
def calc_vi(base, perturbed, x_delta): # v_i sensitivity measure following Sobol and Kucherenko (2009) # For comparison, Morris mu* < sqrt(v_i) dfdx = (perturbed-base)/x_delta dfdx2 = dfdx**2 return np.mean(dfdx2), np.std(dfdx2) def calc_dgsm(base, perturbed, x_delta, bounds, num_resamples, conf_level): # v_i sensitivity measure following Sobol and Kucherenko (2009) # For comparison, total order S_tot <= dgsm D = np.var(base) vi, _ = calc_vi(base, perturbed, x_delta) dgsm = vi*(bounds[1]-bounds[0])**2/(D*np.pi**2) s = np.empty(num_resamples) for i in xrange(num_resamples): r = np.random.randint(len(base), size=len(base)) s[i], _ = calc_vi(base[r], perturbed[r], x_delta[r]) return dgsm, norm.ppf(0.5 + conf_level/2) * s.std(ddof=1) if __name__ == "__main__": parser = common_args.create() parser.add_argument('-X', '--model-input-file', type=str, required=True, default=None, help='Model input file') parser.add_argument('-r', '--resamples', type=int, required=False, default=1000, help='Number of bootstrap resamples for Sobol confidence intervals') args = parser.parse_args() analyze(args.paramfile, args.model_input_file, args.model_output_file, args.column, num_resamples = args.resamples, delim = args.delimiter, print_to_console=True)