4

微分方程式を数値的に解こうとしています (初めて)。私のプログラムは、一連のパラメーターを要求し、ワインのボトルを特定の温度に冷やすのに必要な時間を計算します。これが私のメインです:

import java.util.Scanner;

public class Step2_lab11 {
    public static int TAO = 50;
    public static double DELTA_MINUTES = 0.1;

    public static void main(String[] args) {

        System.out.println("VINETS AVKYLNINGSTID \n");
        System.out.println("Ange vinets temperatur:");

        Scanner userIn = new Scanner(System.in);
        double wineTemp = userIn.nextDouble();

        System.out.println("Vinets önskade temperatur:");
        double preferredTemp = userIn.nextDouble();

        System.out.println("Kylens/frysens temperatur:");
        double chillTemp = userIn.nextDouble();

        WineChiller wineChiller = new WineChiller();

        double elapsedTime = 0.0;

        while(wineTemp > preferredTemp) {

            elapsedTime = elapsedTime + DELTA_MINUTES;
            double dT = wineChiller.getChillingTime(TAO, DELTA_MINUTES, chillTemp, preferredTemp, wineTemp);
            wineTemp = wineTemp - dT;
            System.out.println(elapsedTime);


        }
    }

}

これは WineChiller.java ファイルです。

public class WineChiller {
    public WineChiller() {


    }

    public double getChillingTime(int TAO, double DELTA_MINUTES, double chillTemp, double preferredTemp, double wineTemp) {

        double dT = (wineTemp - chillTemp) * DELTA_MINUTES  / TAO;
        return dT;
    }

}

while ループの Syso 部分がこれを生成します (wineTemp = 25、preferredTemp = 16、chillTemp = 5 の場合)

0.1
0.2
0.30000000000000004
....
29.300000000000146
29.400000000000148
29.50000000000015
29.60000000000015
29.700000000000152
29.800000000000153
29.900000000000155

ランダムな小数を追加する理由がわかりません。また、100% ではありませんが、正しい答えは 29.9 分ではなく、正確に 30 分であるべきだと思います。ここで明らかな論理エラーを見逃していますか?

4

1 に答える 1

10

これを読む必要があります。

これが、2 進数と IEEE 浮動小数点表現がどのように機能するかです。

10 進数で 1/3 を表すことができないのと同じように、2 進数で 0.1 を正確に表すことはできません。

これが、double または float を使用するときに値を比較してはならない理由です。差の絶対値に対する許容度が必要です。

集中質量の非定常熱伝達の一次 ODE の単純なオイラー積分のように見えます。時間ステップの選択が安定性と精度にどのように影響するかを理解していることを確認してください。

于 2013-06-23T14:42:52.413 に答える