- •Лабораторная работа № 3
- •С использованием циклов
- •Теоретические сведения
- •Оператор цикла for
- •Оператор цикла do-while
- •Оператор цикла while
- •Вычисление значения с заданной точностью методом прямоугольников
- •Вычисление по формуле Симпсона путем деления отрезка[a,b] на множество более мелких отрезков
- •Методом простых итераций
- •Методом деления отрезка пополам
- •Контрольные вопросы
- •Задание 2
Методом деления отрезка пополам
Метод деления отрезка пополам заключается в следующем. Проверяется наличие корня на отрезке [a, b] (рис.3.7).

Рис.3.7. Метод деления отрезка пополам.
Для этого вычисляются значения функций 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.
Пример 3.7. Решение
уравнения
с заданной точностью= 0.01методом деления
отрезка пополам, если корень находится
на отрезке[1,3].
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
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; }
Контрольные вопросы
Каким образом цикл while может имитировать циклfor?
Каким образом цикл while может имитировать циклdo-while?
В каких случаях используются операторы break, continue, exit?
Почему в языке С++ нет необходимости использовать оператор goto?
Лабораторное задание
1. Для своего варианта cоставить схему алгоритма и программу вычисления суммы бесконечного ряда c точностью, значение которой ввести с клавиатуры задание 1.
2. Решить указанные в задании уравнения согласно номеру своего варианта двумя методами и сравнить эти методы по точности и количеству шагов.
3. В процессе выполнения лабораторного задания использовать средства отладки языка Borland C++.
Порядок выполнения лабораторной работы
1. При подготовке к лабораторной работе ознакомиться с данным описанием и составить три программы, указанные в лабораторном задании.
2. Подготовить файлы с программами вычисления суммы и решения уравнений и отладить их. Результаты показать преподавателю.
3. Оформить отчет.
Требования к отчету
Отчет должен содержать:
название и цель работы;
схему алгоритма;
краткие теоретические сведения;
текст программы для варианта задания, соответствующего номеру фамилии студента в группе (если студент закреплен за определенной ЭВМ, то номеру ЭВМ);
результаты выполнения программ.
Варианты заданий
Задание 1
Ввести с клавиатуры х и точность вычисления Eps. Вычислить с заданной точностью сумму
|
Номер варианта |
Задание |
|
1, 16 |
|
|
2, 17 |
|
|
3, 18 |
|
|
4, 19 |
|
|
5, 20 |
|
|
6, 21 |
|
|
7, 22 |
|
|
8, 23 |
|
|
Номер варианта |
Задание |
|
9, 24 |
|
|
10, 25 |
|
|
11, 26 |
|
|
12, 27 |
|
|
13, 28 |
|
|
14, 29 |
|
|
15, 30 |
|
