Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / C++ / C++ / 03_циклы_a5.doc
Скачиваний:
50
Добавлен:
17.04.2013
Размер:
257.02 Кб
Скачать

Методом деления отрезка пополам

Метод деления отрезка пополам заключается в следующем. Проверяется наличие корня на отрезке [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; }

Контрольные вопросы

  1. Каким образом цикл while может имитировать циклfor?

  2. Каким образом цикл while может имитировать циклdo-while?

  3. В каких случаях используются операторы break, continue, exit?

  4. Почему в языке С++ нет необходимости использовать оператор goto?

Лабораторное задание

1. Для своего варианта cоставить схему алгоритма и программу вычисления суммы бесконечного ряда c точностью, значение которой ввести с клавиатуры задание 1.

2. Решить указанные в задании уравнения согласно номеру своего варианта двумя методами и сравнить эти методы по точности и количеству шагов.

3. В процессе выполнения лабораторного задания использовать средства отладки языка Borland C++.

Порядок выполнения лабораторной работы

1. При подготовке к лабораторной работе ознакомиться с данным описанием и составить три программы, указанные в лабораторном задании.

2. Подготовить файлы с программами вычисления суммы и решения уравнений и отладить их. Результаты показать преподавателю.

3. Оформить отчет.

Требования к отчету

Отчет должен содержать:

  1. название и цель работы;

  2. схему алгоритма;

  3. краткие теоретические сведения;

  4. текст программы для варианта задания, соответствующего номеру фамилии студента в группе (если студент закреплен за определенной ЭВМ, то номеру ЭВМ);

  5. результаты выполнения программ.

Варианты заданий

Задание 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

Соседние файлы в папке C++