1. ホーム
  2. ジャワ

[解決済み] 配列をループして相対誤差を計算する

2022-03-03 02:25:10

質問

私のプログラムは、配列{-5, -4, -3, -2, -1, -1/2, -1/3, -1/4, 0, 1/4, 1/3, 1/2, 1, 2, 3, 4, 5}から抽出して、ユーザーが入力した数の相対誤差を計算するために4つの入れ子ループしながら実行しようとしています。以下は、この課題の抜粋です。

ここで、a、b、c、dの各々は17個の数{-5, -4, -3, -2, -1, -1/2, -1/3, -1/4, 0, 1/4, 1/3, 1/2, 1, 2, 3, 4, 5}のうちの1つである。チャーミング理論("charming theory")は、あなたの4つの個人的な数字を使ったde Jager式で、相対誤差1%の範囲でμを近似できると主張している。例えば、地球から月までの平均距離をマイルで近似すると、μ = 238,900となる。また、あなたがOSUのスポーツファンであり、OSUの最後の全米選手権シーズンの勝利数(14、大学チームの年間勝利数記録)、オハイオスタジアムの座席数(102,329)、ジェシー・オーエンスがベルリンで4つの金メダルを取った年(1936)、あなたが高校時代にフィールドホッケーをしていたときのジャージ番号(13)があなたの個人番号であるとします。すると、14-5102329119361/2134の値は約239,103となり、μの約0.08%以内となる。

あなたの仕事は、近似すべき定数μが何かをユーザに尋ね、4つの個人数w、x、y、zを順番に尋ね、de Jagerの式をμに限りなく近づける指数a、b、c、dの値、waxbyczdの式の値、近似値の100分の1以下の相対誤差を計算して報告するJavaプログラムを作ることです. "。

下のコードは、今のところ私が持っているものです。このままでは動作しないことは分かっていますが、少なくとも正しい方向に進んでいることを願っています。ただ、これからどうすればいいのか、ネストしたループをどう修正すればいいのか、よくわかりません。どのように動作させるべきか本当に悩んでいるので、どんな助けでも非常にありがたいです。また、このようなネストされたループにはforループが適していると思いますが、forを使用する前にwhileループを使用する必要があることも理解しています。

import components.simplereader.SimpleReader;
import components.simplereader.SimpleReader1L;
import components.simplewriter.SimpleWriter;
import components.simplewriter.SimpleWriter1L;


public final class ABCDGuesser1 {


private ABCDGuesser1() {
}


public static void main(String[] args) {
    SimpleReader in = new SimpleReader1L();
    SimpleWriter out = new SimpleWriter1L();

    out.print("Enter a positive real-valued universal physical or mathematical constant: ");
    double mu = in.nextDouble();

    out.print("Enter four postitive numbers not equal to 1: ");
    double w = in.nextDouble();
    double x = in.nextDouble();
    double y = in.nextDouble();
    double z = in.nextDouble();

    int[] charm = { -5, -4, -3, -2, -1, -1 / 2, -1 / 3, -1 / 4, 0, 1 / 4,
            1 / 3, 1 / 2, 1, 2, 3, 4, 5 };

    int a = 0;
    int i = 0;
    while (i < charm.length) {
        a = charm[i];
        double max1 = (Math.pow(w, a));
        i++;

        int b = 0;
        int j = 0;
        while (j < charm.length) {
            b = charm[j];
            double max2 = (Math.pow(x, b));
            j++;

            int c = 0;
            int k = 0;
            while (k < charm.length) {
                c = charm[k];
                double max3 = (Math.pow(y, c));
                k++;

                int d = 0;
                int n = 0;
                while (n < charm.length) {
                    d = charm[n];
                    double max4 = (Math.pow(z, d));
                    n++;
                }
                out.print(max1);
            }
        }
    }

    in.close();
    out.close();
}

}

解決方法は?

  1. Invexityさんがおっしゃるように、int[] チャームではなく、double[] チャームです。

  2. ループしている間、bestEstimate を追跡する。

ということで、あなたのコードは次のようになります。

package area51;

import java.io.PrintStream;

public final class ABCDGuesser1 {

    private ABCDGuesser1() {
    }

    public static void main(String[] args) {

        PrintStream out = System.out;
        //out.print("Enter a positive real-valued universal physical or mathematical constant: ");
        double mu = 2.567;

        //out.print("Enter four postitive numbers not equal to 1: ");
        double w = 123.4;
        double x = 2.567;
        double y = 8.9;
        double z = 12.6;

        double[] charm = { -5, -4, -3, -2, -1, -1 / 2, -1 / 3, -1 / 4, 0, 1 / 4, 1 / 3, 1 / 2, 1, 2, 3, 4, 5 };

        double bestEstimate = 0;
        String bestIndexes = "";
        for (int i = 0; i < charm.length; i++) {
            double max1 = (Math.pow(w, charm[i]));
            for (int j = 0; j < charm.length; j++) {
                double max2 = (Math.pow(x, charm[j]));
                for (int k = 0; k < charm.length; k++) {
                    double max3 = (Math.pow(y, charm[k]));
                    for (int n = 0; n < charm.length; n++) {
                        double max4 = (Math.pow(z, charm[n]));
                        double currentEstimate = max1 * max2 * max3 * max4;
                        if (Math.abs(mu - currentEstimate) < Math.abs(mu - bestEstimate)) {
                            bestEstimate = currentEstimate;
                            bestIndexes = ""+i+","+j+","+k+","+n;
                        }
                    }
                    //out.print(max1);
                }
            }
        }
        out.println("Best Estimate = " + bestEstimate);
        out.println("Best Indexes = " + bestIndexes);
    }
}