4

我需要使用 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");

有什么想法吗?我能找到的最接近这一点的是关于烹饪测量的问题(这就是我看到如何定义自己的单位的方式)。

4

3 回答 3

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

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

于 2010-05-26T01:26:07.150 回答
3

它有单位s^-1,或 Hz(SI.HERTZ在 JScience 中)。

Unit<Frequency>

于 2010-05-25T12:34:35.380 回答
0

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

如果您合并每单位时间测量的单位,那么您将获得正确的单位。

于 2010-05-24T13:27:32.587 回答