Я написал этот пример кода, чтобы проверить математику здесь:
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] измеряет количество Частота, а не количество Безразмерность. Поэтому, если вы не хотите создавать собственное количество, используйте Unit. Искомое измерение — None/Time или %/second, если вы хотите, чтобы там были правильные скалярные множители. Наконец, вам решать, хотите ли вы создать собственное количество, но это может быть полезно, если вы используете это во многих местах.
Также было бы полезно ознакомиться с последними разработками в области JScience, поскольку например, они решили, что необходима сумма (с методами сложения, вычитания, умножения, деления, pow и т. д.). Было бы очень легко сделать весь этот размерный анализ с Amount. Просто сделайте процентную сумму минус процентную сумму и разделите на количество секунд, и это должно сделать единицы для вас.
person
jasonmp85
schedule
26.05.2010