예제 #1
0
        public override double GetV(params double[] t)
        {
            var tt = t[0];
            int n  = SetN(tt);

            //Экстраполяция (пока только 2 типа)
            if (n < 0 || n == _length - 1 || _length == 1)
            {
                ExtrapolType ET_temp = n < 0 ? ET_left : ET_right;
                n = n < 0 ? 0 : n;
                N = n;
                switch (ET_temp)
                {
                case ExtrapolType.etZero:
                    if (n == _length - 1 && (tt == _x[0] || tt == _x[_length - 1]))
                    {
                        return(_y[n]);
                    }
                    return(0);

                case ExtrapolType.etValue:
                    return(_y[n]);

                case ExtrapolType.etMethod_Line: {
                    n -= n == _length - 1 ?
                         1 :
                         0;
                    N = n;
                    return(InterpMethodXYLine(n, tt));
                }

                case ExtrapolType.etRepeat:
                    //Не забыть изменить в Interp<>
                    RepeatShift(ref tt);
                    return(GetV(tt));

                default:
                    return(_y[n]);
                }
            }
            if (InterpType == InterpolType.itLine)
            {
                return(InterpMethodXYLine(n, tt));
            }
            if (InterpType == InterpolType.itStep)
            {
                return(_y[n]);
            }
            return(InterpMethodXYLine(n, tt));
        }
예제 #2
0
        /// <summary>
        /// Получить значение в точке с координатами t;
        /// t[0] - координата самого низкого порядка, для интерполяции вложенных одномерных интерполяторов
        /// t[1] - координата для интерполяции между значениями, полученных при помощи одномерных интерполяторов
        /// t[2] - -----//-----
        /// Пример: Одномерный интерполятор InterpXY.GetV(t) => y = f(t)
        ///         Двумерный интерполятор  InterpXY.GetV(t,X) => y = f(t,X)
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public virtual TRes GetV(params double[] t)
        {
            if (_data.Count == 0 || t.Length == 0)
            {
                return(default(TRes));
            }
            int n = SetN(t.Last());

            //Экстраполяция (пока только 2 типа)
            if (n < 0 || n == _data.Count - 1 || _data.Count == 1)
            {
                ExtrapolType ET_temp = n < 0 ? ET_left : ET_right;
                n  = n < 0 ? 0 : n;
                _n = n;
                switch (ET_temp)
                {
                case ExtrapolType.etZero:
                    if (n == _data.Count - 1 && _data.ContainsKey(t[0]))
                    {
                        return(GetVSub(n, t));
                    }
                    return(default(TRes));

                case ExtrapolType.etValue:
                    return(GetVSub(n, t));

                case ExtrapolType.etMethod_Line: {
                    n -= n == _data.Count - 1 ?
                         1 :
                         0;
                    _n = n;
                    return(InterpMethodLine(n, t));
                }

                case ExtrapolType.etRepeat:
                    //Не забыть изменить в InterpXY
                    int l           = t.Length;
                    var shiftParams = new double[l];
                    Array.Copy(t, shiftParams, l);
                    RepeatShift(ref shiftParams[l - 1]);
                    return(GetV(shiftParams));

                default:
                    return(GetVSub(n, t));
                }
            }
            return(InterpMethodCurr(n, t));
        }