咨询:将指定数学公式转换为JavaScript代码的问题排查
排查你的对数正态分布PDF代码错误
首先,先明确一下:你写的公式看起来是对数正态分布的概率密度函数(PDF),但原公式的括号位置可能有点歧义,正确的数学表达式应该是:
F(x) = \frac{1}{x \cdot \sigma \cdot \sqrt{2\pi}} \cdot e^{-\frac{(\ln(x) - \mu)2}{2\sigma2}}
你的JavaScript代码核心错误是把指数项放到了分母里,而实际上它应该是和前面的分式相乘的关系。我们来一步步拆解问题:
你的代码问题点
- 公式结构错误:原公式中,
e^-(ln(x)-µ)²/(2σ²)是整个表达式的乘数,但你的代码把它写在了分母的除法运算中,导致整个计算结果变成了正确值的倒数。 - 冗余的负号平方:
Math.pow(-(Math.log(x)-0.1136),2)里的负号完全没必要,因为平方运算会消除正负差异,不过这不会导致错误,只是多余代码。
修正后的代码
// 定义参数:σ=0.24,μ=0.1136 const sigma = 0.24; const mu = 0.1136; // 计算对数正态分布PDF const fx = (1 / (x * sigma * Math.sqrt(2 * Math.PI))) * Math.pow(Math.E, -Math.pow(Math.log(x) - mu, 2) / (2 * Math.pow(sigma, 2)));
或者用更简洁的写法(利用Math.exp替代Math.pow(Math.E, ...),效率更高):
const sigma = 0.24; const mu = 0.1136; const fx = (1 / (x * sigma * Math.sqrt(2 * Math.PI))) * Math.exp(-Math.pow(Math.log(x) - mu, 2) / (2 * sigma * sigma));
逻辑对应说明
1 / (x * sigma * Math.sqrt(2 * Math.PI))对应公式中的\frac{1}{x \cdot \sigma \cdot \sqrt{2\pi}}Math.exp(-Math.pow(Math.log(x) - mu, 2) / (2 * sigma²))对应公式中的e^{-\frac{(\ln(x) - \mu)^2}{2\sigma^2}}
这样修正后,代码就完全匹配对数正态分布的PDF公式了。
内容的提问来源于stack exchange,提问作者Logi
相关产品推荐
相关产品推荐

