JSR 275 - единицы, проценты в секунду
Мне нужно представить единицу измерения процента в секунду, используя JSR 275 единиц JScience.org и реализацию мер. Я пытаюсь сделать следующее:
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");
Какие-нибудь мысли? Наиболее близкий к этому вопрос - вопрос об измерениях на приготовление пищи (именно так я понял, как определить ваши собственные единицы измерения).
3 ответа
Я написал этот пример кода, чтобы проверить математику здесь:
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
Это то, что мы ожидаем, что скорость изменения будет от 50 до 20 процентов в течение 10 секунд.
Таким образом, ваша конструкция должна выглядеть так:
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, а не количество безразмерных. Так что, если вы не хотите делать свой собственный Количество, используйте Единицу. Измерение, которое вы ищете, это None/Time или%/second, если вы хотите, чтобы там были правильные скалярные множители. Наконец, вам решать, хотите ли вы сделать свой собственный Количество, но это может быть полезно, если вы используете это во многих местах.
Также было бы целесообразно ознакомиться с последними разработками в области JScience, поскольку кажется, что они решили, что необходимо количество (с методами сложения, вычитания, умножения, деления, вычисления и т. Д.). Было бы очень легко сделать весь этот анализ с помощью Amount. Просто сделайте Процентную сумму минус Процентную сумму и разделите на количество секунд, и она должна подойти для вас.
Имеет единицы s^-1
или Гц (SI.HERTZ
в науке говорю).
Или же Unit<Frequency>
,
Процент - это не единица, а скаляр - поэтому процент в секунду - это только скалярное значение в единицу времени, что не имеет смысла. Это как сказать "3 в секунду". 3 что?
Если вы включите единицу измерения, которую вы измеряете за единицу времени, вы получите правильную единицу измерения.