Метод простых итераций
Материал из MachineLearning.
Строка 19: | Строка 19: | ||
'''Следствие 2.''' Если уравнение <tex>x = g(x)</tex> имеет решение <tex>x_*</tex>, <tex>g(x)</tex> непрерывно дифференцируема на <tex>U_r(x_*)</tex> и <tex>|g'(x_*)|<1</tex>. Тогда существует <tex>\eps > 0</tex> такое, что на <tex>U_{\eps}(x_*)</tex> уравнение не имеет других решений и метод простой итерации сходится к решению при <tex>x_0 \in U_{\eps}(x_*)</tex><br> | '''Следствие 2.''' Если уравнение <tex>x = g(x)</tex> имеет решение <tex>x_*</tex>, <tex>g(x)</tex> непрерывно дифференцируема на <tex>U_r(x_*)</tex> и <tex>|g'(x_*)|<1</tex>. Тогда существует <tex>\eps > 0</tex> такое, что на <tex>U_{\eps}(x_*)</tex> уравнение не имеет других решений и метод простой итерации сходится к решению при <tex>x_0 \in U_{\eps}(x_*)</tex><br> | ||
==Метод релаксации== | ==Метод релаксации== | ||
- | Так как для сходимости метода очень важен выбор функции <tex>g(x)</tex>, ее обычно берут вида <tex>g(x)=x+s(x)f(x)</tex>. Где <tex>s(x)</tex> не меняет знака на отрезке, на котором ищется корень функции.<br> | + | Так как для сходимости метода очень важен выбор функции <tex>g(x)</tex>, ее обычно берут вида <center><tex>g(x)=x+s(x)f(x)</tex> <tex></tex>(1)</center>. |
+ | Где <tex>s(x)</tex> не меняет знака на отрезке, на котором ищется корень функции.<br> | ||
Положим <tex>s(x) = c = const </tex> и рассмотрим метод в этом случае.<br> | Положим <tex>s(x) = c = const </tex> и рассмотрим метод в этом случае.<br> | ||
Тогда получим метод 'релаксации': | Тогда получим метод 'релаксации': | ||
Строка 51: | Строка 52: | ||
<center><tex> x_{k+2}-x_{*} \approx aq^{k+2}</tex> </center> | <center><tex> x_{k+2}-x_{*} \approx aq^{k+2}</tex> </center> | ||
Где <tex> x_{k},x_{k+1},x_{k+2}</tex> нам известны (вычисленны по какому то линейному алгоритму),а <tex>a,q,x_*</tex> найдем из системы. Получим: | Где <tex> x_{k},x_{k+1},x_{k+2}</tex> нам известны (вычисленны по какому то линейному алгоритму),а <tex>a,q,x_*</tex> найдем из системы. Получим: | ||
- | <center><tex> x_{*} \approx x_{k+2} - \frac{(x_{k+2}-x_{k+1})^2}{x_{k+2}-2x_{k+1}+x_{k}}</tex> <tex>( | + | <center><tex> x_{*} \approx x_{k+2} - \frac{(x_{k+2}-x_{k+1})^2}{x_{k+2}-2x_{k+1}+x_{k}}</tex> <tex>(2)</tex></center> |
- | Метод ускорения сходимости заключается в том, что после вычисления 3 приближений по линейно сходящемуся алгоритму, вычисляется новое приближение по уточняющему правилу ( | + | Метод ускорения сходимости заключается в том, что после вычисления 3 приближений по линейно сходящемуся алгоритму, вычисляется новое приближение по уточняющему правилу (2).<br> |
Применительно к методу релаксации имеем: | Применительно к методу релаксации имеем: | ||
<center><tex> x_{*} \approx x_{k+2} - \frac{(x_{k+2}-x_{k+1})^2}{x_{k+2}-2x_{k+1}+x_{k}}</tex> </center><br> | <center><tex> x_{*} \approx x_{k+2} - \frac{(x_{k+2}-x_{k+1})^2}{x_{k+2}-2x_{k+1}+x_{k}}</tex> </center><br> | ||
Строка 70: | Строка 71: | ||
пример кода: | пример кода: | ||
PowerIterationMethod::PowerIterationParams *params = | PowerIterationMethod::PowerIterationParams *params = | ||
- | new PowerIterationMethod::PowerIterationParams (f1,s1, | + | new PowerIterationMethod::PowerIterationParams ( |
+ | f1 // Исходная функция | ||
+ | ,s1 // Функция s(x) в формусле (1) или константа в методе релаксации | ||
+ | ,1 // Начальное приближение | ||
+ | ,0 // Второе приближение для метода Вегстейна | ||
+ | ,0 // Допустимая погрешность решения | ||
+ | ,1000 // Максимальное количество итераций | ||
+ | ); | ||
PowerIterationMethod *method = new PowerIterationMethod (params); | PowerIterationMethod *method = new PowerIterationMethod (params); | ||
method->simpleIteration (); | method->simpleIteration (); |
Версия 15:48, 24 ноября 2008
Содержание |
Постановка задачи
Пусть есть функция .
Требуется найти корень этой функции: такой при котором
Решение необходимо найти численно, то есть для реализации на ЭВМ. Для решения этой задачи предлагается использовать метод простых итераций.
Метод простых итераций в общем виде
Заменим исходное уравнение на эквивалентное ,и будем строить итерации по правилу . Таким образом метод простой итерации - это одношаговый итерационный процесс. Для того, что бы начать данный процесс, необходимо знать начальное приближение . Выясним условия сходимости метода и выбор начального приближения.
Сходимость метода простых итераций
Метод сходится, если при последовательность {} имеет предел.
Обозначим окресность точки радиуса , то есть .
Теорема. Если липшиц-непрерывна с константой на , то есть выполняется
при этом если также выполнено
где - точное решение.
Из оценки видно, что метод линеен.
Пусть непрерывно дифференцируема на , тогда из теоремы вытекают следующие утверждения:
Следствие 1. Если для , выполнено , и , тогда уравнение имеет единственное решение на и метод простой итерации сходится к решению.
Следствие 2. Если уравнение имеет решение , непрерывно дифференцируема на и . Тогда существует такое, что на уравнение не имеет других решений и метод простой итерации сходится к решению при
Метод релаксации
Так как для сходимости метода очень важен выбор функции , ее обычно берут видаГде не меняет знака на отрезке, на котором ищется корень функции.
Положим и рассмотрим метод в этом случае.
Тогда получим метод 'релаксации':
для которого , и метод сходится при условии
Пусть в некоторой окресности корня выполняются условия
Тогда метод релаксации сходится при
Выбор параметра
Оценим погрешность метода релаксации
Применяя теорему о среднем получаем
Отсюда
Следовательно
Таким образом задача сводится к нахождению минимума функции
Из рассмотрения графика функции видно, что точка минимума определяется
и равна
Ускорение сходимости
Как следует из Теоремы, метод простых итераций линеен, то есть
Воспользуемся этим для оценки погрешности на каждой итерации. Запомним 3 последние итерации и выпишем их оценки:
Где нам известны (вычисленны по какому то линейному алгоритму),а найдем из системы. Получим:
Метод ускорения сходимости заключается в том, что после вычисления 3 приближений по линейно сходящемуся алгоритму, вычисляется новое приближение по уточняющему правилу (2).
Применительно к методу релаксации имеем:
Следовательно
Можно показать, что данный метод имеет уже квадратичную скорость сходимости.
Метод Вегстейна
Метод Вегстейна, вообще говоря, является модификацией метода секущих, однако его можно назвать и улучшенным методом простой итерации, преобразовав вычислительню формулу
к виду
Это двухшаговый метод, и для начала вычислений необходимо задать 2 приближения .
Программная реализация
Все методы были реализованы на языке C++. Доступ к методам осуществяется через класс
PowerIterationMethod
пример кода:
PowerIterationMethod::PowerIterationParams *params = new PowerIterationMethod::PowerIterationParams ( f1 // Исходная функция ,s1 // Функция s(x) в формусле (1) или константа в методе релаксации ,1 // Начальное приближение ,0 // Второе приближение для метода Вегстейна ,0 // Допустимая погрешность решения ,1000 // Максимальное количество итераций ); PowerIterationMethod *method = new PowerIterationMethod (params); method->simpleIteration (); printf ("%f\n",method->getResult ()); printf ("%f",method->getEps ());
Числовые примеры
Заключение
Ссылки
Список литературы
- А.А.Самарский, А.В.Гулин. Численные методы. Москва «Наука», 1989.
- Н.Н.Калиткин. Численные методы. Москва «Наука», 1978.