我的死亡率风险计算需要确定自然对数和衰减。该方法详述如下。我很想知道为什么计算exp等的方法不是静态的,如果我有一个Log(或Exp)对象用于多个参数,如果存在计算错误的风险。那我可以使用单个Log实例来计算Log(2.3)和Log(567)吗?
public Double getROD(Integer score) {
Double beta0 = new Double(-7.7631);
Double beta1 = new Double(0.0737);
Double beta2 = new Double(0.9971);
Log log = new Log();
Exp exp = new Exp();
Double logit = beta0 + (beta1 * score) + (beta2 * log.value(new Double(score + 1)));
Double mortality = exp.value(logit) / (1 + exp.value(logit));
return mortality;
}
我尝试了以下内容:
Log log = new Log();
Double arg1 = log.value(new Double(12.3));
Double arg2 = log.value(new Double(29.12));
System.out.println(arg1.toString() + " : " + arg2.toString());
导致
2.509599262378372 : 3.3714252233284854
然而,仍然存在一个问题,即这是所有用途的预期行为。
答案 0 :(得分:3)
Exp
,Log
等类不存储任何州。他们的value
方法不是静态的原因是为了实现UnivariateFunction
接口。所以,是的,你可以安全地重复使用这些对象。
UnivariateFunction
接口的一个好处是你可以编写一个带有这样一个对象的函数,用户可以通过传入一个合适的函数对象来参数化你的函数。这个概念被称为higher-order functions(如果你来自FP阵营,就像我一样)或strategy pattern(如果你来自OOP阵营)。
答案 1 :(得分:1)
如果你只是想计算一个值的log和exp,通常最好使用FastMath,它为这个和其他基本的数学函数提供静态方法(类似于Math,但提供了一个纯java实现,并且对于某些它们)。