使用Apache Commons计算值的Log和Exp

时间:2014-07-09 02:21:09

标签: java math apache-commons-math

我的死亡率风险计算需要确定自然对数和衰减。该方法详述如下。我很想知道为什么计算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

然而,仍然存在一个问题,即这是所有用途的预期行为。

2 个答案:

答案 0 :(得分:3)

ExpLog等类不存储任何州。他们的value方法不是静态的原因是为了实现UnivariateFunction接口。所以,是的,你可以安全地重复使用这些对象。

UnivariateFunction接口的一个好处是你可以编写一个带有这样一个对象的函数,用户可以通过传入一个合适的函数对象来参数化你的函数。这个概念被称为higher-order functions(如果你来自FP阵营,就像我一样)或strategy pattern(如果你来自OOP阵营)。

答案 1 :(得分:1)

如果你只是想计算一个值的log和exp,通常最好使用FastMath,它为这个和其他基本的数学函数提供静态方法(类似于Math,但提供了一个纯java实现,并且对于某些它们)。