кубическая интерполяция в Java

#java #math #interpolation

#java #математика #интерполяция

Вопрос:

Для программы Java, которую я создаю, мне нужно интерполировать 4 точки, чтобы вычислить значение y для 5-й точки при заданном значении x. Допустим, у меня есть следующие моменты:

 p1(0, 0)
p2(1, 2)
p3(2, 4)
p4(3, 3)
// The x-values will always be 0, 1, 2, and 3
  

Теперь я хочу интерполировать эти точки, чтобы найти, каким должно быть значение y для данного x, скажем, x = 1.2 (это значение x всегда будет между точкой 2 и точкой 3)

Кто-нибудь может помочь мне создать Java-метод для нахождения координаты y этой пятой точки?

Комментарии:

1. Какой метод интерполяции вы планируете использовать? Какие значения предопределены? Градиенты? вторые градиенты?

2. Пожалуйста, подтвердите: вы хотите соответствовать кубическому многочлену?

3. Мне просто нужно, чтобы линия была гладкой между четырьмя точками, я думаю, это называется кубической интерполяцией (но я могу ошибаться ..)

4. Это довольно сложная область, поэтому мне нужны дополнительные разъяснения. Вы хотите, чтобы она была «графически» гладкой или «математически» гладкой?

5. Тогда используйте Catmull-Rom. Вы просто могли получить полный ответ, но об этой технике хорошо написано в Интернете.

Ответ №1:

Обычно задаются две точки (x0, y0) и (x1,y1), для x0 < x < x1, путем интерполяции, y = y0 (x — x0)/(x1 — x0) * (y1 — y0)

Здесь y = 2 (x-1) * 2

Ответ №2:

Существует бесконечное количество линий, которые могут проходить через все четыре ваши точки.

Например, вы могли бы предположить, что в каждой точке наклон равен нулю, а затем нарисовать простые s-образные кривые между ними, или вы могли бы предположить, что наклон вычисляется из соседних точек (с некоторыми специальными решениями о концах), или вы могли бы предположить, что наклон в точках равен 2 и т.д.

И это не останавливается на достигнутом, вы могли бы эффективно нарисовать кривую, которая будет инкапсулировать ваши точки и любую другую точку, которую вы можете себе представить, при этом соблюдая требование непрерывности (как вы называете, гладкой).).

Я думаю, вам нужно начать с формулы, которую вы хотите сопоставить с точками, а затем выбрать метод, который вы используете, чтобы минимизировать ошибку подгонки. Без того, чтобы вы принимали больше решений, весьма вероятно, что будет очень трудно дать больше указаний.

Комментарии:

1. Технически вы правы, существует бесконечное количество возможных решений, но интерполяция обычно дает только одно решение. Это потому, что теоретически вы могли бы сделать наклон в каждой точке равным, скажем, 1000, но это не выглядело бы как гладкая линия.

2. Если бы вы выбрали функцию синусоидальных волн для «интеграции» ваших точек, она была бы плавной и с правильной частотой, давала бы вам любой наклон, который вы хотели, в любой точке. Вы начинаете с характеристик кривой (иначе формулы), а затем пытаетесь подогнать, или вы придумываете что-то, что выглядит хорошо, но в лучшем случае является формулой, составленной по частям.