Я пытаюсь сопоставить некоторые данные с уравнением в Python, и у меня возникают некоторые трудности. У меня есть уравнение:
y(t)=yo+a(t-ti)^b+kt
где a
, ti
, b
и k
- параметры подгонки, а t
и disp
- переменные массива, представляющие время и смещение соответственно. Уравнение отлично впишется в gnuplot с некоторой итерацией, но его установка в python вызывает ошибку: -
ValueError: array must not contain infs or NaNs
Полная трассировка стека:
creep_test.py:246: RuntimeWarning: invalid value encountered in power
fitfunc = lambda p, t: disp_list[0]+(p[0]*(t-p[1])**p[2])+p[3]*t # Target function
Traceback (most recent call last):
File "creep_test.py", line 374, in <module>
main()
File "creep_test.py", line 368, in main
python_fit(filename)
File "creep_test.py", line 256, in python_fit
out = optimize.leastsq(errfunc, p0[:], args=(t, disp,err), full_output=1)
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 338, in leastsq
cov_x = inv(dot(transpose(R),R))
File "/usr/lib/python2.7/dist-packages/scipy/linalg/basic.py", line 285, in inv
a1 = asarray_chkfinite(a)
File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 590, in asarray_chkfinite
"array must not contain infs or NaNs")
ValueError: array must not contain infs or NaNs
Играя, я обнаружил, что это термин ti
, который вызывает проблемы в том, что фитинг работает, если у вас ti
исправлено около 35.5
. Я использовал электронную таблицу, и для любых значений t
под ti
уравнение выдает #VALUE
(вероятно, потому, что оно мнимое)
В принципе, есть ли способ заставить Python соответствовать кривой, такой как gnuplot (который, как я полагаю, игнорирует недействительные результаты)? Ниже приведен код, который я использовал для настройки моей программы:
fitfunc = lambda p, t: disp_list[0]+(p[0]*(t-p[1])**p[2])+p[3]*t # Target function
errfunc = lambda p, t, y, err: (fitfunc(p, t) - y)/(err) # Distance to the target function
err=0.01
p0 = [ 50, 35.5,0.005, 0.001] # Initial guess for the parameters
out = optimize.leastsq(errfunc, p0[:], args=(t, disp,err), full_output=1)
print out[0]
print out[1]
Спасибо!!
t
иdisp
? - person ford   schedule 14.01.2013