В Mathematica, какую функцию интерполяции использует ListPlot? - PullRequest
8 голосов
/ 04 октября 2010

[Скриншот ниже]

Я использовал ListPlot, чтобы нарисовать плавную линию через некоторые точки данных. Но я хочу иметь возможность работать с 1-й и 2-й производной графика, поэтому я подумал, что создам реальную «функцию» с использованием интерполяции. Но, как вы можете видеть на картинке, это не гладко. Есть некоторые странные всплески, когда я делаю заговор [Интерполяция [...] ...]. Мне интересно, как ListPlot получает его интерполированную функцию и как я могу получить то же самое, используя Interpolation [] или какой-то другой метод.

спасибо,
Роб

Вот текст для копирования / вставки:

myPoints = {{0.,3.87},{1.21,4.05},{2.6,4.25},{4.62,4.48},{7.24,4.73},{9.66,4.93},
{12.48,5.14},{14.87,5.33},{17.34,5.55},{19.31,5.78},{20.78,6.01},{22.08,6.34},
{22.82,6.7},{23.2,7.06},{23.41,7.54},{23.52,8.78},{23.59,9.59},{23.62,9.93},
{23.72,10.24},{23.88,10.56},{24.14,10.85},{24.46,11.05},{24.81,11.2},
{25.73,11.44},{27.15,11.63}}

ListPlot[myPoints, Joined -> True, Mesh -> Full] 

Plot[Interpolation[myPoints][x], {x, 0, 27.2}] 

У последнего есть шипы.

Изменить ...

Gleno pointed out that my List plot is linear.  But what about when both have 
InterpolationOrder -> 3?
ListPlot[myPoints, Joined -> True, Mesh -> Full, InterpolationOrder -> 3]
Plot[Interpolation[myPoints, InterpolationOrder -> 3][x], {x, 0, 27.2}]

Mathematica ListPlot Screenshot

Ответы [ 3 ]

5 голосов
/ 11 октября 2011

Возможно, проще:

interp = Interpolation[myPoints, InterpolationOrder -> 2, Method -> "Spline"]

(*Now let's plot the function and its derivative*)
Show[ListPlot@myPoints, 
     Plot[{interp'[x], interp[x]}, 
          {x, Min[First /@ myPoints], Max[First /@ myPoints]}, PlotRange -> All]]

enter image description here

В «области интересов»:

Show[Plot[{interp'[x], interp[x]}, {x, 23, 24}], ListPlot@myPoints]

enter image description here

Если вам нужна непрерывная вторая производная, просто увеличьте порядок интерполяции следующим образом:

interp = Interpolation[myPoints, InterpolationOrder -> 3, Method -> "Spline"];
Show[Plot[{interp'[x], interp[x]}, {x, 23, 24}], ListPlot@myPoints]

enter image description here

4 голосов
/ 05 октября 2010

Я полагаю, что метод, используемый ListPlot для интерполяции, заключается в интерполяции каждой координаты как функции индекса списка. Нечто подобное выглядит очень похоже на вывод ListPlot[...,InterpolationOrder->3]:

With[{
  xyInterpolation=Interpolation[#,InterpolationOrder->3]&/@Transpose[myPoints]},
  ParametricPlot[Through[xyInterpolation[i]],{i,1,Length[myPoints]}]
]

С помощью такой интерполяции вы сможете получать производные с помощью неявного дифференцирования, например, дх / дд == (дх / дт) / (дт / дт). Приятно выставлять напоказ эту запись в том месте, где это может вызвать рвоту у некоторых математиков:)

4 голосов
/ 05 октября 2010

Извините, что разочаровал вас, но ответ очень прост. ListLinePlot / ListPlot просто рисует прямую линию

Plot[Interpolation[myPoints, InterpolationOrder -> 1][x], {x, 0, 27.2}]

Mathematica graphics

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

Plot[Interpolation[myPoints, InterpolationOrder -> 2, Method -> "Spline"][x], {x, 0, 27.2}]

Mathematica graphics

...