Рассчитайте относительную ошибку, используя формулу де Ягера и циклы while - PullRequest
0 голосов
/ 14 сентября 2018

Просто для начала, у меня это работает, используя для циклов.Я не могу использовать для петель однако.Это должны быть вложенные циклы while.

Поскольку моя программа работает нормально, используя цикл for, должна быть проблема с моей вложенной логикой while.Каждый раз, когда запускается приведенный ниже код, я просто возвращаюсь с 0 для closestEstimate (моя начальная точка closestEstimate).Этого не происходит, и я получаю правильную долю процента с помощью цикла for.Так что есть проблема с моей вложенной логикой цикла while где-то.

Ниже приведены инструкции:

"Теперь рассмотрим формулу де Ягера waxbyczd, где каждый из 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%. Например, предположим, что вы выбралиПриблизительное среднее расстояние от Земли до Луны в милях: μ = 238 900. И предположим, что вы фанат спорта ОГУ, поэтому ваши личные номера - это количество побед в последнем сезоне национального чемпионата ОГУ (14; также рекорд для побед вгод со стороны любой команды колледжа), вместимость стадиона Огайо (102 329), год четырех золотых медалей Джесси Оуэнса в Берлине (1936) и ваш номер в футболке, когда вы играли в хоккей на траве средней школы (13).значение 14-5102329119361 / 2134 составляет около 239 103, что составляетЭто около 0,08% от μ.

Ваша задача - создать Java-программу, которая спрашивает пользователя, какая константа μ должна быть аппроксимирована, а затем по очереди запрашивает каждое из четырех личных чисел w, x, y,и з.Затем программа должна рассчитать и сообщить значения показателей a, b, c и d, которые максимально приближают формулу де Ягера к μ, а также значение формулы waxbyczd и относительную ошибку приближения кс точностью до сотой доли процента. "

Любая помощь в том, где я ошибаюсь с кодом ниже, будет принята с благодарностью. Я могу опубликовать рабочую версию цикла for, если это поможет. Единственный кодне включены вызовы статических методов, которые собирают числа ниже, но так как они не являются проблемой для версии for-loop, я не включил их сюда, так как это делает код намного длиннее и менее читаемым.хотя это помогло бы.

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

        //represents our universal physical or mathematical constant. any positive real number
        out.println(
                "First, let's get the double value for our mathematical constant:");
        double mu = getPositiveDouble(in, out);

        //represents our four personal numbers (not equal to 1) for da jager formula
        out.println(
                "Now we need four numbers with personal significance to you "
                        + "(doubles not equal to 1.0):");
        double w = getPositiveDoubleNotOne(in, out);
        double x = getPositiveDoubleNotOne(in, out);
        double y = getPositiveDoubleNotOne(in, out);
        double z = getPositiveDoubleNotOne(in, out);

//these are the 17 numbers as exponents for second part of da jager formula
double[] charmingTheory = { -5, -4, -3, -2, -1, -1 / 2, -1 / 3, -1 / 4,
        0, 1 / 4, 1 / 3, 1 / 2, 1, 2, 3, 4, 5 };

//initialize counters for our four loops
int i = 0;
int j = 0;
int k = 0;
int l = 0;

//starting estimate
double closestEstimate = 0;

while (i < charmingTheory.length) {
    double num1 = Math.pow(w, charmingTheory[i]);
    out.println(num1);
    i++;
    while (j < charmingTheory.length) {
        double num2 = Math.pow(x, charmingTheory[j]);
        j++;
        while (k < charmingTheory.length) {
            double num3 = Math.pow(y, charmingTheory[k]);
            k++;
            while (l < charmingTheory.length) {
                double num4 = Math.pow(z, charmingTheory[l]);
                double estimate = num1 * num2 * num3 * num4;
                if (Math.abs(mu - estimate) < Math
                        .abs(mu - closestEstimate)) {
                    closestEstimate = estimate;
                }
                l++;
            }
        }
    }
}
out.println("Closest Estimate is:");
out.println(closestEstimate);

1 Ответ

0 голосов
/ 14 сентября 2018

Вы не сбрасываете значения счетчиков цикла j,k,l в начале каждого цикла while.Поэтому они запускаются только один раз, первый раз через внешний цикл i.Вам нужно обновить начало каждого цикла while, чтобы он выглядел следующим образом:

j=0;
while (j < charmingTheory.length)
   //....
   k=0;
   while (k < charmingTheory.length)
     //....
     l=0;
     while (l < charmingTheory.length)

Я подозреваю, что причина, по которой это работало с циклами for, заключается в том, что вы делали это:

for(int j=0; j < charmingTheory.length; j++)
...