我有創建的功能x0:
x0 = []
for i in range(0,N):
if i == 0:
a = 0.4
else:
a = round(0.4 0.3*2**(i-1), 1)
print(i, a)
x0.append(a)
這給了我增長序列的資料:[0.4, 0.7, 1.0, 1.6, 2.8, 5.2, 10.0, 19.6, 38.8, 77.2, ...]我想找到一個適合這些點的函式。我不想使用多項式,因為它N可以不同但需要找到單引數函式。投影需要非常籠統。
我的方法是使用代碼:
def fun(x, a, b):
return np.cos(x**(2/3) * a b)
# Make fit #
y0 = [0]*len(x0)
p, c = curve_fit(f=fun, xdata=np.array(x0), ydata=y0)
x = np.linspace(0, max(x0), 10000)
plt.plot(x, fun(x, *p))
plt.scatter(x0, y0)
該功能的進展似乎對于起點來說太寬了,并且非常適合最后一個。我還嘗試通過將此函式乘以 來降低初始振蕩x,但一開始周期仍然太寬。是否有可能找到好的振蕩函式來通過(幾乎)所有這些點?我不知道如何在 下設定引數,x**(...)因為在那里放置一個變數會導致擬合估計它接近 1,這不是我需要的。我可以這樣設定電源sin(x**b)嗎?如果不是,我應該嘗試哪些功能系列?
在函式乘以 的圖下方b*x。第一個點的振蕩應該更密集。

uj5u.com熱心網友回復:
多虧了建議,我找到了最合適的,我認為它再好不過了。
解決方案是:
def fun(x, a, b, c):
return np.cos(np.pi*(np.log2((x-a)/b) c))
和 fit 方法看起來像
p, c = curve_fit(f=fun, xdata=np.array(x0), ydata=y0, bounds=([0, -np.inf, -np.inf], [x0[0], np.inf, np.inf]))
設定初始邊界很重要,a以避免收斂失敗或“殘差在初始點不是有限的”問題。最后每個點都有自己的交叉點,盡管在域中接近 0 的行為很瘋狂。引數非常接近 0 或 1 - 不趨于無窮大。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441746.html
上一篇:為什么decimal.Decimal(0)**decimal.Decimal(0)不回傳1
下一篇:水平計算
