Есть задание написать страничку, которая ищет минимум функции методом деления интервала пополам. Все готово, но код ведет себя не адекватно (с моей точки зрения,
программист на 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>
BisectionMethodProgram.zip