Дополнительные примеры работы с функциями
Приведем еще ряд примеров действия функций Apply, Map и Nest.
Ввод (In) | Вывод (Out) |
---|---|
Nest[f,x,3] | f [f[f [X]]] |
Apply[f,{a,b,c}] | f[a, b, c] |
s [x_,y_, z_]: =х+у+b | |
N[Apply[s,{l,2,a}]] | 3. + b |
Map[f,{a,b,c}] | {f [a], f [b], f [c] } |
N[Map[Exp, {1.2.3}]] | {2.71828, 7.38906, 20.0855} |
Map[f,1+2+c] | f[3] + f[c] |
m={{a,b},{c,d}} | {{a, b}, {c, d}} |
Map[f,m] | {f [{a, b}], f [{c, d}] } |
take2[list_]: = Take[list,2] | |
Map[take2,{{a,b,c},{c,a,b),{c,c,a}}] | {{a, b}, {c, a}, {c, c}} |
Большинство описанных операций для работы с функциями могут использоваться и при работе со списками. Порой это резко упрощает запись алгоритмов вычислений для данных, представленных списками, поскольку дает общее определение функций для произвольного числа их параметров. Примерами могут служить определения следующих статистических функций.
Вычисление среднего для элементов списка:
Mean[list_] :
=
Apply[Plus, list]
/
Length[list]
/
;
VectorQ[list] && Length[list]
>
0
General::spell!: Possible spelling error:
new
symbol name
"list"
is similar to existing symbol
"List"
.
Вычисление среднего геометрического для списка:
GeometricMean[list_] :
=
Apply
[Times, list"
4
(I
/
Length [list])]
/
;
VectorQ[list] && Length[list]
>
0
Вычисление гармонического среднего для списка:
HarmonicMean[list_] :
=
Length[list]
/
Apply[Plus, I
/
list]
/
;
VectorQ[list] && Length[list]
>
0
Обратите внимание на то, что при задании первой функции Mathematica предупреждает о том, что введенный идентификатор list подозрительно напоминает зарезервированный идентификатор List. Все приведенные выше функции не имеют смысла, если список пустой. Поэтому в них введен контроль за такой ситуацией.
Теперь можно выполнить расчеты по этим формулам.
Ввод (In) | Вывод (Out) |
---|---|
data={1.2.3.4} | {1, 2, 3, 4} |
Mean [data] | 5/2 |
GeometricMean [data] | 2 3/4 3 1/4 |
N[%] | 2.21336 |
HarmonicMean [data] | 48/25 |
Большое число операций для работы с функциями полезно при организации функционального программирования, а также при создании пакетов расширения системы для выполнения символьных преобразований и расчетов. Разумеется, это разумно делать профессионалам-математикам, а не обычным пользователям. Последних, скорее всего, более чем удовлетворит уже имеющийся в системе набор таких операций и функций.