使用scipy.curve_fit报错ValueError:无法确定拟合参数数量
曲线拟合报错:Unable to determine number of fit parameters
问题代码
import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt # define the function you want to fit def my_func(x): return x**3 + np.log10(x) + 2 print('f(1)=',my_func(1)) # load data from file x_data,y_data,=np.loadtxt('dati1.dat', unpack=True, usecols=(0,2)) x_data = np.array(x_data) y_data = np.array(y_data) print(x_data,y_data) # perform the curve fit popt,pcov=curve_fit(my_func,x_data,y_data) # plot the results plt.plot(x_data, y_data, 'o', label='data') plt.plot(x_data, my_func(x_data, *popt), '-', label='fit') plt.legend() plt.show()
错误信息
Traceback (most recent call last): File "grafico2.py", line 20, in <module> popt,pcov=curve_fit(my_func,x_data,y_data) File "/Users/myprofile/Library/Python/3.8/lib/python/site-packages/scipy/optimize/_minpack_py.py", line 779, in curve_fit raise ValueError("Unable to determine number of fit parameters.") ValueError: Unable to determine number of fit parameters.
错误原因
curve_fit要求拟合函数必须包含自变量和待优化的拟合参数两部分输入。你定义的my_func(x)只有自变量x,没有任何可调整的参数——当前函数是固定计算式x³ + log10(x) + 2,没有能通过拟合调整的系数,程序无法确定要优化什么参数,因此抛出错误。
拟合的核心是调整模型参数让计算结果贴近数据,你的当前模型没有可调整空间,不符合曲线拟合的基本要求。
修正代码
假设你想拟合的模型为a*x³ + b*log10(x) + c(a、b、c为待拟合参数),修改后的代码如下:
import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt # 定义带拟合参数的函数,x是自变量,a/b/c是待优化参数 def my_func(x, a, b, c): return a * x**3 + b * np.log10(x) + c print('f(1)=',my_func(1, 1, 1, 2)) # 测试固定参数下的计算结果 # 加载数据 x_data,y_data = np.loadtxt('dati1.dat', unpack=True, usecols=(0,2)) # 执行曲线拟合,popt会返回最优拟合参数[a, b, c] popt, pcov = curve_fit(my_func, x_data, y_data) print("拟合参数:", popt) # 绘图展示 plt.plot(x_data, y_data, 'o', label='原始数据') plt.plot(x_data, my_func(x_data, *popt), '-', label='拟合曲线') plt.legend() plt.show()
关键说明
- 拟合函数必须将自变量x放在第一个位置,后续参数为待优化的拟合系数
curve_fit返回的popt是一个数组,包含所有参数的最优拟合值,用*popt可以将数组元素作为参数传入函数- 可以根据实际需求调整模型形式(比如添加其他项或改变参数个数),只要保证函数包含自变量和待拟合参数即可
内容的提问来源于stack exchange,提问作者sofia betto
相关产品推荐
相关产品推荐

