Package com.opengamma.analytics.example.coupledfokkerplank

Source Code of com.opengamma.analytics.example.coupledfokkerplank.CoupledFokkerPlankExample

/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.example.coupledfokkerplank;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;

import org.json.simple.JSONObject;

import com.opengamma.analytics.financial.model.finitedifference.BoundaryCondition;
import com.opengamma.analytics.financial.model.finitedifference.DirichletBoundaryCondition;
import com.opengamma.analytics.financial.model.finitedifference.ExponentialMeshing;
import com.opengamma.analytics.financial.model.finitedifference.ExtendedCoupledFiniteDifference;
import com.opengamma.analytics.financial.model.finitedifference.ExtendedCoupledPDEDataBundle;
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.finitedifference.PDEResults1D;
import com.opengamma.analytics.financial.model.finitedifference.applications.CoupledPDEDataBundleProvider;
import com.opengamma.analytics.financial.model.finitedifference.applications.PDEUtilityTools;
import com.opengamma.analytics.financial.model.finitedifference.applications.TwoStateMarkovChainDataBundle;
import com.opengamma.analytics.financial.model.interestrate.curve.ForwardCurve;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.interpolation.DoubleQuadraticInterpolator1D;
import com.opengamma.analytics.math.interpolation.GridInterpolator2D;

/**
* Example for coupled fokker.
*/
@SuppressWarnings({"deprecation", "unused", "unchecked" })
public class CoupledFokkerPlankExample {
//CSOFF
 
  public static final CoupledPDEDataBundleProvider PDE_DATA_PROVIDER = new CoupledPDEDataBundleProvider();
  public static final BoundaryCondition LOWER;
  public static final BoundaryCondition UPPER;

  public static final double SPOT = 1.0;
  public static final ForwardCurve FORWARD;
  public static final double T = 5.0;
  public static final double RATE = 0.0;
  public static final double VOL1 = 0.20;
  public static final double VOL2 = 0.70;
  public static final double LAMBDA12 = 0.2;
  public static final double LAMBDA21 = 2.0;
  public static final double INITIAL_PROB_STATE1 = 1.0;
  public static final ExtendedCoupledPDEDataBundle DATA1;
  public static final ExtendedCoupledPDEDataBundle DATA2;

  public static final DoubleQuadraticInterpolator1D INTERPOLATOR_1D = new DoubleQuadraticInterpolator1D();
  public static final GridInterpolator2D GRID_INTERPOLATOR2D = new GridInterpolator2D(INTERPOLATOR_1D, INTERPOLATOR_1D);

  static {

    FORWARD = new ForwardCurve(SPOT, RATE);
    TwoStateMarkovChainDataBundle chainData = new TwoStateMarkovChainDataBundle(VOL1, VOL2, LAMBDA12, LAMBDA21, INITIAL_PROB_STATE1);
    ExtendedCoupledPDEDataBundle[] pdeData = PDE_DATA_PROVIDER.getCoupledFokkerPlankPair(FORWARD, chainData);
    DATA1 = pdeData[0];
    DATA2 = pdeData[1];

    final Function1D<Double, Double> upper1stDev = new Function1D<Double, Double>() {
      @Override
      public Double evaluate(final Double t) {
        return Math.exp(-RATE * t);
      }
    };

    LOWER = new DirichletBoundaryCondition(0.0, 0.0);
    UPPER = new DirichletBoundaryCondition(0.0, 15.0 * SPOT);

  }

  public static void main(String[] args) throws Exception {
    runCoupledFokkerPlank(System.out);
  }

  public static void runCoupledFokkerPlank(PrintStream out) throws FileNotFoundException, IOException {
    final ExtendedCoupledFiniteDifference solver = new ExtendedCoupledFiniteDifference(0.5);
    final int tNodes = 50;
    final int xNodes = 150;

    final MeshingFunction timeMesh = new ExponentialMeshing(0, T, tNodes, 5.0);
    final MeshingFunction spaceMesh = new HyperbolicMeshing(LOWER.getLevel(), UPPER.getLevel(), SPOT, xNodes, 0.01);

    final double[] timeGrid = new double[tNodes];
    for (int n = 0; n < tNodes; n++) {
      timeGrid[n] = timeMesh.evaluate(n);
    }

    final double[] spaceGrid = new double[xNodes];
    for (int i = 0; i < xNodes; i++) {
      spaceGrid[i] = spaceMesh.evaluate(i);
    }
    final PDEGrid1D grid = new PDEGrid1D(timeGrid, spaceGrid);

    final PDEResults1D[] res = solver.solve(DATA1, DATA2, grid, LOWER, UPPER, LOWER, UPPER, null);
    final PDEFullResults1D res1 = (PDEFullResults1D) res[0];
    final PDEFullResults1D res2 = (PDEFullResults1D) res[1];

    JSONObject json = new JSONObject();

    ByteArrayOutputStream state_1_stream = new ByteArrayOutputStream();
    PrintStream state_1_out = new PrintStream(state_1_stream, true);
    PDEUtilityTools.printSurface("State 1 density", res1, state_1_out);
    state_1_out.close();
    json.put("state_1_data", state_1_stream.toString());

    ByteArrayOutputStream state_2_stream = new ByteArrayOutputStream();
    PrintStream state_2_out = new PrintStream(state_2_stream, true);
    PDEUtilityTools.printSurface("State 2 density", res2, state_2_out);
    state_2_out.close();
    json.put("state_2_data", state_2_stream.toString());

    out.print(json.toString());
  }
}
TOP

Related Classes of com.opengamma.analytics.example.coupledfokkerplank.CoupledFokkerPlankExample

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.