擬合曲線不符合預期的資料點 (xH_data, nH_data)。有人知道這里可能是什么問題嗎?
from scipy.optimize import curve_fit
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
xH_data = np.array([1., 1.03, 1.06, 1.1, 1.2, 1.3, 1.5, 1.7, 2., 2.6, 3., 4., 5., 6.])
nH_data = np.array([403., 316., 235., 160., 70.8, 37.6, 14.8, 7.11, 2.81, 0.665, 0.313, 0.090, 0.044, 0.029])*1.0e6
plt.plot(xH_data, nH_data)
plt.yscale("log")
plt.xscale("log")
def eTemp(x, A, a, B):
n = B*(A x)**a
return n
parameters, covariance = curve_fit(eTemp, xH_data, nH_data, maxfev=200000)
fit_A = parameters[0]
fit_a = parameters[1]
fit_B = parameters[2]
print(fit_A)
print(fit_a)
print(fit_B)
r = np.logspace(0, 0.7, 1000)
ne = fit_B *(fit_A r)**(fit_a)
plt.plot(r, ne)
plt.yscale("log")
plt.xscale("log")
在此先感謝您的幫助。
uj5u.com熱心網友回復:
好的,這是一種不同的方法。像往常一樣,主要問題是非線性擬合的初始猜測(有關詳細資訊,請查看
uj5u.com熱心網友回復:
我知道兩件事可能對你有幫助
- 為函式提供一組適當的起始引數的
p0輸入引數。curve_fit這可以防止演算法失控。 - 更改您要擬合的函式,使其回傳
np.log(n),然后擬合到np.log(nH_data). 就像現在一樣,不擬合第一個資料點比不擬合最后一個資料點的懲罰要大得多,因為第一個資料點的值大約大 10^2。因此,第一個資料點變得“更重要”以適應演算法。取對數會使它們更多地處于相同的范圍內,因此點的權重相同。
繼續玩吧。我很好地適應了這些引數
[-7.21450545e-01 -3.36131028e 00 5.97293632e 06]
uj5u.com熱心網友回復:
我想你就快到了,只需要適應對數規模并做出一個體面的猜測。要進行猜測,您只需要輸入一個類似的情節
plt.figure()
plt.plot(np.log(xH_data), np.log(nH_data))
你會看到它幾乎是線性的。因此,您的 B 將是指數截距(即 exp(20ish)),而 a 是近似斜率(-5ish)。A 很奇怪,它有什么物理意義還是你只是把它扔在那里?如果沒有物理意義,我會說擺脫它。
from scipy.optimize import curve_fit
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
xH_data = np.array([1., 1.03, 1.06, 1.1, 1.2, 1.3, 1.5, 1.7, 2., 2.6, 3., 4., 5., 6.])
nH_data = np.array([403., 316., 235., 160., 70.8, 37.6, 14.8, 7.11, 2.81, 0.665, 0.313, 0.090, 0.044, 0.029])*1.0e6
def eTemp(x, A, a, B):
logn = np.log(B*(x A)**a)
return logn
parameters, covariance = curve_fit(eTemp, xH_data, np.log(nH_data), p0=[np.exp(0.1), -5, np.exp(20)], maxfev=200000)
fit_A = parameters[0]
fit_a = parameters[1]
fit_B = parameters[2]
print(fit_A)
print(fit_a)
print(fit_B)
r = np.logspace(0, 0.7, 1000)
ne = np.exp(eTemp(r, fit_A, fit_a, fit_B))
plt.plot(xH_data, nH_data)
plt.plot(r, ne)
plt.yscale("log")
plt.xscale("log")
uj5u.com熱心網友回復:
你的擬合方程有問題。如果 A 小于 -1 并且您的 a 引數為負數,那么您將在擬合范圍內獲得函式的虛值。出于這個原因,您需要向您的 curve_fit 函式添加約束和一組初始引數,例如:
parameters, covariance = curve_fit(eTemp, xH_data, nH_data, method='dogbox', p0 = [100, -3.3, 10E8], bounds=((-0.9, -10, 0), (200, -1, 10e9)), maxfev=200000)
您需要將方法更改為 'dogbox' 以執行與約束的匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/441545.html
