2013-06-27 42 views
7

Tôi đang cố gắng vừa với một đường tròn hình khối đến một tập hợp các điểm nhất định. Điểm của tôi không được đặt hàng. Tôi KHÔNG THỂ sắp xếp hoặc sắp xếp lại các điểm, vì tôi cần thông tin đó.Sử dụng chức năng scipy.interpolate.splrep

Nhưng kể từ khi hàm scipy.interpolate.splrep chỉ hoạt động trên các điểm không trùng lặp và đơn điệu, tôi đã xác định một hàm ánh xạ tọa độ x thành không gian tăng đơn điệu.

điểm cũ của tôi là:

xpoints=[4913.0, 4912.0, 4914.0, 4913.0, 4913.0, 4913.0, 4914.0, 4915.0, 4918.0, 4921.0, 4925.0, 4932.0, 4938.0, 4945.0, 4950.0, 4954.0, 4955.0, 4957.0, 4956.0, 4953.0, 4949.0, 4943.0, 4933.0, 4921.0, 4911.0, 4898.0, 4886.0, 4874.0, 4865.0, 4858.0, 4853.0, 4849.0, 4848.0, 4849.0, 4851.0, 4858.0, 4864.0, 4869.0, 4877.0, 4884.0, 4893.0, 4903.0, 4913.0, 4923.0, 4935.0, 4947.0, 4959.0, 4970.0, 4981.0, 4991.0, 5000.0, 5005.0, 5010.0, 5015.0, 5019.0, 5020.0, 5021.0, 5023.0, 5025.0, 5027.0, 5027.0, 5028.0, 5028.0, 5030.0, 5031.0, 5033.0, 5035.0, 5037.0, 5040.0, 5043.0] 

ypoints=[10557.0, 10563.0, 10567.0, 10571.0, 10575.0, 10577.0, 10578.0, 10581.0, 10582.0, 10582.0, 10582.0, 10581.0, 10578.0, 10576.0, 10572.0, 10567.0, 10560.0, 10550.0, 10541.0, 10531.0, 10520.0, 10511.0, 10503.0, 10496.0, 10490.0, 10487.0, 10488.0, 10488.0, 10490.0, 10495.0, 10504.0, 10513.0, 10523.0, 10533.0, 10542.0, 10550.0, 10556.0, 10559.0, 10560.0, 10559.0, 10555.0, 10550.0, 10543.0, 10533.0, 10522.0, 10514.0, 10505.0, 10496.0, 10490.0, 10486.0, 10482.0, 10481.0, 10482.0, 10486.0, 10491.0, 10497.0, 10506.0, 10516.0, 10524.0, 10534.0, 10544.0, 10552.0, 10558.0, 10564.0, 10569.0, 10573.0, 10576.0, 10578.0, 10581.0, 10582.0] 

Plots:

Erroneous trace Mã cho chức năng lập bản đồ và nội suy là:

xnew=[] 
ynew=ypoints 

for c3,i in enumerate(xpoints): 
     if np.isfinite(np.log(i*pow(2,c3))): 
        xnew.append(np.log(i*pow(2,c3))) 
     else: 
        if c==0: 
         xnew.append(np.random.random_sample()) 
        else: 
         xnew.append(xnew[c3-1]+np.random.random_sample()) 
xnew=np.asarray(xnew) 
ynew=np.asarray(ynew) 
constant1=10.0 
nknots=len(xnew)/constant1 
idx_knots = (np.arange(1,len(xnew)-1,(len(xnew)-2)/np.double(nknots))).astype('int') 
knots = [xnew[i] for i in idx_knots] 
knots = np.asarray(knots) 
int_range=np.linspace(min(xnew),max(xnew),len(xnew)) 
tck = interpolate.splrep(xnew,ynew,k=3,task=-1,t=knots) 
y1= interpolate.splev(int_range,tck,der=0) 

Mã này được ném một lỗi ở chức năng interpolate.splrep() cho một số tập hợp các điểm như trên.

Lỗi này là: File "/home/neeraj/Desktop/koustav/res/BOS5/fit_spline3.py", dòng 58, trong save_spline_f tck = interpolate.splrep (xnew, ynew, k = 3, nhiệm vụ = -1, t = knots) Tệp "/usr/lib/python2.7/dist-packages/scipy/interpolate/fitpack.py", dòng 465, in splrep tăng _iermess ier (_iermess [ier] [0]) Giá trị lỗi: Lỗi trên dữ liệu đầu vào

Nhưng đối với một số điểm khác, nó hoạt động tốt. Ví dụ cho tập hợp các điểm sau đây.

xpoints=[1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1630.0, 1630.0, 1630.0, 1631.0, 1631.0, 1631.0, 1631.0, 1630.0, 1629.0, 1629.0, 1629.0, 1628.0, 1627.0, 1627.0, 1625.0, 1624.0, 1624.0, 1623.0, 1620.0, 1618.0, 1617.0, 1616.0, 1615.0, 1614.0, 1614.0, 1612.0, 1612.0, 1612.0, 1611.0, 1610.0, 1609.0, 1608.0, 1607.0, 1607.0, 1603.0, 1602.0, 1602.0, 1601.0, 1601.0, 1600.0, 1599.0, 1598.0] 

ypoints=[10570.0, 10572.0, 10572.0, 10573.0, 10572.0, 10572.0, 10571.0, 10570.0, 10569.0, 10565.0, 10564.0, 10563.0, 10562.0, 10560.0, 10558.0, 10556.0, 10554.0, 10551.0, 10548.0, 10547.0, 10544.0, 10542.0, 10541.0, 10538.0, 10534.0, 10532.0, 10531.0, 10528.0, 10525.0, 10522.0, 10519.0, 10517.0, 10516.0, 10512.0, 10509.0, 10509.0, 10507.0, 10504.0, 10502.0, 10500.0, 10501.0, 10499.0, 10498.0, 10496.0, 10491.0, 10492.0, 10488.0, 10488.0, 10488.0, 10486.0, 10486.0, 10485.0, 10485.0, 10486.0, 10483.0, 10483.0, 10482.0, 10480.0] 

Plots: Trace for which there was no error ai có thể đề xuất những gì đang xảy ra ?? Cảm ơn trước ......

+0

Với mã bạn đã gửi, 'ynew' kết thúc lên được một mảng trống: bạn không bao giờ thêm bất cứ điều gì vào danh sách đó. Do đó lỗi. Chính xác thì bạn đang cố gắng gì để phù hợp với spline? Các điểm như bị đánh lừa? Hoặc các điểm được sắp xếp theo đơn điệu tăng x? Tại sao bạn không thể tạo một bản sao * đã đặt * của dữ liệu nếu đó là những gì bạn cần? – Jaime

+0

Xin lỗi về thông tin còn thiếu. Tôi đã thực hiện ynew = ypoints. Tôi đang lắp đường thẳng vào (xnew, ynew). Vì tôi không thể đặt hàng các điểm x, tôi đã ánh xạ chúng thành các điểm tăng đơn điệu, xnew. Sau khi tôi đã trang bị các spline để (xnew, ynew) Tôi đang tìm ra một tập hợp các điểm mới (y1, int_range). Tại đây, int_range = np.linspace (phút (xnew), max (xnew), len (xnew)) Tôi đã thay đổi mã ... Vui lòng xem –

+0

Bạn có thể sử dụng 'splrep()': http://stackoverflow.com/questions/14244289/scipy-interpolating-trajectory – HYRY

Trả lời

1

Tôi tin rằng mục đích của hàm bạn đang sử dụng, splrep(), là để phù hợp với y phối hợp như một chức năng của x phối hợp: y = f (x).

Để splrep() hoạt động như mong đợi, chức năng của bạn phải có giá trị đơn. Tức là, bạn phải có khả năng vẽ một đường thẳng đứng trên biểu đồ ở bất kỳ đâu và nó có giao cắt chính xác một lần.

Thay vào đó, có thể bạn muốn phù hợp với x và y riêng rẽ thành thông số thứ ba t tăng monotonically.

x = f (t)
y = g (t)

Có hai sự lựa chọn dễ dàng cho t. Đầu tiên chỉ là chỉ số của điểm (0 cho điểm đầu tiên, 1 cho điểm thứ hai, v.v.). Lựa chọn thứ hai khó hơn một chút, khoảng cách đường thẳng tích lũy được truyền từ điểm này sang điểm khác. Sau đó, bạn sẽ gọi riêng số slrep() cho các tọa độ x y.

t = [0] 
for i in range(1, len(x)): 
    t[i] = t[i-1]+np.hypot(x[i]-x[i-1], y[i]-y[i-1]) 

Có lẽ bạn thay vì muốn có đường cong bezier?

+0

Cảm ơn câu trả lời. Tôi đã cố gắng để làm cho chức năng này tăng lên một cách đơn điệu bằng cách sử dụng np.log (i * pow (2, c3)) .Tôi đã thử sử dụng tùy chọn đầu tiên mà bạn cung cấp. Kết quả ít nhiều giống nhau với cùng một lỗi. Chúng tôi không thể có bản sao cho các giá trị y? Tôi có chúng. Đó có phải là vấn đề không. Tôi không chắc. Nhưng cảm ơn (+1) để trả lời. –

5

Thực ra bạn không phải tự xác định chức năng mới. Nó giống như nội suy quỹ đạo này rất nhiều: scipy: Interpolating quỹ đạo (scipy: Interpolating trajectory)

Và câu trả lời là tốt cho tôi, hy vọng nó có thể giúp bạn.

from scipy import interpolate as itp 
mytck,myu=itp.splprep([xpoints,ypoints]) 
xnew,ynew= itp.splev(np.linspace(0,1,1000),mytck) 
plot(xnew,ynew) 

Result after Spline

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