JSR 275 - единицы, проценты в секунду - PullRequest
4 голосов
/ 24 мая 2010

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

4 голосов
/ 26 мая 2010

Я написал этот пример кода, чтобы проверить математику здесь:

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. Просто введите сумму процентов за вычетом суммы процентов и разделите ее на доли секунды, и она должна подойти для вас.

3 голосов
/ 25 мая 2010

У него есть единицы измерения s^-1 или Гц (SI.HERTZ в JScience говорят).

Или Unit<Frequency>.

0 голосов
/ 24 мая 2010

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

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

...