/** * Tests whether the Poisson process (crudely) approximates the intensity * function when a large number of runs is done. */ @Test public void intensityApproximationPoissonProcessTest() { final RandomGenerator rng = new MersenneTwister(123); final TimeSeriesGenerator pp = TimeSeries.nonHomogenousPoisson(100d, intensityFunction); final Multiset<Double> ms = TreeMultiset.create(); final int repetitions = 10000; for (int i = 0; i < repetitions; i++) { final List<Double> times = pp.generate(rng.nextLong()); for (final Double d : times) { ms.add(new Double(Math.ceil(d))); } } for (final Multiset.Entry<Double> entry : ms.entrySet()) { final double exp = IntensityFunctions.areaByIntegration( intensityFunction, entry.getElement() - 1d, entry.getElement()); final double observation = entry.getCount() / (double) repetitions; assertEquals(exp, observation, 0.05); } } }
assertEquals( .369903, IntensityFunctions.areaByIntegration(sine, 0, 1d / sine.getFrequency()), 0.000001); assertEquals( .31831, IntensityFunctions.areaByIntegration(sine, 0, 1d / sine.getFrequency()), 0.00001); assertEquals( .269903, IntensityFunctions.areaByIntegration(sine, 0, 1d / sine.getFrequency()), 0.000001); assertEquals( 36000, IntensityFunctions.areaByIntegration(sine, 0, 1d / sine.getFrequency()), 0.00001); assertEquals( 27.2065, IntensityFunctions.areaByIntegration(sine, 0, 1d / sine.getFrequency()), 0.0001);