КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Метод половинного деления
Методы уточнения корней После того как найден интервал, содержащий корень, применяют итерационные методы уточнения корня с заданной точностью. Метод половинного деления (другие названия: метод бисекций, метод дихотомии) для решения уравнения f (x) = 0 заключается в следующем [7, 9]. Пусть известно, что функция непрерывна и принимает на концах отрезка 1) Вычислим x = (a + b)/2; вычислим f (x); 2) Если f (x) = 0, то переходим к пункту 5; 3) Если f (x)∙ f (a) < 0, то b = x, иначе a = x; 4) Если | b – a | > ε, переходим к пункту 1; 5) Выводим значение x; 6) Конец. Пример 2.4. Уточнить методом бисекций с точностью до 0,01 корень уравнения (x – 1)3 = 0, принадлежащий отрезку [0,95; 1,1]. Решение в программе Excel: 1) В ячейках A 1: F 4 введем обозначения, начальные значения и формулы, как показано в таблице 2.3. 2) Каждую формулу скопируем в нижние ячейки маркером заполнения до десятой строки, т.е. B 4 — до B 10, C 4 — до C 10, D 3 — до D 10, E 4 — до E 10, F 3 — до F 10. Таблица 2.3
Результаты расчетов приведены в табл. 2.4. В столбце F проверяем значения длины интервала b – a. Если значение меньше чем 0,01, то в данной строке найдено приближенное значение корня с заданной погрешностью. Потребовалось 5 итераций для достижения требуемой точности. Приближенное значение корня с точностью до 0,01 после округления до трех знаков равно 1,0015625 ≈ 1,00. Таблица 2.4
Приведенный алгоритм учитывает возможный случай «попадания в корень», т.е. равенство f (x) нулю на очередном этапе. Если в примере 2.3 взять отрезок [0,9; 1,1], то на первом же шаге попадаем в корень x = 1. Действительно, запишем в ячейке B 3 значение 0,9. Тогда таблица результатов примет вид 2.5 (приведены только 2 итерации). Таблица 2.5
Создадим в программе Excel пользовательские функции f(x) и bisect(a, b, eps) для решения уравнения методом половинного деления, пользуясь встроенным языком Visual Basic. Их описания приведены ниже:
Function f(Byval x) f = (x - 1) ^ 3 End Function
Function bisect(a, b, eps) 1 x = (a + b) / 2 If f(x) = 0 Then GoTo 5 If f(x) * f(a) < 0 Then b = x Else a = x End If If Abs(a - b) > eps Then GoTo 1 5 bisect = x End Function
Функция f(x) определяет левую часть уравнения, а функция 1) Выполним команду меню «Сервис — Макрос — Редактор Visual Basic». Откроется окно «Microsoft Visual Basic». Если в данном файле программы Excel ещё не были созданы макросы или пользовательские функции или процедуры, это окно будет иметь вид, изображенный на рис.2.4.
Рис. 2.4.
2) Выполним команду меню «Insert — Module» и вводим тексты программ-функции, как показано на рис 2.5.
Рис.2.5.
Теперь в ячейках листа программы Excel можно в формулах использовать созданные функции. Например, введем в ячейку D 18 формулу
=bisect(0,95;1;0,00001),
то получим значение 0,999993896. Чтобы решить другое уравнение (с другой левой частью) нужно перейти в окно редактора с помощью команды «Сервис — Макрос — Редактор Visual Basic» и просто переписать описание функции f(x). Например, найдем с точностью до 0,001 корень уравнения sin5 x + x 2 – 1 = 0, принадлежащий интервалу (0,4; 0,5). Для этого изменим описание функции
Function f(x) f = (x - 1) ^ 3 End Function
на новое описание
Function f(x) f = Sin(5 * x) + x ^ 2 - 1 End Function
Тогда в ячейке D 18 получим значение 0,441009521 (сравните этот результат со значением корня из интервала (0,4; 0,5), найденным в примере 2.3!). Для решения уравнения методом половинного деления в программе Mathcad создадим подпрограмму-функцию bisec (f, a, b, ε), где: f — имя функции, соответствующее левой части уравнения f (x) = 0; a, b — левый и правый концы отрезка [ a, b ]; ε — точность приближенного значения корня. Решение примера в программе Mathcad: 1) Запускаем программу Mathcad. Введем определение функции bisec (f, a, b, ε). Для этого с помощью клавиатуры и панели инструментов «Греческие символы» набираем bisec (f, a, b, ε):=. После знака присваивания «:=» на панели инструментов «Программирование» указателем мыши щелкаем левой кнопкой «Add line». После знака присваивания появится вертикальная линия. Далее вводим текст программы, который приведен ниже, используя панель инструментов «Программирование» для ввода знака «←», оператора цикла while, оператора break и условного оператора if otherwise. 2) Введем определение функции f (x):=sin(5*x)+x^2–1, а затем вычислим значение корня с помощью функции bisec при заданных значениях: Ниже приведен лист Mathcad с определением функции bisec (f, a, b, ε) и расчетами:
Найденные значения корней согласуются с предыдущими результатами. Если мы определим функцию y (x) = (x – 1)3 и найдем корень в интервале (0,9; 1,1), то получим значение x = 1, так как в этом случае на первом шаге деления получается точное значение корня:
Приведем программу на языке C ++ для решения уравнения f (x) = 0 методом половинного деления:
#include <iostream.h> #include <math.h> double f(double x); typedef double (*PF)(double); double bisec(PF f,double a, double b,double eps); int main(){ double a, b, x, eps;PF pf; cout << "\n a = "; cin >> a; cout << "\n b = "; cin >> b; cout << "\n eps = "; cin >> eps; pf = f; x = bisec(pf,a,b,eps); cout << "\n x = " << x; cout << "\n Press any key & Enter "; cin >> a; return 0; } double f(double x){ double r; r = sin(5*x)+x*x-1; return r; } double bisec(PF f, double a, double b,double eps){ double x; do{ x = (a + b)/2; if (f(x) == 0) break; if (f(x)*f(a)<0) b = x; else a = x; }while (fabs(b-a) > eps); return x; }
В программе функция f (x) определена для решения уравнения sin5 x + x 2 – 1 = 0 из примера 2.3. Результат работы программы для определения корня из интервала (0,4; 0,5) с точностью 0,00001 представлен ниже (экран компьютера):
a = 0.4 b = 0.5 eps = 0.0001 x = 0.44101 Press any key & Enter
Последняя строка нужна для организации паузы для просмотра результата.
Дата добавления: 2015-04-25; Просмотров: 3403; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |