public void ProbabilityFunctionTest4()
{
// https://code.google.com/p/accord/issues/detail?id=98
/*
mean = c(0.25, 0.082)
sigma = matrix(c(0.0117, 0.0032}, 0.0032, 0.001062), 2, 2)
d = seq(0.03, 0.13, 0.0001)
n <- length(d)
r <- rep(0, n)
for (i in 1:n) {
r[i] = dmnorm(c(0.25, d[i]), mean, sigma)
}
*/
var target = new MultivariateNormalDistribution(
new[] { 0.25, 0.082 },
new[,] { { 0.0117, 0.0032 }, { 0.0032, 0.001062 } });
double[] vec = { 0.25, -1d };
double[] d = Matrix.Vector(0.03, 0.13, 0.01);
double[] actual = new double[d.Length];
double[] expected =
{
0.07736363146686682512598, 0.95791683037271524447931, 6.94400533773376249513376,
29.47023331179536498325433, 73.22314665629953367442795, 106.51345886810220520146686,
90.70931216253406148553040, 45.22624649290145271152142, 13.20141558295499173425469,
2.25601377127287250345944, 0.22571180597171525139544, 0.2257118059717152513954
};
for (int i = 0; i < d.Length; i++)
{
vec[1] = d[i];
actual[i] = target.ProbabilityDensityFunction(vec);
}
for (int i = 0; i < actual.Length; i++)
Assert.AreEqual(expected[i], actual[i], 1e-12);
for (int i = 0; i < d.Length; i++)
{
vec[1] = d[i];
actual[i] = System.Math.Exp(target.LogProbabilityDensityFunction(vec));
}
for (int i = 0; i < actual.Length; i++)
Assert.AreEqual(expected[i], actual[i], 1e-12);
}