2010-05-24 55 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>