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