Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Непонятное поведение кода (https://javascript.ru/forum/misc/75531-neponyatnoe-povedenie-koda.html)

Torq 16.10.2018 23:56

Непонятное поведение кода
 
Вложений: 1
Есть задание написать страничку, которая ищет минимум функции методом деления интервала пополам. Все готово, но код ведет себя не адекватно (с моей точки зрения, программист на C#). Я вообще не могу понять, в чем проблема, может гуру подскажут. Надеюсь на вашу помощь.
Вызывая Bisection() выводит один результат, а Calculate() второй, но итераций одинаковое количество. Calculate() внутри себя вызывает Bisection().
Область поиска бага - функции Calculate() и Bisection(-6, 6, 0.01). Для вызова Calculate() из консоли, заполните страничку значениями -6, 6, 0.01 . Кнопки работают.
function F(x) {
    return ((6 * x + 3) ** 2 - 2 * x - 1)
}

function Calc_point_left(a, b) {
    return a + ((b - a) / 4)
}

function Calc_point_right(a, b) {
    return b - ((b - a) / 4)
}

function Bisection(a, b, tol) {
    k = 0
    Xk = (a + b) / 2
    while (Math.abs((b - a)) > tol) {
        k += 1
        Yk = Calc_point_left(a, b)
        Zk = Calc_point_right(a, b)
        if (F(Yk) < F(Xk)) {
            b = Xk
            Xk = Yk
        }
        else {
            if (F(Zk) < F(Xk)) {
                a = Xk
                Xk = Zk
            }
            else {
                a = Yk
                b = Zk
            }
        }
    }
    //alert([Xk, k]);//контрольный алерт
    return [Xk, k]
}

function Calculate(){
    var rightPoint = document.getElementById('idRightPoint').value;
    alert(rightPoint);
    var leftPoint = document.getElementById('idLeftPoint').value;
    alert(leftPoint);
    var accuracy = document.getElementById('idAccuracy').value;
    alert(accuracy);
    var array =  Bisection(leftPoint, rightPoint, accuracy);
    var output = "Минимум функции на отрезке [" + leftPoint + ";" + rightPoint + "] равен: " + array[0] + "\nбыло выполнено " + array[1] + " вычислений функции";
    alert(array);
    alert(output);
}


<html>

<head>
  <title></title>
  <meta content="">
  <style></style>
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"
    crossorigin="anonymous">
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
    crossorigin="anonymous"></script>
  <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
    crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
    crossorigin="anonymous"></script>
</head>

<body>

  <div class="container">
    <div class="row">
      <div class="col-3"></div>
      <div class="col-6 text-center">
        </br>
        <div class="input-group">
          <div class="input-group-prepend">
            <span class="input-group-text">Левая и правая границы интервала</span>
          </div>
          <input type="number" id="idLeftPoint" aria-label="left point" class="form-control">
          <input type="number" id="idRightPoint" aria-label="right point" class="form-control">
        </div>
        </br>
        <div class="input-group">
          <div class="input-group-prepend">
            <span class="input-group-text">Точность вычислений</span>
          </div>
          <input type="number" step="0.01" id="idAccuracy" aria-label="accuracy" class="form-control">
        </div>
        </br>
        <button type="button" class="btn btn-success" onclick="Calculate();">Вычислить</button>
        <button type="button" class="btn btn-success" onclick="Bisection(-6, 6, 0.01);">Вычислить контрольный</button>
      </div>
      <div class="col-3"></div>
    </div>
  </div>

  <script src="scripts/main.js"></script>

</body>

</html>


Вложение 4012

Aetae 17.10.2018 01:46

element.value : string
'1' : string + '2' : string -> '12', а не 3.

С# бы вам сказал что тип не тот, а тут придётся самому думать.

Torq 17.10.2018 08:59

Было подозрение, но я думал type="number" все исправил. Надо парсить как инт? Я конечно проверю, когда код открою, но может вы быстрее меня исправите.

Aetae 17.10.2018 09:10

Надо парсить в int.
Ещё есть свойство valueAsNumber, но, как обычно, в ослике не работает.

Torq 17.10.2018 17:26

Большое спасибо, пошел смотреть как поставить typescript.


Часовой пояс GMT +3, время: 05:42.