有两种方式实现
自己手写基于jdk底层math包
使用三方api
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
公式展示:P(k)=(λk)*(e-λ))/k!
F ( x , λ ) = ∑ k = 0 x e − λ λ k k ! F(x, \lambda) = \sum_{k = 0}^{x} \frac{e^{-\lambda} \lambda^{k}}{k !} F(x,λ)=k=0∑xk!e−λλk
自己手写基于jdk底层math包
/**
* 泊松分布计算
* 正函数:这是根据x算最终的概率
* 反函数:反向算x就是使用whlie循环加x算得的概率于预期比较大于就代表x就是最终结果,
* 注意事项: 如果x,lambda 很大超过double的最大范围计算就会出问题
*/
@Test
void test003() {
Assertions.assertDoesNotThrow(() -> {
int x = 10;
double result = 0;
double lambda = 7.5;
for (int i = x; i > 0; i--) {
// lambda 的i次方
double j = Math.pow(lambda, i);
// e的-lambda次方
double e = Math.exp(-lambda);
// 累计阶乘
double h = factorial(i);
result += (j * e) / h;
}
System.out.println(result);
});
}
/**
* 累计阶乘
*/
public double factorial(int n) {
double result = 1;
for (int i = 2; i <= n; i++) {
result *= i;
}
return result;
}
使用三方api
这里使用阿帕奇的工具包
1.加入依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
2.使用
/**
* 1.使用很简单只需要创建对象然后给参数值就可以得到结果了,下面使用的是逆向计算,算x
* 2. 底层采用的是,均值法和简单的二分法有兴趣可以去阅读一下源码对于公式的理解还是很有帮助的
*/
@Test
void test004() {
Assertions.assertDoesNotThrow(() -> {
// Poisson分布的参数
double lambda = 411.5;
// 要求的分位数概率值
double p = 0.95;
PoissonDistribution poisson = new PoissonDistribution(lambda);
double x = poisson.inverseCumulativeProbability(p);
System.out.println("The Poisson inverse function of p=" + p + " with lambda=" + lambda + " is " + x);
});
}