JSR 275-单位,每秒百分比
-
04-10-2019 - |
题
我需要使用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");
有什么想法吗?我能找到的最接近的是问题 烹饪测量 (这就是我看到如何定义自己的单位的方式)。
解决方案
我写了此代码示例以在这里测试数学:
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 空间由于他们似乎决定数量(添加,减,乘,分隔,POW等)。用数量进行所有这些维度分析真的很容易。只需减去百分之额的百分比,然后除以几秒钟,它应该为您完成单位。
其他提示
它有单位 s^-1
, 或Hz(SI.HERTZ
在JScience讲话)。
或者 Unit<Frequency>
.
百分比不是单元,而是标量 - 因此每秒百分比仅是单位时间标量值,这是没有意义的。这就像说“每秒3个”。 3什么?
如果您将单位时间测量的单位合并为单位时间,这将使您成为正确的单位。