#c# #interpolation
#c# #интерполяция
Вопрос:
Я пытаюсь выполнить интерполяцию на графике, где данные аппроксимируются отрезками, конечно, поскольку график логарифмический, это не сегменты, а фрагменты экспонент / логарифмов.
Итак, мне нужно найти функцию, которая интерполирует новое значение Y с учетом координат отрезка и значения X.
пример графа того же типа:
Это моя текущая неудачная попытка:
public static float LogLinear(float x0, float x1, float y0, float y1, float x)
{
return LinearInterpolation(Math.Log(x0), Math.Log(x1), y0, y1, Math.Log(x));
}
public static float LinearInterpolation(float x0, float x1, float y0, float y1, float x)
{
float m = (x - x0) / (x1 - x0);
return y0 * (1 - m) y1 * (m);
}
Учитывая, что линии на графике являются достаточной достаточной интерполяцией, мне нужно выполнить интерполяцию по этим линиям (которые на самом деле не являются линиями).
Моя первая попытка основана на идее, что значения Y являются линейными, но значение X должно быть сопоставлено другому X, чтобы получить правильный Y, конечно, это не работает, потому что, если я нарисую отрезок между точками
Point p1 = new Point(0.1, 20);
Point p2 = new Point(10,60);
тогда для X = 1 я ожидал бы найти Y = 40, но это не так.
Я бы также ожидал такого результата, инвертируя наклон с
Point p1 = new Point(10, 20);
Point p2 = new Point(0.1,60);
Ответ №1:
Я попробовал это, и он вернул 40, как вы и ожидали. Вы уверены, что передали параметры в правильной последовательности?
void Main()
{
Math.Log(.1f).Dump();
LogLinear(0.1f,10,20,60,1).Dump();
LogLinear(10,0.1f,20,60,1).Dump();
}
public static float LogLinear(float x0, float x1, float y0, float y1, float x)
{
return LinearInterpolation((float) Math.Log(x0), (float) Math.Log(x1), y0, y1, (float) Math.Log(x));
}
public static float LinearInterpolation(float x0, float x1, float y0, float y1, float x)
{
float m = (x - x0) / (x1 - x0);
return y0 * (1 - m) y1 * (m);
}
Комментарии:
1. о боже, ты был прав, по ошибке была оставлена какая-то сортировка linq. В конце концов, проблема заключалась не в полулогарифме! Спасибо!