我是python的新手,所以我的知识不足。我有一个名为“ tlove_cc_seq2_k2_NL3.dat”的数据文件。我想对数据拟合曲线。我使用的代码如下:
...
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import math
import pandas as pd
import lmfit
from lmfit import Model
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from array import *
def test(x, a, b, c):
return (a + b*math.log(x) + c*math.log(x)**2)
func = np.vectorize(test)
data_k2_2fl_NL3=np.loadtxt('tlove_cc_seq2_k2_NL3.dat')
plt.plot(data_k2_2fl_NL3[:,8], data_k2_2fl_NL3[:,5], 'b-', label='data')
popt, pcov = curve_fit(func, data_k2_2fl_NL3[:,8], data_k2_2fl_NL3[:,5])
popt
plt.plot(data_k2_2fl_NL3[:,8], func(data_k2_2fl_NL3[:,8], *popt), 'r-',
label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
popt, pcov = curve_fit(func, data_k2_2fl_NL3[:,8], data_k2_2fl_NL3[:,5], bounds=(-20,
[30., 30., 20.5]))
popt
plt.plot(data_k2_2fl_NL3[:,8], func(data_k2_2fl_NL3[:,8], *popt), 'g--',
label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
...
我收到的错误如下:
... ValueError Traceback(最近一次通话最后一次)在13 #y = data [:, 1] 14 plt.plot(data_k2_2fl_NL3 [:,8],data_k2_2fl_NL3 [:,5],'b-',label ='data ')---> 15步,pcov = curve_fit(func,data_k2_2fl_NL3 [:,8],data_k2_2fl_NL3 [:,5])16步17
~/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py in curve_fit(f, xdata,
ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
678 args, varargs, varkw, defaults = _getargspec(f)
679 if len(args) < 2:
--> 680 raise ValueError("Unable to determine number of fit parameters.")
681 n = len(args) - 1
682 else:
ValueError: Unable to determine number of fit parameters.
我该如何解决?谢谢。
我认为问题在于该curve_fit
函数无法通过自省来确定参数的数量,因为您要它适合test
的np.vectorize
函数()被包装在该函数中。
我尝试了一个最小的示例,在该示例中我使用了test
未向量化的函数,并且可以正常工作:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def test(x, a, b, c):
return (a + b*np.log(x) + c*np.log(x)**2)
func = np.vectorize(test)
#Create some dummy data
x_data = list(range(1, 11))
y_data = np.log(x_data) + np.log(x_data)**2 + np.random.random(10)
plt.plot(x_data, y_data, 'b-', label='data')
popt, pcov = curve_fit(test, x_data, y_data)
popt
如果vectorize
出于性能原因需要,也可以传递一个参数p0
作为初始参数的数组。例如:
popt, pcov = curve_fit(func, x_data, y_data, p0=[1,1,1])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句