Интерполяция на графике, где X является логарифмическим (полулогарифмический граф)

#c# #interpolation

#c# #интерполяция

Вопрос:

Я пытаюсь выполнить интерполяцию на графике, где данные аппроксимируются отрезками, конечно, поскольку график логарифмический, это не сегменты, а фрагменты экспонент / логарифмов.

Итак, мне нужно найти функцию, которая интерполирует новое значение Y с учетом координат отрезка и значения X.

пример графа того же типа:

график с логарифмической осью 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. В конце концов, проблема заключалась не в полулогарифме! Спасибо!