Полулогическая интерполяция;получить х от тебя - PullRequest
1 голос
/ 21 июня 2019

У меня есть следующие данные:

x = [0, 2, 4, 8, 30]
y = [1.2e-3, 3.5e-4, 5.1e-5, 1.6e-5, 2e-7]

Я пытаюсь интерполировать, чтобы получить y из заданного значения x.

При построении графика данные выглядят так:

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1)
ax.semilogy(x, y, 'o-')
plt.show()

plot

Итак, скажем, мне интересно узнать, какое значение x для значения y 3e-5.

Я могу получить значение x данного y:

z = np.linspace(0, 30, 10000)
logy = np.log10(y)
yy = np.power(10.0, np.interp(z, x, logy))
z[np.isclose(3.5e-5, yy, atol=1e-8)]

Из:

array([5.29852985])

Но я должен отрегулировать atol, если я изменю значение, чтобы получить одно совпадение, а также должен создать загрузку большего количества точек данных, чтобы получить разрешение.

Есть ли более простой способ сделать это? Спасибо.

1 Ответ

0 голосов
/ 21 июня 2019

Допустим, вы хотите найти x_f, соответствующий y_f. Если предположить, что записи в исходном списке y находятся в строго убывающем порядке, а записи в x увеличиваются, вы найдете первую запись в y, которая меньше или равна вашему y_0. Скажем, это индекс с индексом i, так что кортежи x, y, составляющие вашу соответствующую линейную функцию из вашего кусочного разбиения, будут (x [i-1], y [i-1]) и (x [ я], у [я]). Используя формулу для линии с учетом двух точек на линии, мы можем получить x_f:

x_f = x[i-1] + (x[i]-x[i-1])/(y[i]-y[i-1])*(y_f-y[i-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...