Im編程中的新手,尤其是曲線擬合。但是我試圖將一個模型曲線擬合成我用Python和Numpy做的一些測量。Scipy Curve_fit函數使用初始猜測值而不是實際擬合
我成功地將「擬合」曲線繪製成一組數據。好吧,看起來好像是這樣。事實證明,該函數只是使用最初的猜測,並沒有嘗試實際擬合曲線。我通過對不同的數據集使用相同的初始猜測來測試它。這是結果:
和fitParams
輸出是fitCovariances
(這似乎是很奇怪的值):
[ 540. 2.5 2. ]
[[ inf inf inf]
[ inf inf inf]
[ inf inf inf]]
的def fitFunc()
輸出只是初步猜測反覆值。
我第一次嘗試我的腳本的第五個數據集,這似乎有些什麼好。但是你可以看到每個「擬合曲線」都完全相同,只是使用了初始猜測。
這是腳本:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import scipy
import math
import csv
import matplotlib as mpl
mpl.rcParams['text.usetex']=True
mpl.rcParams['text.latex.unicode']=True
#model
def fitFunc(P_max, x, x_0, w_z):
print P_max
print x_0
print w_z
return 0.5 * P_max * (1 - scipy.special.erf((scipy.sqrt(2) * (x - x_0))/w_z))
fig = plt.figure()
#for-loop to read and curve fit for all data sets
for n in range (1,7):
x_model = np.linspace(-1,6,5000)
y_model = []
x = []
P = []
name = 'data_' + str(n)
with open(name + '.csv', 'rb') as f:
data = csv.reader(f, delimiter = ';')
for row in data:
x.append(float(row[1]))
P.append(float(row[2]))
fitParams, fitCovariances = curve_fit(fitFunc, np.array(x), np.array(P), [540, 2.5, 2])
print fitParams
print fitCovariances
for i in range(0, len(x_model)):
y_model.append(fitFunc(fitParams[0], x_model[i], fitParams[1], fitParams[2]))
ax = fig.add_subplot(2,3,n, axisbg='white')
ax.scatter(x,P)
ax.plot(x_model,y_model)
ax.set_xlim([0, 6])
ax.set_ylim([0, 600])
ax.set_xlabel(r'\Delta x')
ax.set_ylabel(r'P (\mu W)')
plt.tight_layout()
plt.show()
我真的不能找到什麼即時通訊做錯了。我希望你們能幫助我。謝謝:)
注意:您可以下載數據文件here來嘗試使用相同數據的腳本。
顯示由腳本輸出的輸出。特別是,你會得到什麼'fitCovariances'? –
我已將它添加到問題中。我覺得'fitCovariances'都是無限的,這似乎很奇怪。 – SjonTeflon
你確定'fitFunc'中的這個變量順序是可以的嗎? 'help(curve_fit)'告訴我'模型函數f(x,...)。它必須將獨立變量作爲第一個參數,並將參數作爲獨立的剩餘參數。 –