Экстраполяция OutOfRangeException Apache Commons Math

Я пытаюсь реализовать функцию экстраполяции, используя библиотеку Apache Commons Math и функции PolynomialSplineFunction и LinearInterpolator.

 public double[] linearInterp(double[] x, double[] y, double[] xi) {
   LinearInterpolator li = new LinearInterpolator(); // or other interpolator
   PolynomialSplineFunction psf = li.interpolate(x, y);

   double[] yi = new double[xi.length];
   for (int i = 0; i < xi.length; i++) {
       yi[i] = psf.value(xi[i]);
   }
   return yi;
}

x = [0, 60, 120,180,240];

y = [196, 232, 250, 157, 300];

xi = [300, 360, 420];

проблема в том, что если я использую значение за пределами диапазона x, я получаю OutOfRangeException есть ли способ экстраполировать с помощью этого метода? как мне обойти эту ошибку.


person JTK    schedule 15.04.2016    source источник
comment
stackoverflow.com/questions/32076041/extrapolation-in-java   -  person martinez314    schedule 16.04.2016
comment
Да, не удалось заставить это работать должным образом: stackoverflow.com/questions/36655244/ В результатах не было колебаний, они либо росли, либо уменьшались. Подумал, что, возможно, в моем вводе было что-то другое, что потребовало бы другого решения.   -  person JTK    schedule 16.04.2016


Ответы (1)


Если вы посмотрите на документацию PolynomialSimlineFunction Documentaition вы можете прочитать о методе значения "OutOfRangeException - если v находится за пределами домена функции сплайна (меньше наименьшей узловой точки или больше наибольшей узловой точки). "

Это вполне разумно, так как интерполяция из узлов не является аппроксимацией вашей функции. То, что вы пытаетесь просто не имеет смысла с математической точки зрения.

person Nevado    schedule 15.04.2016
comment
Какая часть того, что я пытаюсь сделать, не имеет смысла, является ли моя цель вообще недостижимой или я просто пытаюсь это сделать? Из чтения вики-страницы (я знаю, что это не очень хорошая ссылка) говорится, что формула для линейной интерполяции идентична линейной экстраполяции. Итак, если это правда, почему это не может быть достигнуто таким образом? также ссылка на решение очень похожей проблемы, которое размещено в комментариях, подсказывает, что это возможно? другое решение неверно? - person JTK; 16.04.2016
comment
Экстраполяция возможна, если функция, которую вы пытаетесь экстраполировать, является полиномиальной функцией известной степени или если вы знаете форму функции (log, sin, ...). Проблема здесь в том, что вы делаете Linear< /b> экстраполяция, и вы не можете сделать линейную аппроксимацию между узлом и бесконечностью (в основном только с одним узлом). - person Nevado; 16.04.2016
comment
Могу ли я в любом случае экстраполировать свои данные? Я бы не хотел тратить так много времени на это, не имея ничего, что можно было бы показать, если бы вы могли указать правильное направление, если бы я использовал SplineInterpolator, LoessInterpolator или NevilleInterpolator для экстраполяции, может быть? если нужно будет избавить меня от моих страданий, и я неохотно уйду от этого усилия. - person JTK; 16.04.2016
comment
Я буду исследовать дальше и опубликую ответ, как только смогу :) - person Nevado; 16.04.2016
comment
NevilleInterpolator сделает эту работу. Но вы должны учитывать, что для того, чтобы экспраполяция работала (имела разумную ошибку), ваши данные должны быть из полинома степени n-1 (или меньше), равного n количеству узлов. Вы не получите OutOfRangeException, потому что на этот раз вы будете оценивать не PolynomialSplineFunction, а PolynomialFunctionLagrangeForm, который можно оценить по всем пунктам. - person Nevado; 18.04.2016
comment
Я попробовал ваше решение, и OutOfRangeException исчез, и результаты колеблются, но значения не находятся в диапазоне набора данных и все являются отрицательными значениями, возможно, я неправильно понял что-то, что вы объяснили, возвращаемые значения: -1.9789738863701387E43, -7.958942185870982E48 Я чувствую, что я близок, не могли бы вы рассказать немного подробнее, что означает data must be from a polynomial of degree n-1 (or less), может быть, это то место, где я падаю. - person JTK; 18.04.2016
comment
Этот метод даст вам многочлен, который проходит через все точки, степень этого многочлена будет n-1 или меньше, где n - количество точек. Я думаю, что происходит то, что вам нужна линейная или полиномиальная корректировка ваших данных. Какой функции они должны следовать (линейной, квадратичной,...)? - person Nevado; 18.04.2016
comment
Значения будут постоянно находиться в одном и том же диапазоне, они увеличиваются и уменьшаются, я пытался выяснить функцию, которой они должны следовать (я студент), это не квадратичная, может быть, линейная прямая линия (кусочно линейная функция)? Я добавил несколько изображений моих графиков к вопросу. - person JTK; 19.04.2016
comment
Если это рыночные значения или что-то в этом роде, эти данные могут не обязательно следовать полиномиальной функции. Делать прогнозы такого рода намного сложнее, чем экстраполировать функцию, для этого вам нужны продвинутые поведенческие модели. - person Nevado; 20.04.2016
comment
Спасибо за помощь @Nevado, я нашел альтернативное решение (только построение ожидаемой функции) с использованием другой библиотеки. - person JTK; 25.04.2016