LINUX.ORG.RU

Проблема со сплаином

 , , , spline


0

1

Есть четыре случайные точки. Если их рисовать функцией plot то получается ломаная линия. Универсальный сплайн некорректно работает.
Код:

from scipy.interpolate import UnivariateSpline
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

m = Basemap(llcrnrlon=0,llcrnrlat=-80,urcrnrlon=360,urcrnrlat=80,projection='mill', lon_0=50)
m.drawcoastlines()
m.drawparallels(np.arange(-90.,91.,30.), labels=[False,True,True,False])
m.drawmeridians(np.arange(-360, 361, 60), labels=[True,False,False,True])

lats = np.array([60, 40, 50, 60])

lons = np.array([60, 90, 70, 60])
 
x, y = m(lons, lats)
m.plot(x, y, 'D-', markersize=2, linewidth=0, color='r', markerfacecolor='b')

s = UnivariateSpline(x, y)

newx = np.linspace(x.min(),x.max(),300)

newy = s(newx)


m.plot(newx, newy, 'D-', markersize=0, linewidth=1, color='r', markerfacecolor='b')
plt.show()
x:[  6671692.45708087  10007538.68562131   7783641.19992768
   6671692.45708087]
y:  [ 19299144.15184047  16372993.24035927  17749739.88073428
  19299144.15184047]
newx: [  6671692.45708087   7042342.03802981   7412991.61897875
   7783641.19992768   8154290.78087662   8524940.36182556   8895589.9427745
   9266239.52372343   9636889.10467237  10007538.68562131]
newy:  [ nan  nan  nan  nan  nan  nan  nan  nan  nan  nan]
В чем проблема?

★★★★★

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

lats = np.array([60, 40, 50])
lons = np.array([60, 90, 70])

x, y = m(lons, lats)

print x
print y

s = UnivariateSpline(x, y,k=2)

newx = np.linspace(x.min(),x.max(),20)

newy = s(newx)

print newx
print newy

Получим

[  6671692.45708087  10007538.68562131   7783641.19992768]
[ 19299145.13764048  16372994.22615927  17749740.86653427]
[  6671692.45708087   6847263.31121458   7022834.16534828
   7198405.01948199   7373975.8736157    7549546.72774941
   7725117.58188311   7900688.43601682   8076259.29015053
   8251830.14428424   8427400.99841794   8602971.85255165
   8778542.70668536   8954113.56081906   9129684.41495277
   9305255.26908648   9480826.12322018   9656396.97735389   9831967.8314876
  10007538.68562131]
[ 19299145.13764048  19016340.32138631  18747846.26885933
  18493662.98005953  18253790.4549869   18028228.69364147
  17816977.69602321  17620037.46213213  17437407.99196823
  17269089.28553152  17115081.34282198  16975384.16383962
  16849997.74858446  16738922.09705647  16642157.20925565
  16559703.08518204  16491559.72483557  16437727.12821631
  16398205.29532424  16372994.2261593 ]

Вызывать UnivariateSpline с параметром k=2 нужно, потому что для сплайна нужна минимум k+1 точка.

keyran ★★
()
Ответ на: комментарий от keyran

Да я уже решил проблему экстраполяцией, но все равно спасибо, буду знать.

deterok ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.