我写了这个代码示例来测试这里的数学:
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 进行所有这些维度分析真的很容易。只需将百分比金额减去百分比金额并除以秒数,它应该会为您计算单位。