4

JScience.org のJSR 275単位と測定の実装を使用して、1 秒あたりのパーセントの単位を表す必要があります。私は次のことをしようとしています:

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");

何かご意見は?これに最も近いのは、料理の測定に関する質問です(これは、独自の単位を定義する方法を見た方法です)。

4

3 に答える 3

4

ここで数学をテストするために、このコードサンプルを作成しました。

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

これは、10 秒間で 50% から 20% に変化した場合の変化率が予想されるものです。

したがって、ユニットの構築は次のようになります。

    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])は期待どおりに出力されます。

したがって、単位と次元があり、メジャーを作成できます。測定している数量は何ですか? ドキュメントでは、数量について次のように述べています。

個別の数量は通常、物理的な次元が異なります。たとえば、Torque と Energy は同じ次元ですが、性質が異なります (トルクのベクトル、エネルギーのスカラー)。

したがって、頻度は正しい量のように見えますが、実際には、私たちが議論しているように見える意味量を表していません。

最後に、コードの最初の行は機能しません。これは、含まれているモデルで 1/[T] が量 Dimensionless ではなく量 Freqency を測定するためです。したがって、独自の Quantity を作成したくない場合は、Unit を使用してください。探しているディメンションは、正しいスカラー乗数が必要な場合は None/Time、または %/second です。最後に、独自の Quantity を作成するかどうかはあなた次第ですが、これを多くの場所で使用している場合は価値があるかもしれません。

Amount (加算、減算、乗算、除算、pow などのメソッド) が必要であると判断したように見えるため、 JScienceスペースの最新の開発をチェックすることも価値があります。Amount を使用すると、このすべてのディメンション分析を非常に簡単に実行できます。パーセント量からパーセント量を引いて、秒量で割るだけで、単位が計算されます。

于 2010-05-26T01:26:07.150 に答える
3

単位s^-1、または Hz ( SI.HERTZJScience で言えば) があります。

またはUnit<Frequency>

于 2010-05-25T12:34:35.380 に答える
0

パーセントは単位ではなくスカラーなので、1 秒あたりのパーセントは単位時間あたりのスカラー値にすぎず、意味がありません。「毎秒3」と言っているようなものです。3 なに?

単位時間あたりに測定している単位を組み込むと、正しい単位が得られます。

于 2010-05-24T13:27:32.587 に答える