我一直在尝试使用scipy.interpolate.bisplrep()和scipy.interpolate.interp2d()来查找(218x135)二维球面极坐标网格上数据的插值。我把网格节点笛卡尔位置的二维数组X和Y传递给它们。我一直有如下错误(对于线性插值。使用interp2d):
“警告:不能再添加结,因为附加结将重合 一个旧的。可能原因:体重太小或太大 到一个不准确的数据点。(fp>;秒) kx,ky=1,1 nx,ny=4,5 m=29430 fp=1390609718.902140 s=0.000000“
对于二元样条曲线,我得到了一个类似的结果,其平滑参数s等是默认值。我的数据是平滑的。我在下面附上了我的代码,以防我做了明显的错误。
有什么想法吗? 谢谢! 凯尔
class Field(object):
Nr = 0
Ntheta = 0
grid = np.array([])
def __init__(self, Nr, Ntheta, f):
self.Nr = Nr
self.Ntheta = Ntheta
self.grid = np.empty([Nr, Ntheta])
for i in range(Nr):
for j in range(Ntheta):
self.grid[i,j] = f[i*Ntheta + j]
def calculate_lines(filename):
ri,ti,r,t,Br,Bt,Bphi,Bmag = np.loadtxt(filename, skiprows=3,\
usecols=(1,2,3,4,5,6,7,9), unpack=True)
Nr = int(max(ri)) + 1
Ntheta = int(max(ti)) + 1
### Initialise coordinate grids ###
X = np.empty([Nr, Ntheta])
Y = np.empty([Nr, Ntheta])
for i in range(Nr):
for j in range(Ntheta):
indx = i*Ntheta + j
X[i,j] = r[indx]*sin(t[indx])
Y[i,j] = r[indx]*cos(t[indx])
### Initialise field objects ###
Bradial = Field(Nr=Nr, Ntheta=Ntheta, f=Br)
### Interpolate the fields ###
intp_Br = interpolate.interp2d(X, Y, Bradial.grid, kind='linear')
#rbf_0 = interpolate.Rbf(X,Y, Bradial.grid, epsilon=2)
return
加上8月27日:凯尔在 scipy-user thread。
8月30日:@Kyle,看起来Cartesion X,Y和polar Xnew,Ynew有点混淆。 请参阅下面过长的注释中的“极坐标”。
关于二维插值的注记,二元样条与网格数据。
scipy.interpolate.*BivariateSpline
和matplotlib.mlab.griddata
两者都以1d数组作为参数:输入
X,Y,Z
描述3空间中的点的曲面或云:X,Y
(或纬度、经度或…)平面上的点, 以及上方的地表或地形。X,Y
可能会填满大部分矩形[Xmin。。x最大值]x[最小值。。Ymax], 或者可能只是一个蠕动的S或Y在里面。Z
表面可能是光滑的,或者是光滑的+一点噪音, 或者根本不平坦,崎岖的火山山脉。Xnew和Ynew通常也是1d,用来描述矩形网格 要插值或估计Z的新x新y新点的数量。
Znew=griddata(…)返回此网格上的二维数组,np.meshgrid(Xnew,Ynew):
Xnew,Ynew点远离任何输入X,Y的拼写问题。
griddata
检查:(“凸包”是一个假想的 橡皮筋在所有的X,Y点上伸展。)
griddata
首先构造Delaunay三角剖分 输入X,Y,然后 Natural neighbor 插值。这是稳健的,而且相当快。但是,双变量pline可以推断, 在没有警告的情况下产生剧烈的摆动。 此外,Fitpack中的所有*样条曲线例程 对平滑参数S非常敏感。 Dierckx的书(book s.google isbn 019853440X p.89)说:
如果S太小,则样条曲线近似值太大 噪音太大(过大);
如果S太大,样条曲线就太光滑了 信号会丢失(不合适)。
散乱数据的插值很难,平滑不容易,两者结合起来真的很难。 插值器应该如何处理XY中的大孔,还是处理非常嘈杂的Z? (“如果你想卖掉它,你必须描述它。”)
更多的笔记,精美的印刷品:
1d与2d:有些插值器采用X、Y、Z,要么是1d,要么是2d。 其他的只取1d,所以在插值之前展平:
在蒙版数组上:matplotlib可以很好地处理它们, 仅绘制未屏蔽/非NaN点。 但我不认为bozo numpy/scipy函数会起作用。 检查X,Y凸面外壳外的插值,如下所示:
在极坐标上: 十、 Y和Xnew,Ynew应该在同一空间, 两个卡特森,或者都在[rmin。。rmax]x[tmin。。tmax]。
要在3d中绘制(r、θ、z)点:
另请参见(尚未尝试此操作):
给谨慎的程序员两个建议:
检查异常值或有趣的缩放:
使用简单数据检查插值:
相关问题 更多 >
编程相关推荐