功能性操作

函数名作为表达式
用这样的表达(f)[x],“函数名”(f)本身就是一个表达式,您可以像对待任何其他表达式一样对待它。
可以使用转换规则替换函数名称:
您所做的任何赋值都用于函数名:
它定义了一个以函数名作为参数的函数:
这给了日志作为要使用的函数名:
像对待其他类型的表达式一样处理函数名称的能力是Wolfram语言符号性质的一个重要结果。它使整个范围的功能性操作.
普通Wolfram语言功能,如日志整合通常对数字和代数表达式等数据进行操作。然而,表示函数操作的Wolfram语言函数不仅可以对普通数据进行操作,还可以对函数本身进行操作。因此,例如,功能操作逆函数采用Wolfram Language函数名作为参数,并表示该函数的逆函数。
逆函数是一个函数操作:它接受Wolfram Language函数作为参数,并返回另一个表示其逆函数的函数:
结果来自逆函数是一个可以应用于数据的函数:
您还可以使用逆函数以纯粹象征性的方式:
Wolfram语言中有多种函数操作。一些表示数学运算;其他代表各种程序和算法。
除非您熟悉高级符号语言,否则您可能无法识别所讨论的大多数函数操作。起初,操作似乎很难理解。但值得坚持。函数操作提供了使用Wolfram语言的一种概念上和实践上最有效的方法。
重复应用功能
您编写的许多程序将涉及需要多次迭代的操作。嵌套嵌套列表是实现这一点的强大构造。
嵌套[(f),x,n个]
应用函数(f)嵌套的n个次到x
嵌套列表[(f),x,n个]
生成列表{x,(f)[x],(f)[(f)[x]],},哪里(f)最多嵌套到n个深的
重复应用一个参数的函数。
嵌套[(f),x,n个]取“名字”(f)函数,并应用该函数n个次到x:
这会列出每个连续嵌套:
下面是一个简单的函数:
您可以使用嵌套:
嵌套嵌套列表允许您固定次数地应用函数。通常,您可能希望应用函数,直到结果不再更改。您可以使用固定点固定点列表.
固定点[(f),x]
应用函数(f)重复,直到结果不再改变
固定点列表[(f),x]
生成列表{x,(f)[x],(f)[(f)[x]],},当元素不再更改时停止
应用函数,直到结果不再更改。
这是一个以牛顿为单位的函数s近似值:
以下是该函数的五次连续迭代,从:
使用函数固定点,您可以自动继续申请牛顿3直到结果不再改变:
以下是结果的顺序:
NestWhile(嵌套期间)[(f),x,测试]
应用函数(f)重复使用,直到应用测试结果不再产生真的
嵌套WhileList[(f),x,测试]
生成列表{x,(f)[x],(f)[(f)[x]],},应用时停止测试结果不再产生真的
NestWhile(嵌套期间)[(f),x,测试,]
,
嵌套WhileList[(f),x,测试,]
提供作为参数的最新结果测试在每个步骤
NestWhile(嵌套期间)[(f),x,测试,全部]
,
嵌套WhileList[(f),x,测试,全部]
提供到目前为止的所有结果作为的参数测试
反复应用函数,直到测试失败。
下面是一个将数字除以2的函数:
这一点反复适用分隔符2直到结果不再是偶数:
这一点反复适用牛顿3,当两个连续结果不再被视为不相等时停止,如固定点列表:
这种情况一直持续到以前看到的结果第一次重新出现:
操作,如嵌套接受一个函数(f)并反复应用。在每个步骤中,他们使用上一步的结果作为(f).
将这个概念推广到两个参数的函数是很重要的。您可以再次重复应用该函数,但现在得到的每个结果只提供了所需的一个新参数。一种方便的方法是从 列表。
文件夹列表[(f),x,{,b条,}]
创建列表{x,(f)[x,],(f)[(f)[x,],b条],}
折叠[(f),x,{,b条,}]
给出由生成的列表的最后一个元素文件夹列表[(f),x,{,b条,}]
重复应用两个参数函数的方法。
下面是一个例子文件夹列表做:
折叠给出了由生成的列表的最后一个元素文件夹列表:
这提供了一个累积总和列表:
使用折叠文件夹列表您可以用Wolfram语言编写许多优雅高效的程序。在某些情况下,您可能会发现考虑折叠文件夹列表生成由第二个参数索引的函数族的简单嵌套。
这定义了一个函数下一位数:
这就像现在建造的在功能中From数字:
下面是一个实际函数的示例:
将函数应用于列表和其他表达式
在如下表达式中(f)[{,b条,c(c)}]您给出的是一个列表作为函数的参数。通常,您需要将函数直接应用于列表的元素,而不是整个列表。您可以在Wolfram语言中使用应用.
这使列表中的每个元素都成为函数的参数(f):
这给了次数[,b条,c(c)]它生成列表中元素的乘积:
下面是一个与内置函数类似的函数的定义几何平均值,使用编写应用:
应用[(f),{,b条,}]
应用(f)添加到列表,(f)[,b条,]
应用[(f),快递] (f)@@快递
应用(f)到表达式的顶层
地图应用[(f),快递] (f)@@@快递
应用(f)在表达式的第一级
应用[(f),快递,{1}]
相当于(f)@@@快递
应用[(f),快递,列维(lev)]
应用(f)在表达式中的指定级别
将函数应用于列表和其他表达式。
什么应用通常是用指定的函数替换表达式的头。在这里它取代了Plus(加)通过列表:
下面是一个矩阵:
使用应用如果没有明确的级别规范,则替换顶部级别列表(f):
这适用于(f)仅适用于部分1级:
地图应用相当于使用应用在1级零件上:
这适用于(f)级别0到1:
将函数应用于部分表达式
如果您有元素列表,那么能够将函数分别应用于每个元素通常很重要。您可以在Wolfram语言中使用地图.
这适用于(f)分别添加到列表中的每个元素:
这定义了一个从列表中获取前两个元素的函数:
你可以使用地图申请采取2列表中的每个元素:
地图[(f),{,b条,}]
应用(f)列表中的每个元素,{(f)[],(f)[b条],}
将函数应用于列表中的每个元素。
什么地图[(f),快递]有效的做法是“包装”函数(f)围绕表达式的每个元素快递。您可以使用地图在任何表达式上,而不仅仅是列表上。
这适用于(f)总和中的每个元素:
这适用平方米每个参数 :
地图[(f),快递]应用(f)到中的第一级部件快递。您可以使用映射全部[(f),快递]申请(f)全部的的部分快递.
这定义了一个2x2矩阵:
地图应用(f)达到第一级,在这种情况下,矩阵的行:
映射全部应用(f)全部的中的级别。如果仔细查看此表达式,您将看到(f)包裹在每个部件上:
通常,您可以使用级别规范,如中所述“表达式中的级别”告诉别人地图要将函数应用于表达式的哪些部分。
这适用于(f)仅限于以下部分第2级:
设置选项头部->真的包裹(f)围绕每个零件的头部及其元件:
地图[(f),快递] (f)/@快递
应用(f)到第一个水平部件快递
映射全部[(f),快递] (f)//@快递
应用(f)到的所有部分快递
地图[(f),快递,列维(lev)]
应用(f)到的每个部分快递在指定的级别列维(lev)
将函数应用于表达式不同部分的方法。
级别规范允许您告诉地图您希望将函数应用于表达式中的哪些级别的部分。使用地图位置然而,您可以给出一个显式的部件列表,其中包含您想要应用函数的部件。您可以通过提供其索引来指定每个部分,如中所述“表达式的组成部分”.
这是一个2x3矩阵:
这适用于(f)到零件{1,2}{2,}:
这给出了一个位置列表b条发生于毫米:
你可以输入你的职位列表职位直接进入地图位置:
为了避免歧义,您必须将每个零件规范放在一个列表中,即使它只涉及一个索引:
地图位置[(f),快递,{部分1,部分2,}]
应用(f)到的指定部分快递
将函数应用于表达式的特定部分。
下面是一个表达式:
这是:
你可以使用地图位置任何表达式。请记住,零件是根据完整形式的表达式进行编号的:
地图索引[(f),快递]
应用(f)表达式的元素,将每个元素的部件规范作为第二个参数提供给(f)
地图索引[(f),快递,列维(lev)]
应用(f)到指定级别的零件,将每个部分的索引列表作为第二个参数提供给(f)
将函数应用于零件及其索引。
这适用于(f)给列表中的每个元素,将元素的索引作为第二个参数(f):
这适用于(f)矩阵中的两个级别:
地图允许您将一个参数的函数应用于表达式的各个部分。然而,有时您可能希望将多个参数的函数应用于多个不同表达式的相应部分。您可以使用地图线程.
映射线程[(f),{快递1,快递2,}]
应用(f)到每个快递
地图线程[(f),{快递1,快递2,},列维(lev)]
应用(f)到的部分快递在指定的级别
一次将函数应用于多个表达式。
这适用于(f)对应的列表元素对:
地图线程可以使用任意数量的表达式,只要它们具有相同的结构:
功能如地图允许您使用修改的部分创建表达式。有时,您只想遍历表达式,并将特定函数应用于其中的某些部分,而不需要构建新的表达式。典型的情况是,您应用的函数具有副作用例如进行赋值或生成输出。
扫描[(f),快递]
评价(f)应用于的每个元素快递反过来
扫描[(f),快递,列维(lev)]
评价(f)应用于的部分快递在指定的级别上列维(lev)
对表达式的部分求值。
地图构建一个新列表,其中(f)已应用于列表的每个元素:
扫描计算将函数应用于每个元素的结果,但不构造新表达式:
扫描深入访问表达式的各个部分第一次散步,先看树叶:
Pure函数
功能[x,身体]
一个纯函数,其中x被您提供的任何参数替换
功能[{x1,x2,},身体]
接受多个参数的纯函数
身体&
纯函数,其中参数指定为##1, #2, #3,等。
纯粹的功能。
使用功能操作时,例如嵌套地图,始终必须指定要应用的函数。在上述所有示例中,我们都使用了函数的“名称”来指定函数。纯函数允许您提供可应用于参数的函数,而无需定义函数的显式名称。
这定义了一个函数小时:
已定义小时,现在可以在中使用其名称地图:
以下是使用纯函数获得相同结果的方法:
用Wolfram语言编写纯函数有几种等效的方法。所有情况下的想法都是构造一个对象,当提供适当的参数时,该对象将计算特定的函数。因此,例如,如果乐趣是一个纯函数,那么乐趣[]使用参数对函数求值.
下面是表示平方运算的纯函数:
提供参数n个对纯函数求出n个:
您可以在通常会给出函数名称的任何地方使用纯函数。
您可以在中使用纯函数地图:
或者在嵌套:
这将设置一个带有两个参数的纯函数,然后将该函数应用于参数b条:
如果要重复使用特定函数,则可以使用(f)[x_]:=身体,并通过其名称引用函数(f)另一方面,如果您只打算使用一次函数,您可能会发现最好是以纯函数形式给出函数,而不必对其进行命名。
如果您熟悉形式逻辑或LISP编程语言,您将认识到Wolfram language纯函数如下表达式或匿名函数。纯函数也接近于算符的纯数学概念。
#
纯函数中的第一个变量
#n个
这个n个 第个纯函数中的变量
##
纯函数中所有变量的序列
##n个
变量序列以n个 第个
纯函数的缩写。
正如如果您不想再次引用函数,那么函数的名称是不相关的一样,纯函数中参数的名称也是不相关的。Wolfram语言允许您避免对纯函数的参数使用显式名称,而是通过提供“插槽编号”来指定参数#n个.在Wolfram语言纯函数中,#n个代表n个 第个您提供的参数。#代表第一个论点。
#^2&是纯函数的缩写形式,用于平方其参数:
这将应用一个从每个列表中获取前两个元素的函数。通过使用纯函数,可以避免单独定义函数:
使用纯函数的简短形式,可以简化来自数字在中给出 “重复应用功能”:
当您对纯函数使用缩写形式时,不要忘记“与”号,这一点非常重要。如果不使用与号,Wolfram语言将不知道您给出的表达式将用作纯函数。
当您对纯函数使用“与”符号时,您必须小心输入中的部分分组。如所示 “操作员输入表单”与符号的优先级相当低,这意味着您可以键入以下表达式#1+#2&没有括号。另一方面,如果您想将选项设置为纯函数,则需要使用括号,如选项->(乐趣&).
Wolfram语言中的纯函数可以接受任意数量的参数。你可以使用##支持所有给出的论点,以及##n个代表n个 第个以及随后的参数。
##代表所有参数:
##2代表除第一个参数外的所有参数:
功能的建筑列表
阵列[(f),n个]
生成长度n个表单列表{(f)[1],(f)[2],}
阵列[(f),{n个1,n个2,}]
生成n个1×n个2×嵌套的列表,每个条目包含(f)应用于其索引
嵌套列表[(f),x,n个]
生成表单列表{x,(f)[x],(f)[(f)[x]],},哪里(f)最多嵌套到n个深的
文件夹列表[(f),x,{,b条,}]
生成表单列表{x,(f)[x,],(f)[(f)[x,],b条],}
合成列表[{(f)1,(f)2,},x]
生成表单列表{x,(f)1[x],(f)2[(f)1[x]],}
根据功能制作列表。
这就形成了一个包含5个元素的列表,每个元素的形式第页[]:
以下是生成相同列表的另一种方法:
这将生成一个元素为:
这将生成2×3矩阵,其条目为[,j]:
这将生成一个3×3矩阵,其元素为其指数总和的平方:
嵌套列表文件夹列表在中进行了讨论“重复应用功能”。特别是通过将它们与纯函数一起使用,您可以构建一些非常优雅和高效的Wolfram语言程序。
这给出了通过连续微分获得的结果列表关于:
用函数选择表达式的部分
“处理列表元素”显示了如何根据列表元素位置然而,通常您需要根据哪里他们是,但更重要的是什么他们是。
选择[列表,(f)]选择的元素列表使用函数(f)作为标准。选择应用(f)到的每个元素列表反过来,只保留结果为真的.
这将选择纯函数为其生成的列表元素真的,即数值大于4:
你可以使用选择挑选任何表达式的片段,而不仅仅是列表的元素。
这给出了涉及x,、和z(z):
你可以使用选择只挑选总和中不涉及符号的那些项x:
选择[快递,(f)]
选择中的图元快递函数(f)给予真的
选择[快递,(f),n个]
选择第一个n个中的元素快递对于该函数(f)给予真的
选择表达式片段。
“对模式施加约束”讨论了中经常用作标准的一些“谓词”选择.
这给出了满足您指定标准的第一个元素:
头部不是符号的表达式
在大多数情况下,你想要头部(f)Wolfram语言表达式的(f)[x]成为一个单一的符号。然而,头部的一些重要应用并非符号。
此表达式具有(f)[]作为一个头部。您可以使用这样的头部来表示“索引函数”:
您可以使用任何表达式作为头部。记住插入必要的括号:
我们已经遇到过将复杂表达式用作头的一个例子是在“纯函数”.通过给予功能[变量,身体]作为表达式的头,您可以指定要计算的参数的函数。
用头功能[x,x ^2(x ^2)],表达式的值是参数的平方:
Wolfram语言中有几个结构,它们的工作方式与纯函数非常相似,但它们表示特定类型的函数,通常是数值函数。在所有情况下,基本机制都需要提供一个头部,其中包含有关要使用的函数的完整信息。
功能[变量,身体][参数]
纯函数
插值函数[数据][参数]
近似数值函数(由生成插值NDSolve公司)
编译的函数[数据][参数]
编译的数值函数(由生成 编译 )
线性求解函数[数据][血管内皮细胞]
矩阵解函数(由生成 线性求解 )
有些表达的头部不是符号。
NDSolve(ND解算)返回给定的规则列表作为插值函数对象:
这里是插值函数对象:
您可以使用插值函数对象作为头,以获得函数值的数值近似值:
将更复杂的表达式用作head的另一个重要用途是实现工作人员函数运算符在数学方面。
例如,考虑微分的操作。如中所述“衍生品的表示”,表达式类似f’表示导数函数,获取自(f)通过对其应用函数运算符。在Wolfram语言中,f’表示为导数[1][(f)]:“函数运算符”导数[1]应用于(f)给出另一个函数,表示为f’.
此表达式有一个头,表示函数运算符 导数[1]功能 (f):
你可以更换头部f’用另一个头,例如英尺/平方英尺。这实际上需要英尺/平方英尺成为一名导数函数获得自(f):
与操作员合作
你可以想到这样的表达(f)[x]通过应用运算符形成(f)到表达式x。您可以想到这样的表达式(f)[[x]]由于组成操作员(f),并将结果应用于x.
组成[(f),,]
函数的构成(f), ,
正确的构成[(f),,]
右边的作文(f), ,
逆函数[(f)]
函数的逆函数(f)
身份
单位函数
一些功能操作。
这表示函数的组成(f),、和小时:
您可以符号化地操作函数的组合:
当您提供特定参数时,将显式计算组合:
可以使用运算符输入成分@*:
正确的构成按相反顺序排列:
可以使用运算符输入右侧的组成/*
只需输入以下内容,您就可以获得Wolfram系统中两个表达式的总和x+。有时也值得考虑对运算符执行加法等操作。
您可以将其视为包含两个运算符的和(f):
使用通过,可以将表达式转换为更显式的形式:
这对应于数学运算符:
Wolfram系统不会自动将操作符的单独部分应用于表达式:
你可以使用通过要应用运算符:
身份[快递]
单位函数
通过[[(f)1,(f)2][x],q个]
[(f)1[x], (f)2[x]]如果与相同q个
操作[,(f)[x]]
[(f)][x]
操作[,(f)[x],n个]
应用在水平面n个在里面(f)
映射全部[,快递,头部->真的]
应用到的所有部分快递,包括头部
与操作员一起工作的操作。
这是一个复杂的头部表达:
功能如展开不要自动进入词头:
使用头部选项设置为真的,映射全部进入头部:
替换操作员/.确实进入了词目:
你可以使用操作将函数专门应用于表达式的头部:
结构操作
Wolfram系统包含一些强大的原语,用于对表达式进行结构更改。您可以使用这些原语来实现诸如结合性和分配性等数学属性,并为一些简洁高效的程序提供基础。
这里我们描述了可以在表达式上显式执行的各种操作。“属性”描述了如何通过为具有特定头的所有表达式分配适当的属性来自动执行其中一些操作。
您可以使用Wolfram System功能排序[快递]不仅对列表中的元素进行排序,而且对具有任何标题的表达式进行排序。通过这种方式,您可以实现任意函数的交换性或对称性的数学属性。
你可以使用排序将任何函数的参数按标准顺序排列:
排序[快递]
将列表或其他表达式的元素按标准顺序排序
排序[快递,pred(前)]
使用函数排序pred(前)以确定配对是否有序
订购[快递]
排序时给出元素的顺序
订购[快递,n个]
给出第一个的顺序n个排序时的元素
订购[快递,n个,pred(前)]
使用函数pred(前)以确定配对是否有序
订购数量Q[快递]
真的如果的元素快递都是标准订单,False(错误)否则
订单[快递1,快递2]
1如果快递1出现在前面快递2按标准顺序,-1如果它在后面
按顺序排序。
的第二个论点排序是一个用于确定对是否有序的函数。这将按降序对数字进行排序:
此排序条件放置不依赖于x在这样做之前:
压扁[快递]
用相同的头展平所有嵌套函数快递
压扁[快递,n个]
最多压平n个嵌套层次
压扁[快递,n个,小时]
用head展平函数小时
平坦At[快递,]
仅展平 第个的元素快递
使表情扁平化。
压扁删除函数的嵌套引用:
你可以使用压扁将元素序列“拼接”到列表或其他表达式中:
你可以使用压扁实现结合性的数学性质。功能分发允许您实现分配性和线性等属性。
分发[(f)[+b条+,]]
分配(f)超额支付(f)[,]+(f)[b条,]+
分发[(f)[参数],]
分配(f)超越任何有理智的论点
分发[快递,,(f)]
仅当头部(f)
分发[快递,,(f),普通合伙人,英尺/平方英尺]
分配(f)结束,将其替换为英尺/平方英尺普通合伙人,分别地
应用分配定律。
这是“分发”(f)结束a+b:
下面是一个更复杂的示例:
一般来说,如果(f)分配超过Plus(加),然后是一个类似的表达式(f)[+b条]可以“扩展”以提供(f)[]+(f)[b条].功能展开对于标准代数运算符(例如次数.分发允许您对任意运算符执行相同类型的扩展。
展开使用的分布性次数结束Plus(加)要执行代数展开:
这将分配性应用于列表,而不是求和。结果包含所有可能的参数对:
它分布在列表上,但只有在整个表达式的头为(f):
它分布在列表上,确保整个表达式的头(f)。结果,它使用普通合伙人代替列表、和英尺/平方英尺代替(f):
与相关分发是函数吗螺纹.什么螺纹有效的做法是将函数并行应用于列表或其他表达式的所有元素。
螺纹[(f)[{1,2},{b条1,b条2}]]
线(f)要给出的列表{(f)[1,b条1],(f)[2,b条2]}
螺纹[(f)[参数],]
线(f)用头覆盖物体在里面参数
线程表达式的函数。
下面是一个参数为列表的函数:
螺纹将“并行”功能应用于列表的每个元素:
非列表的参数会重复出现:
如中所述“一起收集对象”,并在中详细讨论“属性”,许多已建成在Wolfram系统中,函数具有“可列表”的属性,因此它们会自动线程化到任何显示为参数的列表上。
建造在数学函数中,例如日志是可列出的,因此它们会自动在列表上进行线程处理:
日志但是,不是自动在方程式上执行线程:
你可以使用螺纹要获得应用于方程式两侧的函数:
外部[(f),列表1,列表2]
广义外积
内部[(f),列表1,列表2,]
广义内积
广义外积和内积。
外部[(f),列表1,列表2]从中获取所有可能的元素组合列表1列表2,并将其与(f).外部可以看作是张量笛卡尔积的推广,如“张量”.
外部形成所有可能的元素组合,并应用(f)致他们:
在这里外部产生更低的三角布尔矩阵:
你可以使用外部在任何具有相同头部的表达式序列上:
外部,比如分发,构造所有可能的元素组合。另一方面,内部,比如螺纹,只构造在其作用的表达式中具有相应位置的元素组合。
这是一座由内部:
内部是对:
序列
功能压扁允许您显式展开所有子列表:
平坦At允许您指定要展平子列表的位置:
顺序对象会自动拼接,不需要任何显式展平:
顺序[e(电子)1,e(电子)2,]
将自动拼接到任何函数中的参数序列
表示函数中的参数序列。
顺序适用于任何功能:
这包括具有特殊输入形式的函数:
以下是一种常见的方法顺序使用: