/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.finitedifference.applications;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.analytics.financial.model.finitedifference.ExponentialMeshing;
import com.opengamma.analytics.financial.model.finitedifference.HyperbolicMeshing;
import com.opengamma.analytics.financial.model.finitedifference.MeshingFunction;
import com.opengamma.analytics.financial.model.finitedifference.PDEFullResults1D;
import com.opengamma.analytics.financial.model.finitedifference.PDEGrid1D;
import com.opengamma.analytics.financial.model.interestrate.curve.ForwardCurve;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class TwoStateMarkovChainDensityTest {
private static final ForwardCurve FORWARD;
private static final TwoStateMarkovChainDataBundle DATA;
private static final TwoStateMarkovChainDensity DENSITY_CAL;
private static final double T = 2.0;
static {
double rate = 0.05;
double spot = 1.0;
FORWARD = new ForwardCurve(spot, rate);
double vol1 = 0.4;
double vol2 = 0.8;
double lambda12 = 0.2;
double lambda21 = 2.0;
double p0 = 0.9;
double beta1 = 1.0;
double beta2 = 0.0;
DATA = new TwoStateMarkovChainDataBundle(vol1, vol2, lambda12, lambda21, p0, beta1, beta2);
DENSITY_CAL = new TwoStateMarkovChainDensity(FORWARD, DATA);
}
@Test(enabled = false)
public void test() {
int tNodes = 100;
int xNodes = 200;
MeshingFunction timeMesh = new ExponentialMeshing(0, T, tNodes, 5.0);
//MeshingFunction spaceMesh = new ExponentialMeshing(0.0, 6.0 * FORWARD.getForward(T), xNodes, 3.0);
MeshingFunction spaceMesh = new HyperbolicMeshing(-0.0 * FORWARD.getForward(T), 6.0 * FORWARD.getForward(T), FORWARD.getSpot(), xNodes, 0.01);
PDEGrid1D grid = new PDEGrid1D(timeMesh, spaceMesh);
PDEFullResults1D[] res = DENSITY_CAL.solve(grid);
PDEUtilityTools.printSurface("state 1 density", res[0]);
PDEUtilityTools.printSurface("state 2 density", res[1]);
}
@Test
public void degenerateTest() {
int tNodes = 20;
int xNodes = 100;
MeshingFunction timeMesh = new ExponentialMeshing(0, T, tNodes, 5.0);
MeshingFunction spaceMesh = new HyperbolicMeshing(-0.0 * FORWARD.getForward(T), 6.0 * FORWARD.getForward(T), FORWARD.getSpot(), xNodes, 0.01);
PDEGrid1D grid = new PDEGrid1D(timeMesh, spaceMesh);
double l12 = 0.3;
double l21 = 2.0;
double pi1 = l21 / (l12 + l21);
TwoStateMarkovChainDataBundle data = new TwoStateMarkovChainDataBundle(0.2, 0.2, l12, l21, pi1, 0.5, 0.5);
TwoStateMarkovChainDensity cal = new TwoStateMarkovChainDensity(FORWARD, data);
PDEFullResults1D[] res = cal.solve(grid);
for (int i = 0; i < xNodes; i++) {
assertEquals(res[0].getFunctionValue(i, tNodes - 1) / pi1, res[1].getFunctionValue(i, tNodes - 1) / (1 - pi1), 1e-6);
}
}
}