微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么可能导致 SciPy 中的二维插值不正确?

如何解决什么可能导致 SciPy 中的二维插值不正确?

我有一个直线(非规则)数据网格 (x,y,V),其中 V 是位置 (x,y) 处的值。我想使用这个数据源来插值我的结果,以便我可以在将来填补空白并绘制插值值(在范围内)。 (我还需要 griddata 的功能来检查范围内的任意值)。

我查看了 SciPyhere 处的文档。 这是我尝试过的结果:

It clearly doesn't match the data.

# INTERPOLATION ATTEMPT?
from scipy.interpolate import Rbf
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

edges = np.linspace(-0.05,0.05,100)
centers = edges[:-1] + np.diff(edges[:2])[0] / 2.
XI,YI = np.meshgrid(centers,centers)

# use RBF
rbf = Rbf(x,z,epsilon=2)
ZI = rbf(XI,YI)

# plot the result
plt.subplots(1,figsize=(12,8))
X_edges,Y_edges = np.meshgrid(edges,edges)
lims = dict(cmap='viridis')
plt.pcolormesh(X_edges,Y_edges,ZI,shading='flat',**lims)
plt.scatter(x,200,edgecolor='w',lw=0.1,**lims)

#decoration
plt.title('RBF interpolation?')
plt.xlim(-0.05,0.05)
plt.ylim(-0.05,0.05)
plt.colorbar()
plt.show()

作为参考,这是我的数据(提取),它有一个圆形图案,我需要插值来识别。

#DATA
experiment1raw = np.array([
[0,40,1,11.08,8.53,78.10,2.29],[24,-32,2,16.52,11.09,69.03,3.37],[8,4,14.27,10.68,71.86,3.19],[-8,6,10.86,9.74,76.69,2.72],[-24,8,6.72,12.74,77.08,3.45],[32,-24,9,18.49,13.67,64.32,3.52],[-32,17,[16,-16,20,13.41,21.33,59.92,5.34],[0,22,12.16,14.67,69.04,4.12],[-16,24,9.07,13.37,74.20,3.36],-8,27,19.35,17.88,57.86,4.91],35,[40,36,19.25,20.36,54.97,5.42],39,59.952,41,10.81,19.55,64.37,5.27],43,8.21,17.83,69.34,4.62],[-40,46,5.76,13.43,77.23,3.59],47,15.95,23.61,54.34,6.10],55,5.97,19.09,70.19,4.75],16,58,11.27,26.03,56.36,6.34],60,9.19,24.94,60.06,5.79],62,7.10,22.75,64.57,5.58],65,12.39,29.19,51.17,7.26],73,5.40,24.55,64.33,5.72],32,74,10.03,31.28,50.96,7.73],76,8.68,30.06,6.92],78,6.88,28.78,57.84,6.49],80,5.83,26.70,61.00,6.46],-40,81,7.03,31.55,54.40,7.01],])

#Atomic Percentages are set here
Cr1 = experiment1raw[:,3]
Mn1 = experiment1raw[:,4]
Fe1 = experiment1raw[:,5]
Co1 = experiment1raw[:,6]

#COORDINATE VALUES IN PRE-T
x_pret = experiment1raw[:,0]/1000
y_pret = experiment1raw[:,1]/1000

#important translation
x = -y_pret
y = -x_pret
z = Cr1

解决方法

您在 RBF 中使用了更大的 epsilon。最好的办法是将其设置为默认值,并让 scipy 计算一个合适的值。请参阅实现 here

所以设置默认epsilon

rbf = Rbf(x,y,z)

我对您的数据进行了很好的插值(主观意见)。 Interpolation RBF scipy

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。