nhập numpy dưới dạng np
nhập matplotlib.pyplot dưới dạng plt
từ scipy.optizes nhập Curve_fit
xdata = np.array([177,180,183,187,189,190,196,197,201,202,203,204,206,218,225,231,234,
252,262,266,267,268,277,286,303])
ydata = np.array([0.81,0.74,0.78,0.75,0.77,0.81,0.73,0.76,0.71,0.74,0.81,0.71,0.74,0.71,
0,72,0,69,0,75,0,59,0,61,0,63,0,64,0,63,0,35,0,27,0,26])
định nghĩa f(x, n1, n2, n3, n4, n5):
nếu (n1 > 0,2 và n1 < 0,8 và
n2 > -0,3 và n2 < 0):
return n1 + (n2 * x + n3) * 1./ (1 + np.exp(n4 * (n5 - x)))
trở lại 1e38
hệ số, pcov = Curve_fit(f, xdata, ydata, p0 = (0,29, -0,005, 1,0766, -0,36397, 104))
âm mưu = f(xdata, coeffs[0], coeffs[1], coeffs[2], coeffs[3], coeffs[4])
cho i trong phạm vi (1, len(coeffs) + 1):
in ('n%s = %s' % (i, coeffs[i - 1]))
Không hoạt động đúng với cảnh báo này:
OptimizeWarning: Không thể ước tính hiệp phương sai của các tham số
Category=OptimizeWarning)
Nhưng vâng
làm việc bình thường
xdata = np.array([73.0, 80.0, 88.0, 93.8, 96.3, 98.5, 100.0, 101.0, 102.3, 104.0, 105.3,
107,0, 109,5, 111,5, 114,0, 117,0, 119,5, 121,0, 124,0])
ydata = np.array([0,725, 0,7, 0,66, 0,63, 0,615, 0,61, 0,59, 0,56, 0,53, 0,49, 0,45,
0,41, 0,35, 0,32, 0,3, 0,29, 0,29, 0,29, 0,29])
Lmfit cũng không có tác dụng.
Vì bạn cũng đã sử dụng lmfit
Là một nhãn, đây là một nhãn sử dụng lmfit Giải pháp Các giá trị tham số bạn nhận được trông như thế này:
n1: 0,26564921 +/- 0,024765 (9,32%) (init= 0,2)
n2: -0,00195398 +/- 0,000311 (15,93%) (init=-0,005)
n3: 0,87261892 +/- 0,068601 (7,86%) (init= 1,0766)
n4: -1.43507072 +/- 1.223086 (85,23%) (init=-0,36379)
n5: 277,684530 +/- 3,768676 (1,36%) (init= 274)
Kết quả là đầu ra sau:
Như bạn có thể thấy, sự phù hợp sẽ tái tạo dữ liệu tốt và các tham số nằm trong phạm vi bắt buộc; chúng không cần thiết trong hàm của bạn; nếu như
tuyên bố.
Đây là mã hoàn chỉnh để tái hiện lại cốt truyện, cùng với một số nhận xét bổ sung:
từ thu nhỏ nhập lmfit, Thông số, Thông số, report_fit
nhập numpy dưới dạng np
xdata = np.array([177.,180.,183.,187.,189.,190.,196.,197.,201.,202.,203.,204.,206.,218.,225 .,231.,234.,
252.,262.,266.,267.,268.,277.,286.,303.])
ydata = np.array([0.81,0.74,0.78,0.75,0.77,0.81,0.73,0.76,0.71,0.74,0.81,0.71,0.74,0.71,
0,72,0,69,0,75,0,59,0,61,0,63,0,64,0,63,0,35,0,27,0,26])
def fit_fc(params, x, data):
n1 = params['n1'].value
n2 = params['n2'].value
n3 = params['n3'].value
n4 = params['n4'].value
n5 = params['n5'].value
mô hình = n1 + (n2 * x + n3) * 1./ (1. + np.exp(n4 * (n5 - x)))
mô hình trả về - dữ liệu #đó là những gì bạn muốn giảm thiểu
# tạo một bộ tham số
# 'giá trị' là điều kiện ban đầu
# 'min' và 'max' xác định ranh giới của bạn
params = Tham số()
params.add('n1', value= 0,2, min=0,2, max=0,8)
params.add('n2', value= -0,005, min=-0,3, max=10**(-10))
params.add('n3', value= 1.0766, min=-1000., max=1000.)
params.add('n4', value= -0.36379, min=-1000., max=1000.)
params.add('n5', value= 274.0, min=0., max=1000.)
# phù hợp, ở đây với mô hình lesssq
kết quả = thu nhỏ(fit_fc, params, args=(xdata, ydata))
#viết báo cáo lỗi
report_fit(params)
xplot = np.linspace(min(xdata), max(xdata), 1000)
yplot = result.values['n1'] + (result.values['n2'] * xplot + result.values['n3']) * \
1./ (1. + np.exp(result.values['n4'] * (result.values['n5'] - xplot)))
#kết quả lô đất
thử:
nhập khẩu pylab
pylab.plot(xdata, ydata, 'k+')
pylab.plot(xplot, yplot, 'r')
pylab.show()
ngoại trừ:
vượt qua
biên tập:
Hóa ra tính năng này chỉ hoạt động ở phiên bản 0.8.3. Nếu bạn sử dụng phiên bản 0.9.x, bạn cần điều chỉnh mã của mình cho phù hợp;đâyNhững thay đổi nào đã được thực hiện từ 0.8.3 đến 0.9.x.
Tôi là một lập trình viên xuất sắc, rất giỏi!