public static DataTable TestData() { DataTable results = new DataTable(); results.Columns.Add(new DataColumn("R", typeof(double))); results.Columns.Add(new DataColumn("Vorg", typeof(double))); results.Columns.Add(new DataColumn("Vmath", typeof(double))); results.Columns.Add(new DataColumn("Vmc", typeof(double))); results.Columns.Add(new DataColumn("Vgum", typeof(double))); Optimizations.UseAnalyticalConvolution = false; Optimizations.UseFftConvolution = false; int experiments = 10; int samples = 1000; int randoms = (int)10e2; int testType = 5; double m1 = 0; double m2 = 0; //для тестов 6, 7 - положение левой границы for (int i = 0; i < experiments; i++) { double s1 = 1; double s2 = s1 * InterpolateLiner(0.1, 10, i, experiments); var pair = GetData(testType, m1, m2, s1, s2, out double vOriginal, out double gum, out string formula); DistributionsEvaluator evaluator = new DistributionsEvaluator(formula); Dictionary <string, BaseDistribution> keyValuePairs = new Dictionary <string, BaseDistribution>(); keyValuePairs.Add("A", pair[0].GetDistribution(samples)); keyValuePairs.Add("B", pair[1].GetDistribution(samples)); BaseDistribution resultMath = evaluator.EvaluateDistributions(keyValuePairs, new List <CorrelatedPair>()); List <double> monteCarloQ = new List <double>(); for (int j = 0; j < 10; j++) { var resultMonteCarlo = new MonteCarloDistribution(formula, new Dictionary <string, DistributionSettings> { { "A", pair[0] }, { "B", pair[1] } }, randoms, 100); monteCarloQ.Add(resultMonteCarlo.Variance); } double monteCarloQresult = Math.Sqrt(monteCarloQ.Sum(x => Math.Pow(x - vOriginal, 2)) / (monteCarloQ.Count - 1)) * 1.96; results.Rows.Add(s2 / s1, vOriginal, resultMath.Variance, vOriginal + monteCarloQresult, gum); } return(results); }
private static BasicDistributionData GenerateBasicData(DistributionsEvaluator evaluator, Dictionary <string, DistributionSettings> univariateDistributions, Dictionary <string[], MultivariateDistributionSettings> multivariateDistributions, int samples, int pockets) { if (evaluator == null) { throw new ArgumentNullException(nameof(evaluator)); } if (univariateDistributions == null) { throw new ArgumentNullException(nameof(univariateDistributions)); } if (samples < 3) { throw new DistributionsArgumentException(DistributionsArgumentExceptionType.NumberOfExperimentsMustBeGreaterThenTwo); } if (pockets < 3) { throw new DistributionsArgumentException(DistributionsArgumentExceptionType.NumberOfPocketsMustBeGreaterThenTwo); } BasicDistributionData data = new BasicDistributionData(); double[] random; if (multivariateDistributions == null) { random = GenerateRandom(evaluator, univariateDistributions, samples); } else { random = GenerateRandom(evaluator, univariateDistributions, multivariateDistributions, samples); } Array.Sort(random); double[] xAxis = CommonRandomMath.GenerateXAxis(random[0], random[samples - 1], pockets, out _); double[] cdf = GenerateCDF(xAxis, random); data.RandomSorted = random; data.XAxis = xAxis; data.CDF = cdf; data.PDF = Derivate(cdf, xAxis[pockets - 1] - xAxis[0]); return(data); }
private static double[] GenerateRandom(DistributionsEvaluator evaluator, Dictionary <string, DistributionSettings> univariateDistributions, Dictionary <string[], MultivariateDistributionSettings> multivariateDistributions, int samples) { double[] random = new double[samples]; var order = evaluator.Parameters; MultivariateGenerator generator = new MultivariateGenerator(order, univariateDistributions, multivariateDistributions); Parallel.For(0, samples, i => { Random rnd = Rnd.Value; double[] args = generator.Generate(rnd); random[i] = evaluator.EvaluateCompiled(args); }); return(random); }
private static double[] GenerateRandom(DistributionsEvaluator evaluator, Dictionary <string, DistributionSettings> randomSource, int samples) { double[] random = new double[samples]; var order = evaluator.Parameters; int argsCount = order.Length; UnivariateContinuousDistribution[] orderedDistributions = new UnivariateContinuousDistribution[argsCount]; ThreadLocal <double[]> argsLocal = new ThreadLocal <double[]>(() => new double[argsCount]); for (int i = 0; i < argsCount; i++) { string arg = order[i]; if (randomSource.TryGetValue(arg, out DistributionSettings value)) { orderedDistributions[i] = value.GetUnivariateContinuoisDistribution(); } else { // TODO: check this out // throw new DistributionsArgumentException($"Parameter value \"{arg}\" is missing", $"Отсутствует значение параметра \"{arg}\""); throw new DistributionsArgumentException(DistributionsArgumentExceptionType.ParameterValueIsMissing, arg); } } Parallel.For(0, samples, i => { double[] args = argsLocal.Value; Random rnd = Rnd.Value; for (int j = 0; j < argsCount; j++) { args[j] = orderedDistributions[j].Generate(rnd); } random[i] = evaluator.EvaluateCompiled(args); }); return(random); }