我有以下曲线:
我试图检索对应于一个x值(这里是0)的两个y值。你知道吗
我试过从scipy
开始interp1d
,但这只适用于单调递增或递减曲线。在本例中,它找到两个最接近的值,并在它们之间进行线性插值,结果只有一个值位于3.9左右。你知道吗
下面是重现示例的代码片段:
from scipy import interpolate
import numpy as np
testdata = np.linspace(0,2*np.pi,100)
testy = np.cos(testdata)
fig, ax = plt.subplots()
ax.plot(testy, testdata)
ax.axvline(0, c = 'r')
f = interpolate.interp1d(testy, testdata)
print(f(0))
检索这些值的好方法是什么?我也试图得到最接近的价值,但这是不够准确的,我计划使用它。你知道吗
谢谢你的帮助
编辑:
下面的解决方案是可行的,但是有更好的方法吗?你知道吗
testdata = np.linspace(0,2*np.pi,100)
testy = np.cos(testdata)
gradx = np.gradient(testy)
asign = np.sign(gradx)
signchange = ((np.roll(asign, 1) - asign) != 0).astype(int)
splitloc = [i for i, e in enumerate(signchange) if e != 0]
newdata = np.split(testy,splitloc)
newx = np.split(testdata,splitloc)
fig, ax = plt.subplots()
for i in range(len(splitloc)):
ax.plot(newdata[i+1], newx[i+1])
f = interpolate.interp1d(newdata[i+1], newx[i+1])
print(f(0))
由于你要插值的数据不是一个函数,我想用插值法来解决你的问题是很困难的。但是你可以看到如果你把连续的值乘以x,所有值的符号都是(+),除了在最近的点上x=0会有符号变化(-)。通过使用:
我得到
[1.5231964381041423, 4.696522350821105]
。您可以使用j
或j+1
覆盖testdata[j]
因为网格是一致的,两种近似都会有相同的错误量。希望有帮助。你知道吗您可以尝试的一种方法是将输入分解为接近所需x值的块(我重命名了变量,使其更接近绘图中的变量):
现在我们可以将您的输入分解为接近零的“连续”块:
输出:
现在可以迭代
(y, x)
中的chunks
列表对,并对这些对进行线性插值以获得更精确的值。你知道吗相关问题 更多 >
编程相关推荐