public void testSimpleCovarianceModels() { //"Testing simple covariance models..."; //SavedSettings backup; const int size = 10; const double tolerance = 1e-14; int i; LmCorrelationModel corrModel=new LmExponentialCorrelationModel(size, 0.1); Matrix recon = corrModel.correlation(0.0,null) - corrModel.pseudoSqrt(0.0,null)*Matrix.transpose(corrModel.pseudoSqrt(0.0,null)); for (i=0; i<size; ++i) { for (int j=0; j<size; ++j) { if (Math.Abs(recon[i,j]) > tolerance) Assert.Fail("Failed to reproduce correlation matrix" + "\n calculated: " + recon[i,j] + "\n expected: " + 0); } } List<double> fixingTimes=new InitializedList<double>(size); for (i=0; i<size; ++i) { fixingTimes[i] = 0.5*i; } const double a=0.2; const double b=0.1; const double c=2.1; const double d=0.3; LmVolatilityModel volaModel=new LmLinearExponentialVolatilityModel(fixingTimes, a, b, c, d); LfmCovarianceProxy covarProxy=new LfmCovarianceProxy(volaModel, corrModel); LiborForwardModelProcess process=new LiborForwardModelProcess(size, makeIndex()); LiborForwardModel liborModel=new LiborForwardModel(process, volaModel, corrModel); for (double t=0; t<4.6; t+=0.31) { recon = covarProxy.covariance(t,null) - covarProxy.diffusion(t,null)*Matrix.transpose(covarProxy.diffusion(t,null)); for (int k=0; k<size; ++k) { for (int j=0; j<size; ++j) { if (Math.Abs(recon[k,j]) > tolerance) Assert.Fail("Failed to reproduce correlation matrix" + "\n calculated: " + recon[k,j] + "\n expected: " + 0); } } Vector volatility = volaModel.volatility(t,null); for (int k=0; k<size; ++k) { double expected = 0; if (k>2*t) { double T = fixingTimes[k]; expected=(a*(T-t)+d)*Math.Exp(-b*(T-t)) + c; } if (Math.Abs(expected - volatility[k]) > tolerance) Assert.Fail("Failed to reproduce volatities" + "\n calculated: " + volatility[k] + "\n expected: " + expected); } } }