Это не официальный сайт wikipedia.org 01.01.2023

Метод Ньютона — Википедия

Метод Ньютона

(перенаправлено с «Метод касательных»)

Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) — это итерационный численный метод нахождения корня (нуля) заданной функции. Метод был впервые предложен английским физиком, математиком и астрономом Исааком Ньютоном (16431727). Поиск решения осуществляется путём построения последовательных приближений и основан на принципах простой итерации. Метод обладает квадратичной сходимостью. Модификацией метода является метод хорд и касательных. Также метод Ньютона может быть использован для решения задач оптимизации, в которых требуется определить ноль первой производной либо градиента в случае многомерного пространства.

Описание методаПравить

ОбоснованиеПравить

Чтобы численно решить уравнение f ( x ) = 0   методом простой итерации, его необходимо привести к эквивалентному уравнению: x = φ ( x )  , где φ   — сжимающее отображение.

Для наилучшей сходимости метода в точке очередного приближения x   должно выполняться условие φ ( x ) = 0  . Решение данного уравнения ищут в виде φ ( x ) = x + α ( x ) f ( x )  , тогда:

φ ( x ) = 1 + α ( x ) f ( x ) + α ( x ) f ( x ) = 0.  

В предположении, что точка приближения «достаточно близка» к корню x ~   и что заданная функция непрерывна ( f ( x ) f ( x ~ ) = 0 )  , окончательная формула для α ( x )   такова:

α ( x ) = 1 f ( x ) .  

С учётом этого функция φ ( x )   определяется:

φ ( x ) = x f ( x ) f ( x ) .  

При некоторых условиях эта функция в окрестности корня осуществляет сжимающее отображение.

В этом случае алгоритм нахождения численного решения уравнения f ( x ) = 0   сводится к итерационной процедуре вычисления:

x n + 1 = x n f ( x n ) f ( x n ) .  

По теореме Банаха последовательность приближений стремится к корню уравнения f ( x ) = 0  .

 
Иллюстрация метода Ньютона (синим изображена функция f ( x )  , ноль которой необходимо найти, красным — касательная в точке очередного приближения x n  ). Здесь мы можем увидеть, что последующее приближение x n + 1   лучше предыдущего x n  .

Геометрическая интерпретацияПравить

Основная идея метода заключается в следующем: задаётся начальное приближение вблизи предположительного корня, после чего строится касательная к графику исследуемой функции в точке приближения, для которой находится пересечение с осью абсцисс. Эта точка берётся в качестве следующего приближения. И так далее, пока не будет достигнута необходимая точность.

Пусть 1) вещественнозначная функция f ( x ) : ( a , b ) R   непрерывно дифференцируема на интервале ( a , b )   ;
2) существует искомая точка x ( a , b )   : f ( x ) = 0   ;
3) существуют C > 0   и δ > 0   такие, что
| f ( x ) | C   для x ( a , x δ ] [ x + δ , b )  
и f ( x ) 0   для x ( x δ , x ) ( x , x + δ )   ;
4) точка x n ( a , b )   такова, что f ( x n ) 0   .
Тогда формула итеративного приближения x n   к x   может быть выведена из геометрического смысла касательной следующим образом:

f ( x n ) = t g α n = Δ y Δ x = f ( x n ) 0 x n x n + 1 = 0 f ( x n ) x n + 1 x n ,  

где α n   — угол наклона касательной прямой y ( x ) = f ( x n ) + ( x x n ) t g α n   к графику f   в точке ( x n ; f ( x n ) )   .

Следовательно (в уравнении касательной прямой полагаем y ( x n + 1 ) = 0  ) искомое выражение для x n + 1   имеет вид :

x n + 1 = x n f ( x n ) f ( x n ) .  

Если x n + 1 ( a , b )  , то это значение можно использовать в качестве следующего приближения к x   .

Если x n + 1 ( a , b )  , то имеет место «перелёт» (корень x   лежит рядом с границей ( a , b )  ). В этом случае надо (воспользовавшись идеей метода половинного деления) заменять x n + 1   на x n + x n + 1 2   до тех пор, пока точка «не вернётся» в область поиска ( a , b )   .

Замечания. 1) Наличие непрерывной производной даёт возможность строить непрерывно меняющуюся касательную на всей области поиска решения ( a , b )   .
2) Случаи граничного (в точке a   или в точке b  ) расположения искомого решения x   рассматриваются аналогичным образом.
3) С геометрической точки зрения равенство f ( x n ) = 0   означает, что касательная прямая к графику f   в точке ( x n ; f ( x n ) )   - параллельна оси O X   и при f ( x n ) 0   не пересекается с ней в конечной части.
4) Чем больше константа C > 0   и чем меньше константа δ > 0   из пункта 3 условий, тем для x n ( a , x δ ] [ x + δ , b )   пересечение касательной к графику f   и оси O X   ближе к точке ( x ; 0 )   , то есть тем ближе значение x n + 1   к искомой x ( a , b )   .

Итерационный процесс начинается с некоторого начального приближения x 0 ( a , b )   , причём между x 0 ( a , b )   и искомой точкой x ( a , b )   не должно быть других нулей функции f   , то есть «чем ближе x 0   к искомому корню x   , тем лучше». Если предположения о нахождении x   отсутствуют, методом проб и ошибок можно сузить область возможных значений, применив теорему о промежуточных значениях.

Для предварительно заданных ε x > 0   , ε f > 0   итерационный процесс завершается если | f ( x n ) f ( x n ) | | x n + 1 x n | < ε x   и | f ( x n + 1 ) | < ε f   .
В частности, для матрицы дисплея ε x   и ε f   могут быть рассчитаны, исходя из масштаба отображения графика f   , то есть если x n   и x n + 1   попадают в один вертикальный, а f ( x n )   и f ( x n + 1 )   в один горизонтальный ряд.

АлгоритмПравить

  1. Задается начальное приближение x 0  .
  2. Пока не выполнено условие остановки, в качестве которого можно взять | x n + 1 x n | < ε   или | f ( x n + 1 ) | < ε   (то есть погрешность в нужных пределах), вычисляют новое приближение: x n + 1 = x n f ( x n ) f ( x n )  .

ПримерПравить

Иллюстрация применения метода Ньютона к функции f ( x ) = cos x x 3   с начальным приближением в точке x 0 = 0 , 5  .
 
График последовательных приближений.
 
График сходимости.
Согласно способу практического определения скорость сходимости может быть оценена как тангенс угла наклона графика сходимости, то есть в данном случае равна двум.

Рассмотрим задачу о нахождении положительных x  , для которых cos x = x 3  . Эта задача может быть представлена как задача нахождения нуля функции f ( x ) = cos x x 3  . Имеем выражение для производной f ( x ) = sin x 3 x 2  . Так как cos x 1   для всех x   и x 3 > 1   для x > 1  , очевидно, что решение лежит между 0 и 1. Возьмём в качестве начального приближения значение x 0 = 0 , 5  , тогда:

x 1 = x 0 f ( x 0 ) f ( x 0 ) = 1,112 141 637 097 , x 2 = x 1 f ( x 1 ) f ( x 1 ) = 0 , _ 909 672 693 736 , x 3 = x 2 f ( x 2 ) f ( x 2 ) = 0 , 86 _ 7 263 818 209 , x 4 = x 3 f ( x 3 ) f ( x 3 ) = 0,865 47 _ 7 135 298 , x 5 = x 4 f ( x 4 ) f ( x 4 ) = 0,865 474 033 1 _ 11 , x 6 = x 5 f ( x 5 ) f ( x 5 ) = 0,865 474 033 102 _ .  

Подчёркиванием отмечены верные значащие цифры. Видно, что их количество от шага к шагу растёт (приблизительно удваиваясь с каждым шагом): от 1 к 2, от 2 к 5, от 5 к 10, иллюстрируя квадратичную скорость сходимости.


Условия примененияПравить

 
Иллюстрация расхождения метода Ньютона, применённого к функции f ( x ) = x 3 2 x + 2   с начальным приближением в точке x 0 = 0  .

Рассмотрим ряд примеров, указывающих на недостатки метода.

КонтрпримерыПравить

  • Если начальное приближение недостаточно близко к решению, то метод может не сойтись.

Пусть

f ( x ) = x 3 2 x + 2.  

Тогда

x n + 1 = x n x n 3 2 x n + 2 3 x n 2 2 .  

Возьмём ноль в качестве начального приближения. Первая итерация даст в качестве приближения единицу. В свою очередь, вторая снова даст ноль. Метод зациклится и решение не будет найдено. В общем случае построение последовательности приближений может быть очень запутанным.

 
График производной функции f ( x ) = x + x 2 sin ( 2 / x )   при приближении x   к нулю справа.

Рассмотрим функцию:

f ( x ) = { 0 , x = 0 , x + x 2 sin ( 2 x ) , x 0.  

Тогда f ( 0 ) = 1   и f ( x ) = 1 + 2 x sin ( 2 / x ) 2 cos ( 2 / x )   всюду, кроме 0.

В окрестности корня производная меняет знак при приближении x   к нулю справа или слева. В то время, как f ( x ) x x 2 > 0   для 0 < x < 1  .

Таким образом f ( x ) / f ( x )   не ограничено вблизи корня, и метод будет расходиться, хотя функция всюду дифференцируема, её производная не равна нулю в корне, f   бесконечно дифференцируема везде, кроме как в корне, а её производная ограничена в окрестности корня.

Рассмотрим пример:

f ( x ) = x + x 4 / 3 .  

Тогда f ( x ) = 1 + ( 4 / 3 ) x 1 / 3   и f ( x ) = ( 4 / 9 ) x 2 / 3   за исключением x = 0  , где она не определена.

На очередном шаге имеем x n  :

x n + 1 = x n f ( x n ) f ( x n ) = ( 1 / 3 ) x n 4 / 3 ( 1 + ( 4 / 3 ) x n 1 / 3 ) .  

Скорость сходимости полученной последовательности составляет приблизительно 4/3. Это существенно меньше, нежели 2, необходимое для квадратичной сходимости, поэтому в данном случае можно говорить лишь о линейной сходимости, хотя функция всюду непрерывно дифференцируема, производная в корне не равна нулю, и f   бесконечно дифференцируема везде, кроме как в корне.

  • Если производная в точке корня равна нулю, то скорость сходимости не будет квадратичной, а сам метод может преждевременно прекратить поиск, и дать неверное для заданной точности приближение.

Пусть

f ( x ) = x 2 .  

Тогда f ( x ) = 2 x   и следовательно x f ( x ) / f ( x ) = x / 2  . Таким образом сходимость метода не квадратичная, а линейная, хотя функция всюду бесконечно дифференцируема.

ОграниченияПравить

Пусть задано уравнение f ( x ) = 0  , где f ( x ) : X R   и надо найти его решение.

Ниже приведена формулировка основной теоремы, которая позволяет дать чёткие условия применимости. Она носит имя советского математика и экономиста Леонида Витальевича Канторовича (19121986).

Теорема Канторовича.

Если существуют такие константы A , B , C  , что:

  1. 1 | f ( x ) | < A   на [ a , b ]  , то есть f ( x )   существует и не равна нулю;
  2. | f ( x ) f ( x ) | < B   на [ a , b ]  , то есть f ( x )   ограничена;
  3. f ( x )   на [ a , b ]  , и | f ( x ) | C 1 2 A B  ;

Причём длина рассматриваемого отрезка | a b | < 1 A B ( 1 1 2 A B C )  . Тогда справедливы следующие утверждения:

  1. на [ a , b ]   существует корень x   уравнения f ( x ) = 0 : x [ a , b ] : f ( x ) = 0  ;
  2. если x 0 = a + b 2  , то итерационная последовательность сходится к этому корню: { x n + 1 = x n f ( x n ) f ( x n ) } x  ;
  3. погрешность может быть оценена по формуле | x x n | B 2 n 1 ( 2 A B C ) 2 n 1  .

Из последнего из утверждений теоремы в частности следует квадратичная сходимость метода:

| x x n | B 2 n 1 ( 2 A B C ) 2 n 1 = 1 2 B 2 n 2 ( ( 2 A B C ) 2 n 2 ) 2 = α | x x n 1 | 2 .  

Тогда ограничения на исходную функцию f ( x )   будут выглядеть так:

  1. функция должна быть ограничена;
  2. функция должна быть гладкой, дважды дифференцируемой;
  3. её первая производная f ( x )   равномерно отделена от нуля;
  4. её вторая производная f ( x )   должна быть равномерно ограничена.

Историческая справкаПравить

Метод был описан Исааком Ньютоном в рукописи «Об анализе уравнениями бесконечных рядов» (лат. «De analysi per aequationes numero terminorum infinitas»), адресованной в 1669 году Барроу, и в работе «Метод флюксий и бесконечные ряды» (лат. «De metodis fluxionum et serierum infinitarum») или «Аналитическая геометрия» (лат. «Geometria analytica») в собраниях трудов Ньютона, которая была написана в 1671 году. В своих работах Ньютон вводит такие понятия, как разложение функции в ряд, бесконечно малые и флюксии (производные в нынешнем понимании). Указанные работы были изданы значительно позднее: первая вышла в свет в 1711 году благодаря Уильяму Джонсону, вторая была издана Джоном Кользоном в 1736 году уже после смерти создателя. Однако описание метода существенно отличалось от его нынешнего изложения: Ньютон применял свой метод исключительно к полиномам. Он вычислял не последовательные приближения x n  , а последовательность полиномов и в результате получал приближённое решение x  .

Впервые метод был опубликован в трактате «Алгебра» Джона Валлиса в 1685 году, по просьбе которого он был кратко описан самим Ньютоном. В 1690 году Джозеф Рафсон опубликовал упрощённое описание в работе «Общий анализ уравнений» (лат. «Analysis aequationum universalis»). Рафсон рассматривал метод Ньютона как чисто алгебраический и ограничил его применение полиномами, однако при этом он описал метод на основе последовательных приближений x n   вместо более трудной для понимания последовательности полиномов, использованной Ньютоном. Наконец, в 1740 году метод Ньютона был описан Томасом Симпсоном как итеративный метод первого порядка решения нелинейных уравнений с использованием производной в том виде, в котором он излагается здесь. В той же публикации Симпсон обобщил метод на случай системы из двух уравнений и отметил, что метод Ньютона также может быть применён для решения задач оптимизации путём нахождения нуля производной или градиента.

В 1879 году Артур Кэли в работе «Проблема комплексных чисел Ньютона — Фурье» (англ. «The Newton-Fourier imaginary problem») был первым, кто отметил трудности в обобщении метода Ньютона на случай мнимых корней полиномов степени выше второй и комплексных начальных приближений. Эта работа открыла путь к изучению теории фракталов.

Обобщения и модификацииПравить

 
Иллюстрация последовательных приближений метода одной касательной, применённого к функции f ( x ) = e x 2   с начальным приближением в точке x 0 = 1 , 8  .

Метод секущихПравить

Родственный метод секущих является «приближённым» методом Ньютона и позволяет не вычислять производную. Значение производной в итерационной формуле заменяется её оценкой по двум предыдущим точкам итераций:

f ( x n ) f ( x n ) f ( x n 1 ) x n x n 1   .

Таким образом, основная формула имеет вид

x n + 1 = x n f ( x n ) x n x n 1 f ( x n ) f ( x n 1 ) .  

Этот метод схож с методом Ньютона, но имеет немного меньшую скорость сходимости. Порядок сходимости метода равен золотому сечению — 1,618…

Замечания. 1) Для начала итерационного процесса требуются два различных значения x 0   и x 1   .
2) В отличие от «настоящего метода Ньютона» (метода касательных), требующего хранить только x n   (и в ходе вычислений — временно f ( x n )   и f ( x n )  ), для метода секущих требуется сохранение x n 1   , x n   , f ( x n 1 )   , f ( x n )   .
3) Применяется, если вычисление f ( x )   затруднено (например, требует большого количества машинных ресурсов: времени и/или памяти).

Метод одной касательнойПравить

В целях уменьшения числа обращений к значениям производной функции применяют так называемый метод одной касательной.

Формула итераций этого метода имеет вид:

x n + 1 = x n 1 f ( x 0 ) f ( x n ) .  

Суть метода заключается в том, чтобы вычислять производную лишь один раз, в точке начального приближения x 0  , а затем использовать это значение на каждой последующей итерации:

α ( x ) = α 0 = 1 f ( x 0 ) .  

При таком выборе α 0   в точке x 0   выполнено равенство:

φ ( x 0 ) = 1 + α 0 f ( x 0 ) = 0 ,  

и если отрезок, на котором предполагается наличие корня x   и выбрано начальное приближение x 0  , достаточно мал, а производная φ ( x )   непрерывна, то значение φ ( x )   будет не сильно отличаться от φ ( x 0 ) = 0   и, следовательно, график y = φ ( x )   пройдёт почти горизонтально, пересекая прямую y = x  , что в свою очередь обеспечит быструю сходимость последовательности точек приближений к корню.

Этот метод является частным случаем метода простой итерации. Он имеет линейный порядок сходимости.

Многомерный случайПравить

Обобщим полученный результат на многомерный случай.

Пусть необходимо найти решение системы:

{ f 1 ( x 1 , x 2 , , x n ) = 0 , f m ( x 1 , x 2 , , x n ) = 0.  

Выбирая некоторое начальное значение x [ 0 ]  , последовательные приближения x [ j + 1 ]   находят путём решения систем уравнений:

f i + k = 1 n f i x k ( x k [ j + 1 ] x k [ j ] ) = 0 , i = 1 , 2 , , m ,  

где x [ j ] = ( x 1 [ j ] , x 2 [ j ] , , x n [ j ] ) , j = 0 , 1 , 2 ,  .


Применительно к задачам оптимизацииПравить

Пусть необходимо найти минимум функции многих переменных f ( x ) : R n R  . Эта задача равносильна задаче нахождения нуля градиента f ( x )  . Применим изложенный выше метод Ньютона:

f ( x [ j ] ) + H ( x [ j ] ) ( x [ j + 1 ] x [ j ] ) = 0 , j = 1 , 2 , , n ,  

где H ( x )   — гессиан функции f ( x )  .

В более удобном итеративном виде это выражение выглядит так:

x [ j + 1 ] = x [ j ] H 1 ( x [ j ] ) f ( x [ j ] ) .  

Следует отметить, что в случае квадратичной функции метод Ньютона находит экстремум за одну итерацию.

Нахождение матрицы Гессе связано с большими вычислительными затратами, и зачастую не представляется возможным. В таких случаях альтернативой могут служить квазиньютоновские методы, в которых приближение матрицы Гессе строится в процессе накопления информации о кривизне функции.

Метод Ньютона — РафсонаПравить

Метод Ньютона — Рафсона является улучшением метода Ньютона нахождения экстремума, описанного выше. Основное отличие заключается в том, что на очередной итерации каким-либо из методов одномерной оптимизации выбирается оптимальный шаг:

x [ j + 1 ] = x [ j ] λ j H 1 ( x [ j ] ) f ( x [ j ] ) ,  

где λ j = arg min λ f ( x [ j ] λ H 1 ( x [ j ] ) f ( x [ j ] ) ) .   Для оптимизации вычислений применяют следующее улучшение: вместо того, чтобы на каждой итерации заново вычислять гессиан целевой функции, ограничиваются начальным приближением H ( f ( x [ 0 ] ) )   и обновляют его лишь раз в m   шагов, либо не обновляют вовсе.

Применительно к задачам о наименьших квадратахПравить

На практике часто встречаются задачи, в которых требуется произвести настройку свободных параметров объекта или подогнать математическую модель под реальные данные. В этих случаях появляются задачи о наименьших квадратах:

F ( x ) = f ( x ) = i = 1 m f i 2 ( x ) = i = 1 m ( φ i ( x ) F i ) 2 min .  

Эти задачи отличаются особым видом градиента и матрицы Гессе:

F ( x ) = 2 J T ( x ) f ( x ) ,  
H ( x ) = 2 J T ( x ) J ( x ) + 2 Q ( x ) , Q ( x ) = i = 1 m f i ( x ) H i ( x ) ,  

где J ( x )   — матрица Якоби вектор-функции f ( x )  , H i ( x )   — матрица Гессе для её компоненты f i ( x )  .

Тогда очередной шаг p   определяется из системы:

[ J T ( x ) J ( x ) + i = 1 m f i ( x ) H i ( x ) ] p = J T ( x ) f ( x ) .  

Метод Гаусса — НьютонаПравить

Метод Гаусса — Ньютона строится на предположении о том, что слагаемое J T ( x ) J ( x )   доминирует над Q ( x )  . Это требование не соблюдается, если минимальные невязки велики, то есть если норма f ( x )   сравнима с максимальным собственным значением матрицы J T ( x ) J ( x )  . В противном случае можно записать:

J T ( x ) J ( x ) p = J T ( x ) f ( x ) .  

Таким образом, когда норма Q ( x )   близка к нулю, а матрица J ( x )   имеет полный столбцевой ранг, шаг p   мало отличается от ньютоновского (с учётом Q ( x )  ), и метод может достигать квадратичной скорости сходимости, хотя вторые производные и не учитываются. Улучшением метода является алгоритм Левенберга — Марквардта, основанный на эвристических соображениях.

Обобщение на комплексную плоскостьПравить

 
Бассейны Ньютона для полинома пятой степени p ( x ) = x 5 1  . Разными цветами закрашены области притяжения для разных корней. Более тёмные области соответствуют большему числу итераций.

До сих пор в описании метода использовались функции, осуществляющие отображения в пределах множества вещественных значений. Однако метод может быть применён и для нахождения нуля функции комплексной переменной. При этом процедура остаётся неизменной:

z n + 1 = z n f ( z n ) f ( z n ) .  

Особый интерес представляет выбор начального приближения z 0  . Ввиду того, что функция может иметь несколько нулей, в различных случаях метод может сходиться к различным значениям, и вполне естественно возникает желание выяснить, какие области обеспечат сходимость к тому или иному корню. Этот вопрос заинтересовал Артура Кэли ещё в 1879 году, однако разрешить его смогли лишь в 70-х годах двадцатого столетия с появлением вычислительной техники. Оказалось, что на пересечениях этих областей (их принято называть областями притяжения) образуются так называемые фракталы — бесконечные самоподобные геометрические фигуры.

Ввиду того, что Ньютон применял свой метод исключительно к полиномам, фракталы, образованные в результате такого применения, обрели название фракталов Ньютона или бассейнов Ньютона.

РеализацияПравить

ScalaПравить

object NewtonMethod {

  val accuracy = 1e-6

  @tailrec
  def method(x0: Double, f: Double => Double, dfdx: Double => Double, e: Double): Double = {
    val x1 = x0 - f(x0) / dfdx(x0)
    if (abs(x1 - x0) < e) x1
    else method(x1, f, dfdx, e)
  }

  def g(C: Double) = (x: Double) => x*x - C

  def dgdx(x: Double) = 2*x

  def sqrt(x: Double) = x match {
    case 0 => 0
    case x if (x < 0) => Double.NaN
    case x if (x > 0) => method(x/2, g(x), dgdx, accuracy) 
  }
}

PythonПравить

from math import sin, cos
from typing import Callable
import unittest


def newton(f: Callable[[float], float], f_prime: Callable[[float], float], x0: float, 
	eps: float=1e-7, kmax: int=1e3) -> float:
	"""
	solves f(x) = 0 by Newton's method with precision eps
	:param f: f
	:param f_prime: f'
	:param x0: starting point
	:param eps: precision wanted
	:return: root of f(x) = 0
	"""
	x, x_prev, i = x0, x0 + 2 * eps, 0
	
	while abs(x - x_prev) >= eps and i < kmax:
		x, x_prev, i = x - f(x) / f_prime(x), x, i + 1

	return x


class TestNewton(unittest.TestCase):
	def test_0(self):
		def f(x: float) -> float:
			return x**2 - 20 * sin(x)


		def f_prime(x: float) -> float:
			return 2 * x - 20 * cos(x)


		x0, x_star = 2, 2.7529466338187049383

		self.assertAlmostEqual(newton(f, f_prime, x0), x_star)


if __name__ == '__main__':
	unittest.main()

PHPПравить

<?php
// PHP 5.4
function newtons_method(
	$a = -1, $b = 1, 
	$f = function($x) {
	
		return pow($x, 4) - 1;
	
	},
	$derivative_f = function($x) {

		return 4 * pow($x, 3);
	
	}, $eps = 1E-3) {

        $xa = $a;
        $xb = $b;

        $iteration = 0;

        while (abs($xb) > $eps) {

            $p1 = $f($xa);
            $q1 = $derivative_f($xa);
            $xa -= $p1 / $q1;
            $xb = $p1;
            ++$iteration;

        }

        return $xa;

}

OctaveПравить

function res = nt()
  eps = 1e-7;
  x0_1 = [-0.5,0.5];
  max_iter = 500;
  xopt = new(@resh, eps, max_iter);   
  xopt
endfunction
function a = new(f, eps, max_iter)
  x=-1;
  p0=1;
  i=0;
 while (abs(p0)>=eps)
    [p1,q1]=f(x);
    x=x-p1/q1;
   p0=p1;
   i=i+1;
 end
 i
 a=x;
endfunction
function[p,q]= resh(x)   % p= -5*x.^5+4*x.^4-12*x.^3+11*x.^2-2*x+1;
   p=-25*x.^4+16*x.^3-36*x.^2+22*x-2;
   q=-100*x.^3+48*x.^2-72*x+22;
endfunction

DelphiПравить

// вычисляемая функция
function fx(x: Double): Double;
begin
  Result := x * x - 17;
end;

// производная функция от f(x)
function dfx(x: Double): Double;
begin
  Result := 2 * x;
end;

function solve(fx, dfx: TFunc<Double, Double>; x0: Double): Double;
const
  eps = 0.000001;
var
  x1: Double;
begin
  x1 := x0 - fx(x0) / dfx(x0); // первое приближение
  while (Abs(x1-x0) > eps) do begin // пока не достигнута точность 0.000001
    x0 := x1;
    x1 := x1 - fx(x1) / dfx(x1); // последующие приближения
  end;
  Result := x1;
end;

// Вызов
solve(fx, dfx,4));

С++Править

#include <stdio.h>
#include <math.h>

#define eps 0.000001
double fx(double x) { return x * x - 17;} // вычисляемая функция
double dfx(double x) { return 2 * x;} // производная функции

typedef double(*function)(double x); // задание типа function

double solve(function fx, function dfx, double x0) {
  double x1  = x0 - fx(x0) / dfx(x0); // первое приближение
  while (fabs(x1 - x0) > eps) { // пока не достигнута точность 0.000001
    x0 = x1;
    x1 = x0 - fx(x0) / dfx(x0); // последующие приближения
  }
  return x1;
}

int main () {
  printf("%f\n", solve(fx, dfx, 4)); // вывод на экран
  return 0;
}

CПравить

typedef double (*function)(double x);

double TangentsMethod(function f, function df, double xn, double eps) {
   double x1  = xn - f(xn)/df(xn);
   double x0 = xn;
   while(abs(x0-x1) > eps) {
      x0 = x1;
      x1 = x1 - f(x1)/df(x1);
   }
   return x1;
}

//Выбор начального приближения
xn = MyFunction(A)*My2Derivative(A) > 0 ? B : A;

double MyFunction(double x) { return (pow(x, 5) - x - 0.2); } //Ваша функция
double MyDerivative(double x) { return (5*pow(x, 4) - 1); } //Первая производная
double My2Derivative(double x) { return (20*pow(x, 3)); } //Вторая производная

//Пример вызова функции
double x = TangentsMethod(MyFunction, MyDerivative, xn, 0.1)

HaskellПравить

import Data.List ( iterate' )

main :: IO ()
main = print $ solve (\ x -> x * x - 17) ( * 2) 4

-- Функция solve универсальна для всех вещественных типов значения которых можно сравнивать.
solve = esolve 0.000001

esolve epsilon func deriv x0 = fst . head $ dropWhile pred pairs
  where
    pred (xn, xn1) = (abs $ xn - xn1) > epsilon -- Функция pred определяет достигнута ли необходимая точность.
    next xn = xn - func xn / deriv xn -- Функция next вычисляет новое приближение.
    iters   = iterate' next x0        -- Бесконечный список итераций.
    pairs   = zip iters (tail iters)  -- Бесконечный список пар итераций вида: [(x0, x1), (x1, x2) ..].

ЛитератураПравить

  • Акулич И. Л. Математическое программирование в примерах и задачах : Учеб. пособие для студентов эконом. спец. вузов. — М. : Высшая школа, 1986. — 319 с. : ил. — ББК 22.1 А44. — УДК 517.8(G).
  • Амосов А. А., Дубинский Ю. А., Копченова Н. П. Вычислительные методы для инженеров : Учеб. пособие. — М. : Высшая школа, 1994. — 544 с. : ил. — ББК 32.97 А62. — УДК 683.1(G). — ISBN 5-06-000625-5.
  • Бахвалов Н. С., Жидков Н. П., Кобельков Г. Г. Численные методы. — 8-е изд. — М. : Лаборатория Базовых Знаний, 2000.
  • Вавилов С. И. Исаак Ньютон. — М. : Изд. АН СССР, 1945.
  • Волков Е. А. Численные методы. — М. : Физматлит, 2003.
  • Гилл Ф., Мюррей У., Райт М. Практическая оптимизация. Пер. с англ. — М. : Мир, 1985.
  • Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. — М. : Наука, 1970. — С. 575—576.
  • Коршунов Ю. М., Коршунов Ю. М. Математические основы кибернетики. — Энергоатомиздат, 1972.
  • Максимов Ю. А.,Филлиповская Е. А. Алгоритмы решения задач нелинейного программирования. — М. : МИФИ, 1982.
  • Морозов А. Д. Введение в теорию фракталов. — МИФИ, 2002.

См. такжеПравить

СсылкиПравить