Методом деления отрезка пополам
Метод деления отрезка пополам заключается в следующем. Проверяется наличие корня на отрезке [a, b] (рис.4.4). Рис.4.4. Метод деления отрезка пополам. Для этого вычисляются значения функций f(a) и f(b). Если f(a)*f(b)>0, то уравнение не имеет корней на заданном отрезке. Если f(a)*f(b)<0, т.е. на концах отрезка [a, b] функция f(x) имеет противоположные знаки, то искомый корень лежит на этом отрезке. Поиск корня происходит следующим образом. Находим в точке a значение функции y1 = f(a). Затем определяем значение x как среднюю точку между а и b, вычисляем значения y2 = f(x). Теперь, если f(a)*f(x)>0, то корень находится на отрезке [x, b], иначе – на отрезке [a, x]. В соответствии с этим, перемещаем точку а вправо или точку в влево, выполняя, соответственно присваивание а = х или b = x. Таким образом, получаем второй отрезок [a, b], но вдвое меньший предыдущего. Процесс деления отрезка пополам продолжаем до тех пор, пока отрезок [a, b] не станет меньше заданной точности. После этого вычисляем значение x = (a+b)/2.
Пример 4.4. Решение уравнения с заданной точностью e = 0.01 методом деления отрезка пополам, если корень находится на отрезке [1,3]. #include <iostream> #include <conio.h> #include <math.h> #include <stdlib.h> using namespace std;
int main() { int n = 0; float x, a = 1, b = 3, y1, y2, eps = 0.001, e, r, l; l = a; r = b; y1 = a*a*a – 2*a*a – 3; y2 = b*b*b – 2*b*b – 3; if (y1*y2>0) { cout << "Корней нет" <<endl; getch(); exit(1); } do { ++n; x = (a+b)/2; y1 = a*a*a – 2*a*a – 3; y2 = x*x*x – 2*x*x – 3; if (y1*y2>0) a = x; else b = x; } while ((b – a)>eps); x = (a + b)/2; cout << "Корень уравнения на отрезке "<< l << ", " << r << "равен " << x << " и получен за " << n <<"шагов"; cout << endl; return 0; }
На оценку "3" нужно выполнить только свой вариант из 1 задания, на "4" и "5" – из 1 и 2 заданий. Варианты заданий Задание 1 Ввести с клавиатуры х и точность вычисления Eps. Вычислить с заданной точностью сумму
|