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

解析法/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:30:34