Подгонка данных к уравнению в Python против gnuplot

Я пытаюсь сопоставить некоторые данные с уравнением в 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]

Спасибо!!


person Phil    schedule 14.01.2013    source источник
comment
Вы можете показать нам, как выглядят ваши t и disp?   -  person ford    schedule 14.01.2013
comment
Ах, извините, disp_list [0] - это значение yo (первое значение из списка, прочитанного из моих данных (представляет смещение)), а t - время в секундах (независимое значение)   -  person Phil    schedule 14.01.2013
comment
oh и t - это форма переменной массива (снова просто список значений времени)   -  person Phil    schedule 14.01.2013
comment
Также disp - это массив зависимых переменных (измеренное смещение)   -  person Phil    schedule 14.01.2013
comment
Пожалуйста, покажите полную трассировку стека, когда получите сообщение об ошибке.   -  person    schedule 14.01.2013
comment
Плохие стартовые параметры могут привести к таким ошибкам с optimize.leastsq (). Можете ли вы попробовать с параметрами, близкими к необязательным значениям наилучшего соответствия, просто для проверки?   -  person reptilicus    schedule 14.01.2013
comment
Кроме того, mpfit или kmpfit (astro.rug.nl/software/kapteyn/kmpfit. html) намного надежнее, чем optimize.leastsq ()   -  person reptilicus    schedule 14.01.2013
comment
Ах отлично! большое спасибо. Я посмотрю на это. Спасибо за вашу помощь! Сон сегодня снова на картах !!!   -  person Phil    schedule 14.01.2013


Ответы (1)


Ценный урок усвоен. Начальные параметры, которые я использовал, чтобы попытаться сломать более простое уравнение, которое я подбирал до этого, нарушали более сложное уравнение, которое я подбирал сейчас. Всегда проверяйте начальные параметры, если примерка утверждает, что решения не имеют смысла. Изучение python трудным способом, так что вам не нужно ...

person Phil    schedule 14.01.2013