Вопрос

Мне нужно представить единицу процента в секунду, используя JScience.org. ДжСР 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

Именно такой, как мы ожидаем, будет скорость изменения от 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.Измерение, которое вы ищете, — «Нет/время» или «%/секунда», если вам нужны правильные скалярные множители.Наконец, вам решать, хотите ли вы создать свой собственный Quantity, но это может оказаться полезным, если вы используете его во многих местах.

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

Другие советы

У него есть единицы s^-1, или Гц (SI.HERTZ В ДЖИИНГИИ говорите).

Или Unit<Frequency>.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top