解析法/SciPy积分与近似积分结果不一致的原因排查
希尔方程变体积分计算的结果差异问题
我尝试计算一种希尔方程变体的积分,方程形式为:
$$
\text{Bottom} + \frac{\text{Top} - \text{Bottom}}{1 + \left( \frac{\text{IC50}}{10^X} \right)^{\text{Coef}}}
$$
使用SciPy integrate.quad计算的结果
代码如下(补充原代码缺失的numpy导入):
from scipy import integrate import numpy as np Top = 0.9015038230670139 Bottom = 0.5972679490151096 ic50 = 17561.998143066336 Coef = -1.245569789770613 def Hill_formula(X): # 简化10**np.log10(ic50)为ic50,两者数学等价 return Bottom + (Top - Bottom)/(1 + ((ic50)/10**X)**Coef) integrate.quad(Hill_formula, 0.001, 40.0)
运行后得到结果:(25.18116866489653, 1.3873362345430754e-08)。
该方程在0.001到40.0区间内的曲线为一条在y轴0.6到0.9之间平缓变化的曲线。
使用Simpson近似方法的错误结果
我用simpson函数计算曲线下面积时,代码如下:
from scipy.integrate import simpson import numpy as np points = np.linspace(0.001, 40.0, num=100) curve_results = [] for val in points: curve_results.append(Hill_formula(val)) np.abs(simpson(points, curve_results))
得到结果:1.2913519756923537。
但我推导该积分的解析解后,计算区间面积结果同样约为25,和quad的结果一致。
差异原因分析
问题核心是**simpson函数的参数顺序完全搞反**:
scipy.integrate.simpson的官方定义中,第一个参数是待积分的y值数组,第二个参数是对应的x值采样点数组。- 你把
points(x采样点)放在了第一个参数位置,curve_results(y值)放在第二个位置,导致计算逻辑完全错误,得到了偏离真实值的结果。
修正后的代码
调整参数顺序后,代码如下:
# 去掉多余的np.abs,曲线下面积本身为正 simpson(curve_results, points)
运行后得到的结果会接近25,和quad以及解析解的结果一致。
内容的提问来源于stack exchange,提问作者sharkbirth
相关产品推荐
相关产品推荐

