Как интерполировать график полулогка кубическим сплайном или pchip - PullRequest
0 голосов
/ 15 января 2019

Так что я застрял на этом некоторое время. Мне интересно, как интерполировать на графике полулогка, используя различные методы, такие как pchip или кубический сплайн. Пока это код, который у меня есть.

from scipy.interpolate import PchipInterpolator
import numpy as np
import matplotlib.pyplot as plt

data = [[0.425, 100],
        [0.18, 96],
        [0.090, 85],
        [0.075, 80],
        [0.04, 59],
        [0.02, 39],
        [0.01, 26],
        [0.005, 15],
        [0.0015, 8]]
data = np.array(data)

x = data[:, 0]
y = data[:, 1]

x = np.flip(x)
y = np.flip(y)

interp_obj = PchipInterpolator(x, y)

new_x_vals = np.arange(0.0015, 0.42501, 0.0001)
new_y_vals = interp_obj(new_x_vals)

plt.semilogx(new_x_vals, new_y_vals)
plt.xlabel("Particle Diameter (mm) - Log Scale")
plt.ylabel("Percent Finer")

plt.show()

resulting plot

Кажется, что это не так гладко, как должно быть. Должен ли я преобразовывать данные перед интерполяцией?

1 Ответ

0 голосов
/ 15 января 2019

Должен ли я преобразовывать данные перед интерполяцией?

Да, конечно! Вы должны убедиться, что образцы логарифмически разнесены. Линейно расположенные образцы на логарифмической оси сжимают вместе на правой стороне графика вместе и разводят на левой стороне.

Более того, я думаю, что log-x-plot заставляет кубическую интерполяцию выглядеть линейно в лог-пространстве, что является эффектом, который вы фактически наблюдаете.

Если вы преобразуете значения х перед интерполяцией

interp_obj = PchipInterpolator(np.log10(x), y)

new_x_vals = np.arange(0.0015, 0.42501, 0.0001)
new_y_vals = interp_obj(np.log10(new_x_vals))

вы получите этот результат:

enter image description here

...