public double GetValue(double t, double k) { if (k > _minCol && k < _maxCol) { var kIndex = _colGrid.GetRangeLeftIndexOf(k); var k1 = _colGrid[kIndex]; var k2 = _colGrid[kIndex + 1]; var boarder1 = _valueOnGrids.GetCol(kIndex); var boarder2 = _valueOnGrids.GetCol(kIndex + 1); var var1 = new CubicHermiteFdInterpolator(_rowGrid.Select((v, i) => Tuple.Create(v, Math.Pow(boarder1[i], 2) * v)).ToArray()).GetValue(t); var var2 = new CubicHermiteFdInterpolator(_rowGrid.Select((v, i) => Tuple.Create(v, Math.Pow(boarder2[i], 2) * v)).ToArray()).GetValue(t); var var = var1 + (k - k1) * (var2 - var1) / (k2 - k1); return(Math.Sqrt(var / t)); } else { if (t < _minRow && k < _minCol) { return((double)_valueOnGrids.GetValue(_rowGrid.ToList().IndexOf(_minRow), _colGrid.ToList().IndexOf(_minCol))); } if (t < _minRow && k > _maxCol) { return((double)_valueOnGrids.GetValue(_rowGrid.ToList().IndexOf(_minRow), _colGrid.ToList().IndexOf(_maxCol))); } if (t > _maxRow && k < _minCol) { return((double)_valueOnGrids.GetValue(_rowGrid.ToList().IndexOf(_maxRow), _colGrid.ToList().IndexOf(_minCol))); } if (t > _maxRow && k > _maxCol) { return((double)_valueOnGrids.GetValue(_rowGrid.ToList().IndexOf(_maxRow), _colGrid.ToList().IndexOf(_maxCol))); } if (k <= _minCol) { var boarder = _valueOnGrids.GetCol(_colGrid.GetRangeLeftIndexOf(_minCol)); var variance = new CubicHermiteFdInterpolator(_rowGrid.Select((v, i) => Tuple.Create(v, Math.Pow(boarder[i], 2) * v)).ToArray()).GetValue(t); return(Math.Sqrt(variance / t)); } if (k >= _maxCol) { var boarder = _valueOnGrids.GetCol(_colGrid.GetRangeLeftIndexOf(_maxCol)); var variance = new CubicHermiteFdInterpolator(_rowGrid.Select((v, i) => Tuple.Create(v, Math.Pow(boarder[i], 2) * v)).ToArray()).GetValue(t); return(Math.Sqrt(variance / t)); } } throw new PricingLibraryException("VarianceBiCubicSpline interpolation failed"); }
public double GetValue(double t, double k) { if (k > _minCol && k < _maxCol) { var kIndex = _colGrid.GetRangeLeftIndexOf(k); var k1 = _colGrid[kIndex]; var k2 = _colGrid[kIndex + 1]; var boarder1 = _valueOnGrids.GetCol(kIndex); var boarder2 = _valueOnGrids.GetCol(kIndex + 1); var vol1 = new CubicHermiteFdInterpolator(_rowGrid.Select((v, i) => Tuple.Create(v, boarder1[i])).ToArray()).GetValue(t); var vol2 = new CubicHermiteFdInterpolator(_rowGrid.Select((v, i) => Tuple.Create(v, boarder2[i])).ToArray()).GetValue(t); var vol = vol1 + (k - k1) * (vol2 - vol1) / (k2 - k1); return(vol); } else { if (t < _minRow && k < _minCol) { return((double)_valueOnGrids.GetValue(_rowGrid.ToList().IndexOf(_minRow), _colGrid.ToList().IndexOf(_minCol))); } if (t < _minRow && k > _maxCol) { return((double)_valueOnGrids.GetValue(_rowGrid.ToList().IndexOf(_minRow), _colGrid.ToList().IndexOf(_maxCol))); } if (t > _maxRow && k < _minCol) { return((double)_valueOnGrids.GetValue(_rowGrid.ToList().IndexOf(_maxRow), _colGrid.ToList().IndexOf(_minCol))); } if (t > _maxRow && k > _maxCol) { return((double)_valueOnGrids.GetValue(_rowGrid.ToList().IndexOf(_maxRow), _colGrid.ToList().IndexOf(_maxCol))); } if (k <= _minCol) { var boarder = _valueOnGrids.GetCol(_colGrid.GetRangeLeftIndexOf(_minCol)); return(new CubicHermiteFdInterpolator(_rowGrid.Select((v, i) => Tuple.Create(v, boarder[i])).ToArray()).GetValue(t)); } if (k >= _maxCol) { var boarder = _valueOnGrids.GetCol(_colGrid.GetRangeLeftIndexOf(_maxCol)); return(new CubicHermiteFdInterpolator(_rowGrid.Select((v, i) => Tuple.Create(v, boarder[i])).ToArray()).GetValue(t)); } } throw new PricingLibraryException("Bicubicspline interpolation failed"); }