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