2010-10-04 20 views
8

[Ảnh chụp màn hình bên dưới]Trong Mathematica, chức năng nội suy nào là ListPlot sử dụng?

Tôi đã sử dụng ListPlot để vẽ một đường trơn thông qua một số điểm dữ liệu. Nhưng tôi muốn có thể làm việc với đạo hàm thứ nhất và thứ 2 của cốt truyện, vì vậy tôi nghĩ tôi sẽ tạo ra một "hàm" thực tế bằng cách sử dụng Interpolation. Nhưng như bạn thấy trong hình, nó không trơn tru. Có một số gai lạ khi tôi làm Lô [Nội suy [...] ...]. Tôi tự hỏi làm thế nào ListPlot có được chức năng nội suy của nó, và làm thế nào tôi có thể nhận được cùng một điều, bằng cách sử dụng Interpolation [] hoặc một số phương pháp khác.

cảm ơn,
Rob

Dưới đây là một số văn bản cho sao chép/dán:

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

Người cuối cùng có gai.

Chỉnh sửa ...

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

Trả lời

4

Tôi tin rằng phương pháp được sử dụng bởi ListPlot cho phép nội suy là suy từng phối hợp như một chức năng của chỉ số danh sách. Một cái gì đó như sau trông rất giống đầu ra từ ListPlot[...,InterpolationOrder->3]:

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

Từ một suy như vậy, bạn sẽ có thể lấy các dẫn xuất của mình thông qua sự khác biệt tiềm ẩn, ví dụ dx/dy == (dx/dt)/(dy/dt). Một thỏa thích phô trương ký hiệu rằng ở một nơi mà nó có thể làm cho một số nhà toán học puke :)

+0

Cảm ơn, đây chỉ là những gì tôi đang tìm kiếm. –

4

Xin lỗi vì đã dissapoint bạn, nhưng câu trả lời là rất đơn giản. ListLinePlot/ListPlot chỉ vẽ một đường thẳng

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

Mathematica graphics

sản xuất dòng un-hacky cùng. Bạn cũng có thể có sự khác biệt về thành công khi áp dụng phép nội suy bậc hai và sử dụng Splines.

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

Mathematica graphics

+0

Ah, tôi đã không nhận thấy rằng những người đã thực sự thẳng.Nhưng những gì về khi bạn thêm interpolationOrder -> 3 cho cả hai người trong số họ? (Tôi đã cố gắng thêm một số mã vào nhận xét này ... ý tưởng tồi ... hãy để tôi chỉnh sửa câu hỏi.) –

+1

Được rồi, với InterpolationOrder -> 3 trên cả hai, tôi có một đường cong trơn tru với các đoạn tròn trên ListPlot, nhưng một đường cong hack với Plot [Interpolation [... –

5

lẽ dễ dàng hơn:

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

Trong "khu vực quan tâm":

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

enter image description here

Nếu bạn muốn liên tục thứ hai phái sinh, chỉ cần tăng thứ tự nội suy như thế này:

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

enter image description here

Các vấn đề liên quan