You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用scipy.optimize.curve_fit进行曲线拟合时出现参数数量无法确定的ValueError问题求助

使用scipy.optimize.curve_fit进行曲线拟合时出现参数数量无法确定的ValueError问题求助

嗨,这个问题其实很典型,根源就出在你定义的拟合函数上!

问题原因

scipy.optimize.curve_fit的逻辑是:你传入的拟合函数,第一个参数是自变量,后面的参数必须是需要通过拟合优化的未知参数。但你写的chi函数:

def chi(a):
    return 0.39*np.log(a)+1.22

里面没有任何待调整的拟合参数——0.39和1.22都是固定死的数值,程序根本不知道要优化什么,自然就抛出了ValueError: Unable to determine number of fit parameters这个错误。

解决方案

把你的拟合函数改成包含未知参数的形式,比如把固定的系数换成变量(比如用m代表斜率、b代表截距),这样curve_fit就能识别出需要拟合的参数了。

修正后的完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit  # 直接导入curve_fit,代码更清晰

Mcore, Nbs = np.genfromtxt("star.txt", unpack=True, skip_header=1)
Mcore2 = [0.001*item for item in Mcore]
sigma = np.sqrt(Nbs)

plt.errorbar(Mcore2, Nbs, sigma, fmt=".")
plt.yscale("log")
plt.xscale("log")

# 修正后的拟合函数:第一个参数是自变量x,后面是待拟合的参数m和b
def chi(x, m, b):
    return m * np.log(x) + b

# 调用curve_fit,传入函数、自变量、因变量,可选传入误差sigma
popt, pcov = curve_fit(chi, Mcore2, Nbs, sigma=sigma)

# popt里就是拟合得到的参数值,pcov是协方差矩阵(可用于计算参数误差)
print(f"拟合得到的参数:m = {popt[0]:.4f}, b = {popt[1]:.4f}")

# 用拟合参数画出拟合曲线,和原始数据对比
x_fit = np.logspace(np.log10(min(Mcore2)), np.log10(max(Mcore2)), 100)
y_fit = chi(x_fit, *popt)
plt.plot(x_fit, y_fit, 'r-', label='Fit Curve')
plt.legend()
plt.show()

额外小提示

  • 如果你的模型本来就是固定参数(不需要拟合),那完全没必要用curve_fit,直接计算函数值画图对比就行。
  • 注意你的自变量Mcore2必须是正数,因为用到了np.log,如果数据里有0或负数会触发新的报错,这点要提前检查哦。

备注:内容来源于stack exchange,提问作者Fcatalan

火山引擎 最新活动