2010-10-04 6 views
8

[Screenshot unten]Welche Interpolationsfunktion verwendet ListPlot in Mathematica?

Ich benutzte ListPlot, um eine glatte Linie durch einige Datenpunkte zu zeichnen. Aber ich möchte in der Lage sein, mit der ersten und zweiten Ableitung der Handlung zu arbeiten, also dachte ich, ich würde eine tatsächliche "Funktion" mit Interpolation erstellen. Aber wie Sie auf dem Bild sehen können, ist es nicht glatt. Es gibt einige seltsame Spitzen, wenn ich Plot [Interpolation [...] ...] mache. Ich frage mich, wie ListPlot seine interpolierte Funktion bekommt, und wie ich mit Interpolation [] oder einer anderen Methode dasselbe erreichen kann.

Dank,
Rob

ist hier etwas Text für Kopieren/Einfügen:

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

Die letzte hat Spikes.

Bearbeiten ...

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

Antwort

4

Ich glaube, dass das Verfahren durch ListPlot für die Interpolation verwendet wird, ist jeweils in Abhängigkeit von dem Listenindex Koordinate zu interpolieren. So etwas wie die folgenden sieht viel wie die Ausgabe von ListPlot[...,InterpolationOrder->3]:

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

Aus einer solchen Interpolation sollten Sie in der Lage sein, Ihre Derivate über implizite Differenzierung zu greifen, zum Beispiel dx/dy == (dx/dt)/(dy/dt). Eine Freude, dass die Schreibweise an einem Ort zur Schau stellen, wo es einige Mathematiker kotzen :)

+0

Danke, das ist genau das, was ich gesucht habe. –

4

Sorry, Sie zu enttäuschen, aber die Antwort ist sehr einfach. ListLinePlot/ListPlot zieht nur eine gerade Linie

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

Mathematica graphics

die gleiche un-Hacky Linie produziert. Sie können auch unterschiedliche Erfolge erzielen, indem Sie Interpolation zweiter Ordnung und Splines anwenden.

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

Mathematica graphics

+0

Ah, ich nicht feststellen, dass die tatsächlich gerade waren.Aber was ist, wenn Sie InterpolationOrder -> 3 zu beiden hinzufügen? (Ich habe versucht, einen Code zu diesem Kommentar hinzuzufügen ... schlechte Idee ... lass mich die Frage bearbeiten.) –

+1

Okay, mit InterpolationOrder -> 3 auf beiden, bekomme ich eine glatte Kurve mit abgerundeten Segmenten auf dem ListPlot, aber eine Hacky-Kurve mit dem Plot [Interpolation [... –

5

machen könnte vielleicht einfacher:

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

In der "region of interest":

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

enter image description here

Wenn Sie möchten kontinuierliche zweite Ableitung, erhöhen nur die Interpolationsordnung wie folgt aus:

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

enter image description here