Метод Ньютона
Нахождение корня функции
Пусть . Мы хотим найти корень , то есть такую точку , что
Скалярная функция многих переменных
Нахождение корня скалярной функции многих переменных
Пусть . Мы хотим найти корень , то есть такой вектор , что
Будем опять находить решение итеративно. Пусть — какое-то приближённое решение задачи, и мы хотим улучшить это решение. То есть мы хотим найти такое , чтобы .
По формуле Тейлора
Мы очень хотим выбрать такой шаг , чтобы . Используем предыдущую формулу
Теперь нам нужно выбрать вектор , по которому нужно двигаться. Учитывая, что градиент — направление наибыстрейшего подъема, кажется естественным выбрать вектор так, чтобы он был коллинеарен градиенту
Осталось решить уравнение . Получаем
Мы поняли, как выбирать шаг, для того чтобы двигаться к нулю все ближе. Результирующий алгоритм состоит всего из одной формулы
Напишем алгоритм в псевдокоде. Для этого нам нужно уметь вычислять функцию и её градиент .
function f(vector x) -> real: ...
function gradient(vector[real] x) -> vector[real]: ...
function solve_by_newton(f, gradient) -> real:
select x: real
while f(x) >= EPSILON:
x = f(x) / (norm(gradient(x)) ** 2) * gradient(x)
return xДалёкие от корня значения
Наш метод будет работать только если начальное значение уже близко к корню. Если это не так, то у нас точно возникнет большое количество проблем.
Вместо поиска корня можно найти минимум функции . В принципе, для этого можно использовать и другие алгоритмы, но мы посмотрим на алгоритм Ньютона.
Многомерные функции
Пусть — многомерная функция. Мы хотим научиться решать уравнение .
Действовать придётся итеративно, начиная с какого-то приближения .
Вспомним формулу для линеаризации, где — какой-то небольшой шаг:
Попробуем выбрать так, чтобы . Используем приближение
У нас получилась система линейных уравнений относительно . Решаем, находя обратную матрицу
Получается, для решения уравнения , нужно выполнять итеративный процесс, начиная с точки