Я использовал интерполяцию 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;
}
как этот вопрос получить upvote? где ваш код 'java'? что вы пробовали? каковы ожидаемые результаты (например, какую экстраполяцию вы пытаетесь сделать)? – BeyelerStudios
Я добавил свою интерполяционную функцию. Этот вопрос поднялся, потому что я отправил его другу, который тоже не смог найти ответ, и он тоже интересовался его обнаружением. Ожидаемый вывод для x2 (6) будет 64 при использовании массивов (x1, y1) в качестве входных данных. –
Вы хотите [* экстраполяция *] (https://en.wikipedia.org/wiki/Extrapolation), но Apache Math поддерживает только * интерполяцию * (https://en.wikipedia.org/wiki/Interpolation) , – Bohemian