【问题标题】:Fitting data to an equation in python vs gnuplot将数据拟合到 python vs gnuplot 中的方程
【发布时间】:2013-01-14 16:25:46
【问题描述】:

我正在尝试将一些数据拟合到 python 中的方程中,但我遇到了一些困难。我有方程式:

y(t)=yo+a(t-ti)^b+kt

其中atibk是拟合参数,tdisp分别是代表时间和位移的数组变量。该等式通过一些迭代可以很好地适合 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 附近,则该配件可以正常工作。我使用了一个电子表格,对于ti 下的任何t 值,等式会抛出一个#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]

谢谢!!

【问题讨论】:

  • 您能告诉我们您的tdisp 长什么样吗?
  • 啊抱歉 disp_list[0] 是 yo 值(从我的数据中读取的列表中的第一个值(表示位移)),t 是以秒为单位的时间(独立变量)
  • oh and t 是一个数组变量形式(同样只是一个时间值列表)
  • disp 也是因变量数组(测量位移)
  • 另外,mpfit 或 kmpfit (astro.rug.nl/software/kapteyn/kmpfit.html) 比 optimize.leastsq() 更健壮

标签: python gnuplot data-fitting


【解决方案1】:

宝贵的经验教训。我用来尝试打破我之前拟合的更简单方程的起始参数正在打破我现在拟合的更复杂的方程。如果配件声称解决方案没有意义,请务必检查您的起始参数。学习python的艰难方式,所以你不必......

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多