我是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 = 数据[:, 1] 14 plt.plot(data_k2_2fl_NL3[:,8], data_k2_2fl_NL3[:,5], 'b-', label='data') ---> 15 popt, 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
函数无法通过内省(introspection)确定参数的数量,因为您要求它拟合的函数(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
如果出于性能原因需要向量化
,您还可以传递参数p0
初始参数数组。例如:
popt, pcov = curve_fit(func, x_data, y_data, p0=[1,1,1])
关于python - 值错误 : Unable to determine number of fit parameters. "Problem in curve fitting",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58796489/