Python计算Hill函数及Hill系数时触发不支持操作数类型错误
报错原因
- 变量名和函数名冲突:代码开头先定义了数值型参数
c = randint(1,u),后续又定义了名为c(x)的复合函数,后者会覆盖前者的数值定义。 - 执行
g(x)内的x-c运算时,c已经是函数对象而非初始的整数参数,numpy浮点数组无法和函数做减法运算,直接触发TypeError。 - 该命名冲突还会连锁影响所有用到参数c的后续计算,包括
c(x)内部运算、EC2/EC3反函数推导,就算跳过当前报错,后续计算结果也完全错误。
修复方案
- 重命名复合函数,避开参数名c:将原复合函数
c(x)改名为fg(x),同步修改所有调用该函数的位置,包括最大值计算、EC值计算、绘图代码。 - 注意逻辑适配:当前定义的
f(x)=a*x是无界线性函数,不存在饱和平台,在0-10采样区间内的最大值永远取在区间右端点,计算出的Hill系数仅对当前采样区间有效,如果要做标准Hill函数分析,需要给f(x)补充饱和上限定义。
修复后的核心代码段
# 函数定义部分,复合函数重命名为fg避免冲突 def f(x): return a*x def g(x): return m*(x-c)/(d+x-c) def fg(x): return a*m*(x-c)/(d+x-c) # 计算各函数在采样区间的最大值 x = np.linspace(0, 10, 100) xmax1 = x[np.argmax(f(x))] ymax1 = f(x).max() xmax2 = x[np.argmax(g(x))] ymax2 = g(x).max() xmax3 = x[np.argmax(fg(x))] ymax3 = fg(x).max() # EC10、EC90计算部分逻辑不变,注意EC3调用时参数c已恢复为数值变量 def EC1(x): return x/a y90_1 = ymax1*0.9 y10_1 = ymax1*0.1 EC90_1 = EC1(y90_1) EC10_1 = EC1(y10_1) def EC2(x): return ((x*c)-(m*c)-(x*d))/(x-m) y90_2 = ymax2*0.9 y10_2 = ymax2*0.1 EC90_2 = EC2(y90_2) EC10_2 = EC2(y10_2) def EC3(x): return ((x*c)-(a*m*c)-(x*d))/(x-(a*m)) y90_3 = ymax3*0.9 y10_3 = ymax3*0.1 EC90_3 = EC3(y90_3) EC10_3 = EC3(y10_3) # Hill系数计算逻辑不变 H_1 = ln(81)/(ln(EC90_1/EC10_1)) H_2 = ln(81)/(ln(EC90_2/EC10_2)) H_3 = ln(81)/(ln(EC90_3/EC10_3)) # 绘图部分同步修改复合函数调用 plt.plot(x, f(x), color = 'red', label='f(x)') plt.plot(x, g(x), color = 'blue', label='g(x)') plt.plot(x, fg(x), color = 'green', label='f(g(x))') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Alpha_Lupi
相关产品推荐
相关产品推荐

