代码之家  ›  专栏  ›  技术社区  ›  I82Much

JSR 275-单位,每秒百分比

  •  4
  • I82Much  · 技术社区  · 15 年前

    我需要用jscience.org表示每秒百分比的单位 JSR 275 单位和措施执行情况。我正在尝试执行以下操作:

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

    但当我试图这样做的时候,我得到了一个阶级的例外。

    以下是可行的,但我不确定是否有更好的方法:

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

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

    3 回复  |  直到 15 年前
        1
  •  4
  •   jasonmp85    15 年前

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

    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]中测量的是数量频率,而不是数量无量纲。所以如果你不想自己制造数量,就用单位。您要查找的维度是“无/时间”,如果您希望其中包含正确的标量乘数,则为/秒。最后,这取决于你是否想自己制造数量,但如果你在很多地方使用它,这可能是值得的。

    也值得一看 JScience 空间,因为他们似乎决定数量(加,减,乘,除,功率等方法)是必要的。用数量来做所有这些维度分析真的很容易。只需要做一个百分比减去一个百分比,再除以一秒的量,它就可以为你做单位了。

        2
  •  3
  •   clstrfsck    15 年前

    它有单位 s^-1 或赫兹 SI.HERTZ 在jscience语言中)。

    Unit<Frequency> .

        3
  •  0
  •   mdma    15 年前

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

    如果你把单位时间所测量的单位合并起来,你就能得到正确的单位。