Один из способов, который вы можете попробовать, состоит в том, чтобы разбить входные данные на куски, которые находятся рядом с вашим желаемым значением x (я переименовал ваши переменные, чтобы они были ближе к тому, что они есть на ваших графиках):
test_y = np.linspace(0,2*np.pi,100)
test_x = np.cos(test_y)
# Determine which parts are close to zero
close_to_zero = np.isclose(test_x, 0, atol=1e-1)
Теперь мы можем разбить ваш ввод на «непрерывные» порции, близкие к нулю:
chunks = []
prev_close = False
for x, y, close in zip(test_x, test_y, close_to_zero):
if not close:
if prev_close:
chunks.append(chunk)
if close:
if not prev_close:
chunk=[[y], [x]]
chunk[0].append(y)
chunk[1].append(x)
prev_close = close
chunks
Вывод:
[[[1.5231964381041423,
1.5231964381041423,
1.5866629563584815,
1.6501294746128208],
[0.04758191582374218,
0.04758191582374218,
-0.01586596383480803,
-0.07924995685678855]],
[[4.6330558325667655,
4.6330558325667655,
4.696522350821105,
4.759988869075444],
[-0.07924995685678878,
-0.07924995685678878,
-0.01586596383480761,
0.04758191582374238]]]
Теперь вы можете перебирать пары списков (y, x)
вchunks
и выполните линейную интерполяцию для этих пар, чтобы получить более точное значение.