#python #curve-fitting #data-fitting
Вопрос:
Я пытаюсь подогнать набор данных. Чтобы найти подходящее уравнение, соответствующее набору данных, я применил поиск функций ZunZun. это доставило мне следующий матч:
Получив уравнение соответствия, я попытался подогнать его к своему набору данных следующим образом:
определение функции подгонки:
def fit_logfirst(x, A, B, C, D, E):
return A * (1.0 -(1.0 (x/B)**C)**(-1.0 * D)) E
popt, pcov = scipy.optimize.curve_fit(fit_logfirst,X12,Ynorm12)
A,B,C,D,E = popt
print((A, B, C, D, E))
plt.plot(X12, Ynorm12)
plt.title("pH value")
plt.xlabel('time')
plt.ylabel('pH-value')
y_log = fit_logfirst(X12,A,B,C,D,E)
plt.plot(X12,y_log,'--', color='red')
plt.show()
print(popt)
errors = [np.sqrt(pcov[i][i]) for i in range(0, len(pcov))]
print("a = {:.2f} - {:.2f}".format(popt[0],errors[0]))
print("b = {:.2f} - {:.2f}".format(popt[1],errors[1]))
print("c = {:.2f} - {:.2f}".format(popt[2],errors[2]))
print("d = {:.2f} - {:.2f}".format(popt[3],errors[3]))
residuals1 = Ynorm12 - fit_logfirst(X12, *popt)
ss_res1 = np.sum(residuals1**2)
ss_tot1=np.sum((Ynorm12-np.mean(Ynorm12))**2)
r_sqared1 = 1-(ss_res1/ss_tot1)
print(r_sqared1)
где находится мой набор данных
X12:
[3.80666249 3.87120101 3.93182563 4.00733319 4.06044301 4.11087386 4.17438727 4.21950771 4.26267988 4.31748811 4.35670883 4.39444915 4.44265126 4.47733681 4.51085951 4.54329478 4.58496748 4.61512052 4.6443909 4.68213123 4.7095302 4.73619845 4.77068462 4.79579055 4.82028157 4.85203026 4.87519732 4.8978398 4.91998093 4.94875989 4.9698133 4.99043259 5.01727984 5.0369526 5.05624581 5.08140436 5.09986643 5.11799381 5.13579844 5.1590553 5.17614973 5.19295685 5.21493576 5.23110862 5.24702407 5.26785816 5.28320373 5.29831737 5.31811999 5.33271879 5.34710753 5.36129217 5.37989735 5.39362755 5.40717177 5.42495002 5.43807931 5.45103845 5.46806014 5.48063892 5.49306144 5.50938834 5.52146092 5.53338949 5.54517744 5.56068163 5.57215403 5.58349631 5.59842196 5.6094718 5.62040087 5.6347896 5.6454469 5.65599181 5.66642669 5.68017261 5.69035945 5.700443575.71373281 5.7235851 5.73334128 5.74620319 5.75574221 5.7651911 5.77765232 5.78689738 5.79605775 5.80513497 5.81711116 5.82600011 5.83481074 5.84643878 5.85507192 5.86363118 5.87493073 5.88332239 5.89164421 5.90263333 5.91079664 5.91889385 5.92692603 5.93753621 5.94542061 5.95324333 5.96357934 5.97126184 5.97888576 5.98896142 5.99645209 6.00388707 6.01371516 6.02102335 6.02827852]
Ynorm12:
[1.98354223 1.98253419 1.97986644 1.97547433 1.96942583 1.96142593 1.9519082 1.9412507 1.92847927 1.91454564 1.89907719 1.88108696 1.86154084 1.84127724 1.81943684 1.80090491 1.77693861 1.751196 1.72269096 1.69519017 1.67833515 1.66304758 1.64963417 1.63806646 1.62877018 1.62133728 1.61608436 1.6131826 1.61243913 1.61328029 1.61592232 1.62066409 1.62731662 1.62461665 1.62042886 1.61769843 1.61481399 1.61690314 1.61575251 1.61496915 1.61333398 1.61104492 1.60999359 1.6084093 1.60671998 1.60596056 1.60485361 1.60397158 1.60321664 1.60185624 1.60069411 1.59919805 1.59785275 1.59623165 1.59509498 1.59398714 1.59292277 1.59153009 1.59029068 1.58883309 1.58702818 1.58525328 1.58351393 1.58181564 1.58016394 1.57940324 1.57786456 1.5763955 1.57622329 1.57620592 1.57597518 1.57619345 1.57646696 1.57635812 1.57625041 1.57581972 1.57548344 1.57558614 1.57573091 1.57553655 1.57533483 1.57513469 1.57494505 1.57443905 1.5743671 1.57393184 1.57313049 1.57271067 1.57193418 1.57154865 1.57068139 1.56938595 1.56887692 1.56789516 1.56730023 1.56671182 1.56613607 1.56557912 1.56424109 1.56291703 1.56241292 1.56146965 1.56094678 1.56046398 1.55969164 1.55857136 1.5574896 1.55605991 1.55521949 1.55496835 1.55445308 1.55414391 1.55404085]
Но применяя это, я получаю только это:
У вас есть какие-нибудь догадки, почему это не работает? Буду рад любому вкладу в это, так что заранее спасибо!
Комментарии:
1. Что же
print((A, B, C, D, E))
произвело?2. за это я получил [7.76114476 e-01 1.30631104 e-10 6.41652402 e-01 1.10213455 e 00 8.68032917 e-01]
3. Правильно ли вы это реализовали
fit_logfirst
? Вы это проверяли?4. странная функция…. как насчет
a * x b - c * ( x - x0 ) / sqrt( 1 d * ( x - x0 )**2 )
или что-то подобное? Илиa * x b - c * tanh( d * ( x - x0 )
5. Я попробую и дам вам знать, если это сработает! Спасибо за предложение!
Ответ №1:
@wwii да, я так думаю, со случайным параметром и значениями x от 0 до 10 я получаю эту кривую для fit_logfirst:
Комментарии:
1. пожалуйста, не оставляйте комментарии в качестве ответов.