JSR 275 - Единицы, проценты в секунду

Мне нужно представить единицу процента в секунду, используя 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");

Есть предположения? Ближе всего к этому я смог найти вопрос о Cooking Measurements (именно так я увидел, как для определения собственных единиц).


person I82Much    schedule 24.05.2010    source источник
comment
Я чувствую, что это должно быть возможно, но не могу получить JAR для JScience JSR-275 RI. Не подскажете где его можно скачать? Я знаю, что использовал его раньше, но после того, как JSR был закрыт, стало труднее найти указатель на что-либо об этом.   -  person jasonmp85    schedule 25.05.2010
comment
download.java .net/maven/2/net/java/dev/jsr-275/jsr-275/   -  person I82Much    schedule 25.05.2010


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

Также было бы полезно ознакомиться с последними разработками в области JScience, поскольку например, они решили, что необходима сумма (с методами сложения, вычитания, умножения, деления, pow и т. д.). Было бы очень легко сделать весь этот размерный анализ с Amount. Просто сделайте процентную сумму минус процентную сумму и разделите на количество секунд, и это должно сделать единицы для вас.

person jasonmp85    schedule 26.05.2010
comment
Спасибо за подробный ответ - person I82Much; 26.05.2010

Он имеет единицы s^-1 или Гц (SI.HERTZ в языке JScience).

Or Unit<Frequency>.

person clstrfsck    schedule 25.05.2010

Процент - это не единица, а скаляр, поэтому процент в секунду - это всего лишь скалярное значение в единицу времени, что не имеет смысла. Это как сказать "3 в секунду". 3 что?

Если вы включите единицу того, что вы измеряете, в единицу времени, это даст вам правильную единицу.

person mdma    schedule 24.05.2010
comment
Я согласен, что это не имеет особого смысла, но это единица, указанная в технической спецификации, которую я реализую. Возможно, мне нужно это изменить. - person I82Much; 24.05.2010
comment
Я согласен - имеет смысл иметь это как единое целое, которое вы можете позже объединить. Но он не безразмерный, поэтому я бы посмотрел туда. (Я не знаю API, но я работал с единицами СИ.) - person mdma; 24.05.2010
comment
Хорошо, это объясняет это. Я думаю, безразмерно / время! = безразмерно; вероятно, придется создать новое количество, как я сделал. - person I82Much; 25.05.2010