Главная  Длительная эволюция 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [ 43 ] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

Эти итерации легко реализуются с помощью функции

newtoniter[f ,xO ,n ] := Nest[(# - f[#]/f[#])&,N[xO],n],

где xq - начальная точка, а функция N применена к xq для того, чтобы проводить численные, а не символьные вычисления. Вычислим несколько приближений к корню полинома х - 2x + 5, расположенному вблизи -1.

5.3. Суперпозиция функций

Важнейшей компонентой функционального программирования является последовательное применение, или суперпозиция функций. Имеются две полезные встроенные функции Nest и Fold, которые автоматизируют написание суперпозиций одной и той же функции. Предположим, что нужно последовательно п раз применить функцию function к некоторому аргументу, затем к результату применения функции к аргументу и т.д. Такая ситуация возникает, например, в итерационных методах. Выражение Nest[function,x,n] при его вычислении выполнит эту последовательность действий.

Nest[cube,a,3]

а"

Nest[D[#,x]&, {х-2 -- ах + Ь)Е-х,25] £="{600 + 25а 4- 6 + 50а; + ах+ х}

В первом примере вычислено выражение cube[cube[cube[a]]], во втором найдена 25-я производная функции (а; + ах + Ь)е.

В методе касательных Ньютона для нахождения нуля функции f{x), находящегося вблизи от точки а, п-е приближение для искомого нуля находится по формуле

хо = а,

Хп - Хп-1



newtoniter[Function[{x},x3 - 2x2 + 5],-1,2] -1.243

newtoniter[Function[{x},x"3 - 2x2 + 5], -1,3] -1.2419

Чтобы оценить сходимость и не повторять вручную вычислений, отличающихся только количеством итераций, поступим следующим образом:

newtoniter[Function[{x} ,х"3-2х2--5],-1, #]&/@Range[5]

{-1.28571,-1.243,-1.2419,-1.2419,-1.2419}

Здесь по функции newtoniter определена анонимная функция аргумента, который указывает число итераций. Она применяется ко всем элементам списка Range[5] = {1,2,3,4,5}. Альтернативный способ основан на применении функции Table в виде

Table[newtoniter[Function[{x},x3-2x"2-f 5],-1,1], {i,5}].

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

Функция FixedPoint осуществляет итерации до тех пор, пока с мащинной точностью результат не перестанет изменяться. Перепищем с ее помощью функцию newtoniter:

newton[f ,xO ] := FixedPoint[(# - f[#]/f[#])&,N[xO]]

newton[Function[{x},x3 - 2x2 -f 5],-l]

-1.2419



Еще одна разновидность NestList функции Nest имеет результатом список, первым элементом которого является аргумент, вторым - результат применения итерируемой функции к аргументу и т.д.

newtonlist[f ,xO ,n ] := NestList[(# - f[#]/f[#])&, N[xO],n]

newtonlist[Function[{x},x"3 - 2x-2 4-5],-l,5] {-1., -1.28571,-1.243,-1.2419, -1.2419, -1.2419}

Пара функций Fold и FoldList является аналогом Nest и NestList применительно к функциям от двух аргументов. Выражение FoldList[f,x,{a,b,...}] порождает список {x,f[x,a],f[f[x,a],b],...}, а функция Fold от тех же аргументов имеет значением последний элемент этого списка. Рги;смотрим два примера. В первом определим функцию fact[n], вычисляющую п!:

fact[n ] := Fold[Times,l,Range[n]]

fact [5]

В качестве второго примера рассмотрим задачу: получить список производных функции х/{е -\-cosz) по переменной х, затем по а; и у, затем по г, у и г. Вот одно из возможных решений:

Rest[FoldList[D[#l,#2]&,x/(Ey + Cos[z]),{x,y,z}]]

Г 1 Г ЕУ \ f 2ЕУ81п[г] \ 1

\Ey + Cos[zY ~\Ey + Cos[z]) \{ЕУ-\-Со8[г]у)]

Если к аргументу х нужно применить последовательно функции с заголовками Л, /2 и т.д., то в некоторых случаях это удобно делать с помощью встроенной функции Composition.

Composition[Cos,Sqrt,N][Pi] -0.2000294



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [ 43 ] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

0.0008