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)); }
/// <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)); }