
- •Содержание
- •Лекция № 1 понятие о численных методах. Решение нелинейных уравнений
- •Понятие о численных методах.
- •1.2 Решение нелинейных уравнений с одним неизвестным.
- •1.2.1. Отделение корня
- •1.2.2. Уточнение корня.
- •1.2.2.1 Метод деления отрезка пополам
- •Пример 1.1
- •1.2.2.2 Метод ньютона (метод касательных)
- •1.2.2.3 Метод итераций (простых)
- •Лекция №2 решение систем линейных алгебраических уравнений
- •2.1 Правило Крамера
- •2.2 Метод обратной матрицы.
- •2.3 Метод Гаусса
- •2.4 Итерационный метод гаусса – зейделя
- •Лекция 3. Интерполирование и аппроксимация функций
- •3.1 Линейная и квадратичная интерполяция
- •3.2 Интерполяция по лагранжу
- •3.3 Апроксимация многочленом по методу наименьших квадратов
- •Лекция № 4. Численное интегрирование
- •4.1 Метод прямоугольников
- •4.2 Метод трапеций
- •4.3 Метод симпсона
- •Если же подынтегральную функциюf(X)проинтерполировать полиномом Лагранжа 2-ойстепени (на отрезке [x0, x2] ):
- •4.4 Метод монте – карло
- •Лекция 5. Численное решение дифференциальных уравнений
- •5.1 Метод эйлера
- •5.2 Метод рунге—кутта
- •5.3 Метод прогноза и коррекции
- •Лекция 6. Методы оптимизации
- •6.1 Метод катящегося шарика
- •6.2 Метод золотого сечения
- •6.3 Метод градиентного спуска (уже для нескольких переменных)
- •6.4 Задача линейного программирования
- •Литература:
- •Вопросы к экзамену по численным методам.
1.2.2. Уточнение корня.
Уточнение корня может быть осуществлено тремя основными методами:
1.2.2.1 Метод деления отрезка пополам
Он состоит в следующем. Допустим, что мы нашли отрезок [a,b],на котором имеется кореньс уравненияF(x)=0, причем единственный. В качестве начального приближения корняс0берем середину этого отрезка, т.е.с0=(a+b)/2.Далее исследуем значения функцииF(x)на концах отрезков[a,c0]и[c0,b],т.е. в точкахa,c0,b.Тот из них, на концах которого функция принимает значения разных знаков, содержит искомый корень; поэтому его принимаем в качестве нового отрезка. Вторую половину отрезка[a,b],на котором знак функции не меняется, отбрасываем.
Пусть для определенности F(a)<0, F(b)>0(см.рис.3). В рассматриваемом случаеF(с0)<0, поэтому далее рассматриваем отрезок[c0,b].Следующее приближение:с1=(с0+b)/2. Далее отбрасываем отрезок[c1,b], посколькуF(c1)>0 иF(b)>0. Аналогично находим другие приближения:с2=(с0+с1)/2и т.д.
Процесс
уточнения корня продолжаем до тех пор,
пока значение функции F(x)в найденной точке не станет меньшим по
модулю некоторого заданного числаE,т.е.|F(cn)|<E.
Можно также оценивать длину полученного
отрезка: если она становится меньше
допустимой погрешности, то счет
прекращается.
F(b)
y=F(x)
a
c0
c2
b
x
c1
F(a)
Рис 3. Метод деления отрезка пополам
Этот итерационный процесс продолжается до тех пор, пока не будет достигнута требуемая точность; например
| f (cn) | < или | cn-1 — cn | <
Недостаток метода – медленная сходимость. Для достижения требуемой точности необходимо совершить N итераций :
N log 2 ((b—a)/)
Это означает, что для получения каждых трех верных значащих цифр необходимо совершить около 10 итераций.
Достоинство — сходится всегда, для любых непрерывных функций, в том числе и недифференцируемых.
Ниже представлена блок-схема алгоритма уточнения корня методом деления отрезка пополам. Здесь сужение отрезка производится путем замены границы aилиbна текущее значение корняc.
начало
ввод a,b,E
c:=(a + b)/2
Нет
Да
a
:= c F(a)•F(c)<0
b := c
Нет Да
|
F(c)|>E
вывод
c, F(c)
конец
Рис. 4. Блок-схема метода деления отрезка пополам
Реализуем теперь рассмотренный метод в виде программы на BorlandC++. При этом в программе предусмотрим сначала отделение корня, а затем и уточнение методом деления отрезка пополам.
Пример 1.1
Найти решения уравнения cos(x)– x2=0 на отрезке [-π/2,π/2]
// отделение корня и метод бисекций
#include <iostream>
#include <math>
float f(float x);
float kor(float a, float b, float e);
main()
{ float a,b,h,e,x1,x2,y1,y2,x; int k=0;
cout<<"\n вводи a,b,h,e "; cin>>a>>b>>h>>e;
x1=a;
m1: x2=x1+h; y1=f(x1);
if (x2<b) { y2=f(x2);
if (y1*y2<0) {x=kor(x1,x2,e); k++; cout<<"\n x["<<k<<"]="<<x;
cout<<" f(x)="<<f(x);}
x1=x2; } else goto mm1;
goto m1;
mm1: return 0;}
//функция – левая часть уравнения
float f(float x)
{ float fun=cos(x)-x*x; return fun;}
// функция, реализующая метод бисекций
float kor(float a, float b, float e)
{ float c;
m2: c=(a+b)/2; if (f(a)*f(c)<0) b=c; else a=c;
if (fabs(f(c))>e) goto m2; return c; }
В результате на заданном отрезке при h=0.1, E=0.00001 получим результаты: