2015-08-18 3 views
2

Я использовал интерполяцию Apache Math с использованием LinearInterpolator(). Интерполировать (x1, y1). К сожалению, я не мог найти способ экстраполяции.Экстраполяция в java

Как я могу сделать линейную экстраполяцию в java?

x1 = [1, 2, 3, 4, 5];

y1 = [2, 4, 8, 16, 32];

Я хотел бы знать значения любого x2, а не только того, что входит в диапазон x1.

При попытке извлечь значение 6 я получаю: OutOfRangeException если {@code v} находится вне домена * функции сплайн (меньше наименьшей точки узла или больше, чем по величине точки узла).

Редактировать: Вот моя простая интерполяционная функция. Я бы хотел включить возможность экстраполяции, как в MathLab (interp2). Используя массивы x1 и y1 для ввода этой функции, я получаю OutOfRangeException Apache, потому что значение 6 не содержится в массиве x1.

public static List<Double> interpolateLinear(double[] x1, double[] y1, Double[] x2) { 
    List<Double> resultList; 
    final PolynomialSplineFunction function = new LinearInterpolator().interpolate(x1, y1); 
    resultList = Arrays.stream(x2).map(aDouble -> function.value(aDouble)).collect(Collectors.toList()); 
    return resultList; 
} 

Edit2: Пришлось прочитать немного о .value метод объекта PolynomialSplineFunction, чтобы получить это право, но там идет (все заслуга пользователя Joni) Спасибо человеку:

public static double[] interpolateLinear(double[] x1, double[] y1, double[] x2) { 
    final PolynomialSplineFunction function = new LinearInterpolator().interpolate(x1, y1); 
    final PolynomialFunction[] splines = function.getPolynomials(); 
    final PolynomialFunction firstFunction = splines[0]; 
    final PolynomialFunction lastFunction = splines[splines.length - 1]; 

    final double[] knots = function.getKnots(); 
    final double firstKnot = knots[0]; 
    final double lastKnot = knots[knots.length - 1]; 

    double[] resultList = Arrays.stream(x2).map(aDouble -> { 
     if (aDouble > lastKnot) { 
      return lastFunction.value(aDouble - knots[knots.length - 2]); 
     } else if (aDouble < firstKnot) 
      return firstFunction.value(aDouble - knots[0]); 
     return function.value(aDouble); 
    }).toArray(); 
    return resultList; 
} 
+3

как этот вопрос получить upvote? где ваш код 'java'? что вы пробовали? каковы ожидаемые результаты (например, какую экстраполяцию вы пытаетесь сделать)? – BeyelerStudios

+0

Я добавил свою интерполяционную функцию. Этот вопрос поднялся, потому что я отправил его другу, который тоже не смог найти ответ, и он тоже интересовался его обнаружением. Ожидаемый вывод для x2 (6) будет 64 при использовании массивов (x1, y1) в качестве входных данных. –

+0

Вы хотите [* экстраполяция *] (https://en.wikipedia.org/wiki/Extrapolation), но Apache Math поддерживает только * интерполяцию * (https://en.wikipedia.org/wiki/Interpolation) , – Bohemian

ответ

5

Вы можете получить первый и последний полиномиальные сплайны из интерполятора и использовать их для экстраполяции.

PolynomialSplineFunction function = new LinearInterpolator().interpolate(x1, y1); 
PolynomialFunction[] splines = function.getPolynomials(); 
PolynomialFunction first = splines[0]; 
PolynomialFunction last = splines[splines.length-1]; 
// use first and last to extrapolate 

Вы не получите 64 из 6, хотя. Вы должны ожидать 48 из линейной экстраполяции. Что будет показано, что extrapolation is bound to give you wrong answers.

+1

Это ... это золото. –

Смежные вопросы