[英]Python piecewise function interpolation
我正在嘗試構建一個函數,它給我一個分段線性函數的插值。 我嘗試了線性樣條插值(應該能夠做到這一點?) - 但沒有任何運氣。 該問題在對數比例圖中最為明顯。 下面是我准備的一個小例子的代碼:
%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()
我究竟做錯了什么?
樣條擬合必須對線性化數據執行,即使用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)');
注意:我從數據中刪除了零。 此外,如果你想要一個分段線性函數,樣條擬合可能不是最好的,你可以看看這個問題,例如: https ://datascience.stackexchange.com/q/8457/53362
對於使用 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/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.