簡體   English   中英

Python分段函數插值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM