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

[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]

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

Map[cube,{a,b,3}]

MapThread[poly, {{x,y,z}, {u, v, w}}] {bu + ax, bv 4- aybw + az}

5.2. Чистые и анонимные функции

В предыдущем разделе определяемые пользователем функции снабжались заголовками, и в этом смысле их можно назвать именованными функциями. Последние имеет смысл определять, если эти функции будут использованы в дальнейшем в программе или в течение сеанса интерактивной работы. В случае, когда новая функция возникает по ходу дела и нет оснований ожидать, что она вновь потребуется, полезно работать с так называемыми чистыми функциями, которые используются только в момент их создания. Для определения чистых функций служит встроенная функция Function. Вот как можно другим способом определить функцию cube: это будет Function[{x},x"3]. В этом определении х - локальная переменная, которую вполне можно заменить на у, z или любой другой символ, поэтому значения глобального символа х не влияют на определяемую чистую функцию. Применение чистой функции к аргументу происходит стандартным образом:

{Function[{x},x-3][2],Function[{x},x-3][y],

Function[{x},x3][x]}

{8,yxЗ}

Map[Function[{x},x3]], {а, b}]



Чистую функцию легко превратить в именованную: для этого достаточно сделать присвоение символу, который в дальнейшем будет служить ее именем.

newcube = Function[{x},x3]

Function[{x},x]

newcube[y]

Подводя итоги, отметим, что Function позволяет по любому выражению ехрг определить чистую функцию Function[{x, у,.. .},ехрг] или именованную функцию f = Function[{x,y,...}, ехрг] переменных г, у, а также из именованной функции сделать чистую F[{x,y,...},f[x,y,...]]. В силу того что символы в скобках в Function локальны, выражение ехрг должно быть впечатано в момент написания чистой функции. К функциям, определяемым с помощью отложенных присвоений, это замечание не относится.

Существует более компактная и удобная форма представления чистой функции, которую иногда называют анонимной функцией. В анонимных функциях вместо связанных переменных используются специальные выражения „Математики" с заголовком Slot, имеющие вид #, #1 и т.д. При этом для функций одной переменной используется #, а в функциях нескольких переменных первый аргумент обозначается #1, второй #2 и т.д. Кроме того, в конце анонимной функции ставится знак &. Функция newcube, переписанная в форме анонимной функции, выглядит как #3&. Анонимные функции позволяют давать очень элегантные определения функций. Рассмотрим в качестве примера функцию Jacob, которая по заданным п функциям Л, /г, /п от 71 переменных ii, 12, Хп вычисляет их якобиан: \\dfi/dxj\\.

jacob[f ,x ] := Outer[D[#l,#2]&,f,x]



В ЭТОМ определении под / понимается список функций, а под I - список независимых переменных, являющихся аргументами функций из списка /. В анонимной функции D[#l,#2]& при ее вычислении на место первого аргумента #1 подставляется функция, на место второго аргумента #2 - независимая переменная в соответствии с определением функции Outer.

jacob[{f[x,y],g[x,y]},{x,y}] MatrixForm

Анонимные функции очень удобны для работы с функциями Sort и Select. Функция Sort имеет второй, необязательный аргумент, задающий критерий сортировки. Если этот аргумент не указан, то используется встроенный порядок. Второй аргумент обязан быть двухместным предикатом, и сортировка производится так, чтобы он принимал значение True на любой паре последовательных элементов списка. Рассмотрим в качестве примера список

1 = {5,3,7,1,8,9,2,4};

и упорядочим его так, чтобы квадрат предшествующего элемента был строго больше последующего. Соответствующий предикат задается анонимной функцией #1"2 > #2&, поэтому искомая сортировка выполняется с помощью выражения

Sort[l,#l-2 >#2&] {5,3,7,8,9,4,2,1}

Теперь поставим задачу: выбрать из списка 1 те элементы, квадратные корни которых меньше 2.5.

Select[l,N[Sqrt[#]] < 2.5&]

{5.3,1,4,2}



[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.0009