运行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报错。
除此之外你的代码还有三个次要问题:
import numpy as np的位置太靠后,前面调用np.array时numpy还未导入,会提前触发名称错误- 你将拟合用的
ydata做了data/a0的归一化,但原模型sec_order_1的输出是原始浓度,两者维度不匹配,拟合会报错 - 最终绘图用到的误差参数
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
相关产品推荐
相关产品推荐

