自定义连续变量CDF函数输出值翻倍问题求助
解决自定义CDF函数输出值翻倍的问题
你的问题出在积分拆分后的计算逻辑错误——对拆分后的两个积分段都错误套用了1 - 归一化积分的公式再相加,导致结果比预期值大了1,所以输出范围从正常的0-1变成了1-2。
错误原因分析
原本的正确逻辑是:你要计算的是1 - Φ(t)(其中Φ(t)是标准正态分布的CDF),而Φ(t)等于归一化后的(-∞到t)积分总和。当拆分积分后,应该先把两段积分加起来,再代入公式计算,而不是分别对每段积分做1 - 归一化后再相加。
举个简单的数值例子:假设(-∞到35)的归一化积分是A,(35到t)的归一化积分是B,正确结果是1 - (A+B),但你之前的代码计算的是(1-A)+(1-B) = 2 - (A+B),直接比正确值多了1,这就是输出偏移1的根源。
修正后的代码
import numpy as np from scipy.integrate import quad def cdf_t(d): t = ((np.exp(-(0.08*((d*1.2)-60))-1))-1.1)/0.5 def integrand(x): return np.exp((-x**2)/2) norm_factor = 1 / np.sqrt(2 * np.pi) if d < 10: total_integral = quad(integrand, -np.inf, t)[0] else: # 拆分积分避免quad处理超大区间的精度问题 integral_left = quad(integrand, -np.inf, 35)[0] integral_right = quad(integrand, 35, t)[0] total_integral = integral_left + integral_right return 1 - norm_factor * total_integral
额外说明
- 代码把归一化因子
1/√(2π)提取出来,避免重复计算,逻辑更清晰。 - 拆分积分的思路是对的,
quad处理极端大的区间时可能出现精度问题,拆分后能提升计算稳定性。
内容的提问来源于stack exchange,提问作者RadioRadical
相关产品推荐
相关产品推荐

