2010-10-04 56 views
8

[Captura de pantalla siguiente]En Mathematica, ¿qué función de interpolación utiliza ListPlot?

Estaba usando ListPlot para trazar una línea sin problemas a través de algunos puntos de datos. Pero quiero poder trabajar con la 1ra y la 2da derivada de la trama, así que pensé crear una "función" real usando la interpolación. Pero como puedes ver en la imagen, no es suave. Hay algunos picos extraños cuando hago Plot [Interpolation [...] ...]. Me pregunto cómo obtendrá ListPlot su función de interpolación, y cómo puedo obtener lo mismo, usando Interpolation [] o algún otro método.

gracias,
Rob

Aquí es un poco de texto para copiar/pegar:

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}] 

El último tiene picos.

Editar ...

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

Respuesta

4

creo que el método utilizado por ListPlot para la interpolación es interpolar cada coordenada en función del índice de la lista. Algo parecido a lo siguiente se parece mucho a la salida de ListPlot[...,InterpolationOrder->3]:

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

partir de una interpolación tal, debe ser capaz de agarrar sus derivados a través de la derivación implícita, por ejemplo, dx/dy == (dx/dt)/(dy/dt). Una delicia para hacer alarde de que la notación en un lugar donde podría hacer que algunos matemáticos vomitar :)

+0

Gracias, esto es justo lo que estaba buscando. –

4

Siento decepcionarlo, pero la respuesta es muy simple. ListLinePlot/ListPlot simplemente dibuja una línea recta

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

Mathematica graphics

produce la misma línea de no-hacky. También puede tener diferentes niveles de éxito aplicando interpolación de segundo orden y utilizando Splines.

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

Mathematica graphics

+0

Ah, no me di cuenta que se trataba en realidad recta.Pero, ¿qué pasa cuando agrega interpolationOrder -> 3 a ambos? (Traté de agregar algún código a este comentario ... mala idea ... déjame editar la pregunta.) –

+1

Bien, con InterpolationOrder -> 3 en ambos, obtengo una curva suave con segmentos redondeados en el ListPlot, pero una curva hacky con el argumento [Interpolación [... –

5

Quizás más fácil:

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

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

enter image description here

En la "región de interés":

Show[Plot[{interp'[x], interp[x]}, {x, 23, 24}], [email protected]] 

enter image description here

Si quieres un segunda derivada continua, sólo aumentará el orden de interpolación como esto:

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

enter image description here

Cuestiones relacionadas