Функция подгонки кривой, предложенная Zunzun, не работает

#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]
 

Но применяя это, я получаю только это:

подходит для python

У вас есть какие-нибудь догадки, почему это не работает? Буду рад любому вкладу в это, так что заранее спасибо!

Комментарии:

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. пожалуйста, не оставляйте комментарии в качестве ответов.