如何用三次样条或pchip插值semilogx图

时间:2019-01-15 05:21:02

标签: python numpy scipy interpolation

所以我已经坚持了一段时间。我想知道如何使用pchip或三次样条等不同方法在Semilogx图上进行插值。到目前为止,这是我拥有的代码。

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 :(得分:1)

  

我应该在插值之前转换数据吗?

是的,当然!您必须确保样本对数间隔。对数轴上线性间隔的样本在图的右侧一起挤压,并在​​左侧拉开。

此外,我认为log-x-plot使三次插值在对数空间中看起来呈线性,这实际上是您要观察的效果。

如果在插值之前对x值进行对数转换

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