Mathematica 9 is now available

2.5.5 非标准计算

大部分 Mathematica 内部的函数按标准过程进行计算,但也有些重要的函数不 遵循这一原则. 例如 Mathematica 中与程序的构造和执行有关的函数就使用 非标准计算过程. 典型的情况是这些函数或者不计算它们的一些变量的值, 或者按一种特殊的方法计算.

使用非标准计算过程的一些函数

当给出 a=1 的定义时,Mathematica 并不计算左端 a 的值. 如果计算将会导致 麻烦,其原因是在前面已定义了 a=7, 又要在 a=1 中计算 a,这就导致了 7=1 的矛盾.
在标准计算过程中,函数的每个变量是逐个计算的,可以通过属性 HoldFirst, HoldRestHoldAll 来改变这种情况,这些属性使某些变量处于不计算的状态.

保持函数变量不被计算的属性

标准计算过程中的所有变量都计算

h 设置属性 HoldFirst

不计算 h 的第一个变量

用到 h 的第一个变量时进行计算

内部函数如 SetHoldFirst 等属性

即使一个函数具有使其某些变量保持不计算状态的属性,还可以用 Evaluate[arg] 的形式来告诉 Mathematica 去计算它们.

Evaluate 有效地屏蔽了 HoldFirst 属性,使第一个变量被计算

强行计算函数的变量

保持变量可以使函数控制其变量在什么时候被计算.通过使用 Evaluate 可立即计算变量的值,而不再由函数控制这些变量的计算. 这一功能在许多情况下是有用的. 例如在画图内,Plot 函数保持表达式的 值不计算,随后在一系列数值点上计算该表达式的值. 有时需要立即计算 表达式的值并画图,例如有时要画由Table 产生的几个函数的图, 这不需要在绘制每个点时, Table 进行运算,而是需要 Table 立即进行运算.

Evaluate 导致这些函数立即成立,而不是在 Plot 选择的 x 值点列上成立

Plot 等内部函数能保持它们的变量不立即计算,但可以使用 Evaluate 去改变这一属性.

Set 函数保持第一个变量故此时 a 不计算

Evaluate 使 Set 计算它的第一个变量

此时 b=6

大部分情况下需要计算表达式,有时也需要某些表达式不计算,例如对 Mathematica 的一个程序块进行符号处理时,就要防止在处理过程中它们被计算. 用函数 HoldHoldForm 保持表达式不计算.这些函数就是设置 HoldAll 属性或 提供一种包装,使表达式处于不计算状态. Hold ] 和 HoldForm[ ] 的区别在于 Mathematica 的输出格式,Hold 可以直接显示,而 HoldForm 不直接显示, 通过查看 Mathematica 的完全内部形式,就可以看到这两个函数.

Hold 保持表达式不计算

HoldForm 也保持表达式不计算,但标准输出中显示它

HoldForm 在内部形式中仍出现

Out[13]//FullForm=

ReleaseHold 函数删除 HoldHoldForm,因此对该表达式进行了计算

处理不计算表达式的函数

通常选取表达式的项时就计算它

取出表达式的项,并用 Hold 包装,使它不被计算

最后一个变量 1 告诉 ReplacePart 在插入之前取出第一项

暂时防止变量求值

1+12, Length[2] 的结果是 0

1+1 不计算作为 Length 的变量

Unevaluated[ ] 暂时给函数设置类似于 HoldFirst 的属性,并将  作为函数的变量.

防止计算其它属性

HoldAll 属性可以保持函数的变量不被计算,但 Mathematica 还可以对变量进行变换, 使用 SequenceHold 属性,可以防止变量中出现的序列被压平. 通过设置 HoldAllComplete 属性, 可以防止保持的变量被计算和与变量有关的上值被使用.



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.