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

运行Python二级反应拟合代码报numpy.ndarray不可调用错误如何解决

问题修复方案

错误根源

你代码中f=sec_order_1(t,a0,k)这行是核心问题:sec_order_1是你定义的函数,加括号传入参数后就会直接执行,返回的是对应计算结果的numpy数组,而scipy.optimize.curve_fit要求第一个入参必须是未执行的函数对象,用来后续根据传入的参数迭代计算拟合值。你把数组当函数传入curve_fit,后续还尝试用f(xdata,*popt)调用数组,就触发了numpy.ndarray is not callable报错。
除此之外你的代码还有三个次要问题:

  1. import numpy as np的位置太靠后,前面调用np.array时numpy还未导入,会提前触发名称错误
  2. 你将拟合用的ydata做了data/a0的归一化,但原模型sec_order_1的输出是原始浓度,两者维度不匹配,拟合会报错
  3. 最终绘图用到的误差参数perr没有定义,需要从拟合得到的协方差矩阵计算得到

修正后完整可运行代码

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

# 原始二级反应动力学模型:输入时间t,初始浓度a0,速率常数k,返回t时刻浓度
def sec_order_1(t,a0,k): # 2a -> c
    return a0/(a0*k*t+1)

# 此处为你提前定义的原始实验数据,保留你原本的赋值即可
# time_seconds = [xxx, xxx, ...]
# concentrations_mM = [xxx, xxx, ...]

a0=10; k=1
t=np.array(time_seconds)
data=np.array(concentrations_mM)
calc_y=sec_order_1(t,a0,k)
plt.plot(t, data,'o', label='实验数据')
plt.plot(t, calc_y, label='初始模型, k: %g' %k)
plt.xlabel('时间 / 秒'); plt.ylabel('浓度 / mM')
plt.legend(); plt.show()

# 拟合部分直接传函数名作为拟合模型,不需要提前调用
p0=[10, 1] # 初始猜测值:对应a0和k的初始预估值
popt,pcov = curve_fit(sec_order_1, t, data, p0=p0)
perr = np.sqrt(np.diag(pcov)) # 计算拟合参数的标准误差
print("拟合得到的参数a0、k:", popt)
print("参数协方差矩阵:", pcov)

# 绘制拟合结果
fit_y = sec_order_1(t,*popt) 
plt.plot(t,data,'o', label='实验数据')
plt.plot(t, fit_y, label='最优拟合 k: %.3f ± %.3f / 秒' % (popt[1], perr[1]))
plt.xlabel('时间 / 秒'); plt.ylabel('浓度 / mM')
plt.legend()
plt.show()

内容的提问来源于stack exchange,提问作者Whatsthedill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:15:04