2010-05-24 37 views
4

我需要使用JScience.org的JSR 275单位和度量实现来表示每秒百分比的单位。我试图做到以下几点:JSR 275 - 单位,每秒百分比

Unit<Dimensionless> PERCENT_PER_SECOND = NonSI.PERCENT.divide(Si.SECOND).asType(Dimensionless.class) 

但我得到一个ClassCastException当我尝试这样做。

下面的作品,但我不知道是否有更好的办法:

public interface PercentOverTime extends Quantity {} 
public static Unit<PercentOverTime> PERCENT_PER_SECOND = new BaseUnit<PercentOverTime>("%/s"); 

有什么想法?我能找到的最接近的是Cooking Measurements(这是我如何定义你自己的单位)的问题。

+0

我觉得这应该是可能的,但不能抓住JScience JSR-275 RI的JAR。你有一个指向它可以下载的地方吗?我知道我之前使用过它,但在JSR关闭后,很难找到指向它的任何指示。 – jasonmp85 2010-05-25 06:52:33

+0

http://download.java.net/maven/2/net/java/dev/jsr-275/jsr-275/1.0-beta-2/ – I82Much 2010-05-25 12:07:08

回答

4

我写了这个代码示例来测试这里的数学:

public void testUnit() { 
    // define two points on a function from t -> % 
    // the rate of change between these two points 
    // should have unit %/t 
    Measure<Double, Dimensionless> p0 = Measure.valueOf(50.0, NonSI.PERCENT); 
    Measure<Double, Dimensionless> p1 = Measure.valueOf(20.0, NonSI.PERCENT); 

    Measure<Double, Duration> timeDifference = Measure.valueOf(10.0, SI.SECOND); 

    // JSR-275 has no Amount, so have to convert and do math ourselves 
    // these doubles are percents 
    double p0Raw = p0.doubleValue(NonSI.PERCENT); 
    double p1Raw = p1.doubleValue(NonSI.PERCENT); 

    // this duration is in seconds 
    double timeDifferenceRaw = timeDifference.doubleValue(SI.SECOND); 

    // this is the slope of the secant between the two points 
    // so it should be the %/s we want 
    double rateSecant = (p1Raw - p0Raw)/timeDifferenceRaw; 

    // let's see what we get 
    Measure<Double, ?> answer = Measure.valueOf(rateSecant, 
               NonSI.PERCENT.divide(SI.SECOND)); 
    System.out.println(answer); 
} 

如果你原来的功能有时间作为独立变量(如为秒)的比例为自变量(例如,作为百分比),那么这个函数关于时间的导数将仍然有时间作为自变量,但是将具有“每时间比率”作为相关性。

是的,比率是无量纲的,所以这有些奇怪,但是您可以想象一张股票价格随时间变化的百分比图,然后是股票价格变化百分比变化图白天的日子。

那么这个打印出来是什么?

-3.0 %/s 

这就是我们预计在10秒内变化率从50%变为20%的原因。

所以,你的单位建设应该是这样的:

Unit<?> magicUnit = NonSI.PERCENT.divide(SI.SECOND); 
    Dimension magicDimension = Dimension.NONE.divide(Dimension.TIME); 

    System.out.println(magicUnit + " measures " + magicDimension + " (" 
      + magicUnit.getDimension() + ")"); 

事实上这种打印%/s measures 1/[T] (1/[T]),如我们预期。

所以我们有一个单位和维度,可以使措施。我们测量的数量是多少?文档说这个关于数量:

不同的数量通常有不同的物理尺寸 ; 虽然它不是必需的,但也是必需的,例如扭矩和 能量具有相同的尺寸,但具有不同的性质(扭矩矢量,能量标量 )。

所以虽然频率似乎是正确的数量,但它并不真正表达我们似乎讨论的语义量。

最后,您的第一行代码不起作用,因为在包含模型中1/[T]测量数量Freqency,而不是数量Dimensionless。所以如果你不想制作自己的数量,请使用单位。您要查找的维度是无/时间,或者如果您希望在那里有正确的标量乘数,则为%/秒。最后,您是否想要自己制作数量取决于您,但如果您在很多地方使用它,这可能是值得的。

查看JScience空间的最新进展也是值得的,因为它似乎需要量(需要加,减,乘,除,等等方法)。使用金额进行所有这些维度分析真的很容易。只要做一个百分比金额减去一个百分比金额和除以一秒的金额,它应该为你做单位。

+0

感谢您的深入回应 – I82Much 2010-05-26 02:16:14

0

百分比不是一个单位,而是一个标量 - 所以每秒百分比只是每单位时间的标量值,这是没有意义的。这就像说“每秒3次”。 3什么?

如果您将每单位时间测量的单位合并为一个单位,将会得到正确的单位。

+0

我同意它没有多大意义,但那是在我正在实施的技术规范中指定的单位。也许我需要改变这一点。 – I82Much 2010-05-24 13:37:35

+0

我同意 - 将它作为一个单位可以稍后合并是有意义的。但它不是无量纲的,所以我会在那里看。 (我不知道API - 但我曾与国际单位制。) – mdma 2010-05-24 14:07:55

+0

好吧,解释它。我猜无量纲/时间!=无量纲;可能必须像我一样创造一个新的数量。 – I82Much 2010-05-25 12:08:00

3

它有单位s^-1或Hz(JScience讲话中的SI.HERTZ)。

Unit<Frequency>