scipy Python分段函数插值

46qrfjad  于 2022-11-10  发布在  Python
关注(0)|答案(2)|浏览(207)

我试图构造一个函数,它给出了分段线性函数的插值。我尝试了线性样条插值(它应该能够做到这一点?)-但没有任何运气。这个问题在对数比例图上最明显。下面是我准备的一个小例子的代码:

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import os
from scipy import interpolate

# Original Data

pwl_data = np.array([[0,1e3, 1e5, 1e8], [-90,-90, -90, -130]])

# spine interpolation

pwl_spline = interpolate.splrep(pwl_data[0], pwl_data[1])

spline_x = np.linspace (0,1e8, 10000)

legend = []

plt.plot(pwl_data[0],pwl_data[1])
plt.plot(spline_x,interpolate.splev(spline_x,pwl_spline ),'*')
legend.append("Data")
legend.append("Interpolated Data")

plt.xscale('log')
plt.legend(legend) 
plt.grid(True)
plt.grid(b=True, which='minor', linestyle='--')
plt.show()

我做错了什么?

ih99xse1

ih99xse11#

必须对线性化数据进行样条拟合,即,使用log(x)代替x

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

# Original Data

pwl_data = np.array([[1, 1e3, 1e5, 1e8], [-90, -90, -90, -130]])

x = pwl_data[0]
y = pwl_data[1]

log_x = np.log(x)

# spine interpolation

pwl_spline = interpolate.splrep(log_x, y)

spline_log_x = np.linspace(0, 18, 30)
spline_y = interpolate.splev(spline_log_x, pwl_spline )

plt.plot(log_x, y, '-o')
plt.plot(spline_log_x, spline_y, '-*')
plt.xlabel('log(x)');

注意:我把零从数据中去掉了。2另外,如果你想要一个分段线性函数,样条拟合可能不是最好的,你可以看看这个问题,例如:https://datascience.stackexchange.com/q/8457/53362

am46iovg

am46iovg2#

对于使用matplotlib绘图,考虑matplotlibs step,它在内部执行分段常数插值。
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.step.html
您可以通过以下方式调用它:
plt.step(x,y),给定输入x和y。
在散点图中,参数line_shape='hv'获得了类似的结果,请参见https://plotly.com/python/line-charts/

相关问题