【问题标题】:JSR 275 - Units, Percent per secondJSR 275 - 单位,每秒百分比
【发布时间】:2011-02-23 05:51:21
【问题描述】:

我需要使用 JScience.org 的 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 上的问题(这就是我看到如何定义自己的单位的方式)。

【问题讨论】:

标签: java generics units-of-measurement jscience jsr-275


【解决方案1】:

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

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。因此,如果您不想制作自己的 Quantity,请使用 Unit。您正在寻找的维度是无/时间,或者如果您想要正确的标量乘数,则为 %/秒。最后,是否要制作自己的 Quantity 取决于您,但如果您在很多地方都使用它,这可能是值得的。

查看JScience 空间中的最新发展也是值得的,因为他们似乎决定需要 Amount(使用加法、减法、乘法、除法、pow 等方法)。使用 Amount 进行所有这些维度分析真的很容易。只需将百分比金额减去百分比金额并除以秒数,它应该会为您计算单位。

【讨论】:

  • 感谢您的深入回复
【解决方案2】:

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

Unit&lt;Frequency&gt;

【讨论】:

    【解决方案3】:

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

    如果您将每单位时间所测量的单位结合起来,您将获得正确的单位。

    【讨论】:

    • 我同意这没有多大意义,但这是我正在实施的技术规范中指定的单位。也许我需要改变它。
    • 我同意 - 将它作为一个单元来组合是有意义的。但它不是无量纲的,所以我会看那里。 (我不知道 API - 但我使用过 SI 单位。)
    • 好的,这就解释了。我猜无量纲/时间!=无量纲;可能必须像我一样创建一个新数量。
    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 2011-05-12
    • 2019-05-01
    • 2021-11-22
    • 2019-03-27
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多