You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:53:27