R语言调用uniroot函数运行采样代码报端点符号错误问题咨询
报错原因
- 你混淆了概率密度函数(PDF)和累积分布函数(CDF):你代码中定义的
FX是题目给出的PDF,而逆变换采样要求使用CDF的逆函数,这是核心错误。 - 你当前使用的PDF在搜索区间端点的函数值符号一致:该PDF定义域为[-1,1],代入端点计算可得
FX(-1)=0、FX(1)=0,因此你构造的fct(x) = FX(x)-U2在区间两端的取值都是-U2,符号完全相同,不符合uniroot要求的「区间两端函数值符号相反」的前提,因此直接触发报错。
正确实现步骤
首先计算该PDF对应的CDF:对PDF从定义域下限-1到x积分,可得CDF表达式为F(x) = (2 + 3x - x³)/4,该函数在[-1,1]区间单调递增,且满足F(-1)=0、F(1)=1,完全符合逆变换采样的要求。
修改后代码
# 定义正确的累积分布函数CDF FX_cdf <- function(x) (2 + 3*x - x^3)/4 M <- 5000 X2 <- rep(NA, M) for (i in 1:M) { U2 <- runif(1) fct <- function(x) FX_cdf(x) - U2 X2[i] <- uniroot(fct, c(-1, 1))$root }
优化建议
- 可提前对三次方程
(2 + 3x - x³)/4 = U求解析解,直接通过公式计算采样值,相比数值求解效率更高、稳定性更好。 - 可使用
Vectorize函数将求解过程向量化,替换循环进一步提升运行速度。
内容的提问来源于stack exchange,提问作者Lifeni
相关产品推荐
相关产品推荐

