Пример #1
0
        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");
        }
Пример #2
0
        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");
        }