插值1D非函数数据点

0 投票
1 回答
752 浏览
提问于 2025-04-18 06:20

我在为我的数据点寻找一种插值方法时遇到了困难。这个线条应该稍微像一个负的反向二次曲线(也就是像一个倒过来的‘c’)。

因为这不是一个函数(x可以对应多个y值),所以我不太确定该用什么插值方法。

我在想,也许我可以先把坐标轴翻转过来,用像UnivariateSpline这样的工具来创建插值点/线,然后在绘图时再把它翻回来?

这是我单独数据点的图:

我的x-y图的散点图

这是我的代码:

import datetime as dt
import matplotlib.pyplot as plt
from scipy import interpolate

file = open_file("010217.hdf5", mode = "a", title = 'Sondrestrom1')
all_data = file.getNode('/Data/Table Layout').read()
file.close()


time = all_data['ut1_unix'] #time in seconds since 1/1/1970
alt = all_data['gdalt'] #all altitude points
electronDens = all_data['nel'] #all electron density points
x = []
y = []
positions = []

for t in range(len(time)): #Looking at this specific time, find all the respective altitude and electron density points
    if time[t] == 982376726:
        x.append(electronDens[t])
        y.append(alt[t])
        positions.append(t)

#FINDING THE DATE        
datetime1970 = dt.datetime(1970,1,1,0,0,0)
seconds = long(time[t])
newDatetime = datetime1970 + dt.timedelta(0, seconds)        
time1 = newDatetime.strftime('%Y-%m-%d %H:%M:%S')
title = "Electron Density vs. Altitude at "
title += time1

plt.plot(x,y,"o")
plt.title(title)
plt.xlabel('Electron Density (log_10[Ne])')
plt.ylabel('Altitude (km)')
plt.show()

1 个回答

0

根据图表的标题“电子密度与高度”,我猜测在垂直轴上每个点只有一个值,对吧?

这意味着你实际上是在看一个被翻转的函数,为了让x轴变成竖着的,因为把高度放在垂直轴上对人类来说更直观。

从你的代码来看,似乎有一次测量同时记录了高度和电子密度。因此,即使我上面的理论不对,你仍然可以在时间范围内进行插值,并从中创建一个样条曲线。

... 当然,这前提是你真的想要一条经过每个点的曲线。考虑到数据的散布情况,你可能应该选择一种不完全复制每个测量值的曲线拟合方法:scipy.interpolate.Rbf 应该可以正常工作,再次强调,你需要交换坐标轴,也就是说,把电子密度作为高度的函数来计算。只要确保使用smooth=0.01或者稍微多一点(0.0会完全经过每个点,在噪声数据上看起来会有点傻)。

... 实际上,看起来你大部分的问题是更好地理解你的数据 :)

撰写回答