2.4.10 与不同符号相关的定义 f[args] = rhs 或 f[args] := rhs 等将 f 和定义联系起来,当输入 ? f 时,就会显示 f 的定义. 一般 我们把 f 作为头部的表达式称为 f 的下值. Mathematica 中也有上值,上值可以把表达式与不直接出现在其头部的符号联系起来. 在定义 Exp[g[x_]] := rhs 中,可以把定义看作为 符号 Exp 的下值,但从和有效性看未必是最好的方式. 较好的方式是将 Exp[g[x_]] := rhs 与 g 联系起来,即定义为 g 的上值. 定义与不同符号的联系 定义 的下值 查看 的定义
定义 的上值 此定义与 相关
此定义与 Exp 无关
用定义求表达式的值
Out[6]= |  |
在简单的情况下,将 f[g[x]] 作为f的下值或g的上值得到的结果是相同的. 其中之一比另一个更自然或有效一些. 一般地原则是:当 f 比g更常用的时候应该将 f[g[x]] 定义为 g 的上值.例如在 Exp[g[x]] 中,Exp 是 Mathematica 中的内部函数,g 是引入的一个函数,此时将 Exp[g[x]] 作为 g 的上值比较 合理和自然. 定义 的上值 到此为止 的定义
定义 的和
Out[9]= |  |
由于模式 g[x_] + g[y_] 的完全形式是 Plus[g[x_], g[y_]] , 这可以定义为 Plus 的下值, 然而将它看作g的上值更好一些. 一般来说,当 Mathematica 遇到一个函数时,它测试所有已给出的该函数的定义, 把 g[x_] + g[y_] 定义为 Plus 的下值时,则当遇到 Plus 时就 试用这个定义.由于每次遇到加法时都测试这个定义,故运行时速度较慢. 而把 g[x_] + g[y_] 看作g的上值时,仅当g出现在 Plus 内时才 测试这个定义,因出现的频率比 Plus 出现的少,故这个更有效一些. 定义上值的有效方法 上值的典型用法是在建立一些对象性质的数据库之中,使用上值可以把所涉 及对象的定义与对象相联系,而不是与其给出的性质相联系. 定义 square 的上值给出其面积
Out[10]= |  |
加入 perimeter 的定义
Out[11]= |  |
这两个定义都与 square 对象相关联
一般可以将一个表达式的定义和出现在表达式高层次中的符号联系起来. 在形如 f[args] 的表达式中,当g本身或以g为头部的对象出现在args 中时, 就可以定义g的上值,但当g出现在较低的层次中时,就无法将这些定义与g相关联系. g 是变量的头部,可以使 g 与该定义相关 g 在左端出现的层次太低, 故无法将它与定义相关联
Out[14]= |  |
定义中符号的位置 在 Mathematica 中,符号可作为标记来表明表达式的类型. 例如复数的内部形式 为 Complex[x, y],这里 Complex 表明此对象是一个复数. 上值提供了一个运算和 标记的简便方法 .例如,当需要引入类型为 quat 的一组对象时,就可以用 quat[data] 来表示每一个对象.典型的情况是 quat 的元素有加法和乘法 等算术运算的性质,这可以通过定义 quat 对 Plus 和 Times 的上值的途径来实现. 定义 quat 关于 Plus 的上值 刚定义的上值用来简化这一表达式
Out[16]= |  |
定义 quat 关于 Plus 运算的上值,就是将Plus的定义域扩大到 quat 上,即告诉 Mathematica 当 quat 的元素相加时就使用加法的规则. 在定义 quat 中的加法时,可以用形如 quatPlus 的特定加法运算符,但用 Mathematica 中的标准运算 Plus,再增添一些对 quat 元素的特殊性质更方便一些. 可以将上值看作实现一些面向对象编程功能的一种途径.符号 quat 表示一类对象,quat 的各种上值指出 quat 的元素在某些运算或情况下的性质.
|