Function simplify #
简化一个表达式树。
一系列规则应用于表达式,在列表上重复应用,直到没有进一步的更改。可以选择将自定义规则集作为第二个参数传递给该函数。规则可以指定为对象、字符串或函数
const rules = [
{ l: 'n1*n3 + n2*n3', r: '(n1+n2)*n3' },
'n1*n3 + n2*n3 -> (n1+n2)*n3',
function (node) {
// ... return a new node or return the node unchanged
return node
}
]
字符串和对象规则由左模式和右模式组成。左模式用于匹配表达式,右模式决定匹配项被替换为什么。模式与普通表达式的主要区别在于,以以下字符开头的变量被解释为通配符
- ‘n’ - 匹配任何节点 [Node]
- ‘c’ - 匹配一个常量字面量(5 或 3.2) [ConstantNode]
- ‘cl’ - 匹配一个常量字面量;同 c [ConstantNode]
- ‘cd’ - 匹配一个十进制字面量(5 或 -3.2) [ConstantNode 或包装 ConstantNode 的 unaryMinus]
- ‘ce’ - 匹配一个常量表达式(-5 或 √3)[仅由 ConstantNodes、函数和运算符组成的表达式]
- ‘v’ - 匹配一个变量;任何不被 c 匹配的项(-5 或 x)[非 ConstantNode 的 Node]
- ‘vl’ - 匹配一个变量字面量(x 或 y)[SymbolNode]
- ‘vd’ - 匹配一个非十进制表达式;任何不被 cd 匹配的项(x 或 √3)[非 ConstantNode 的 Node 或包装 ConstantNode 的 unaryMinus]
- ‘ve’ - 匹配一个变量表达式;任何不被 ce 匹配的项(x 或 2x)[包含 SymbolNode 或其他非常量项的表达式]
默认规则列表在函数上公开为 simplify.rules,并可作为构建自定义规则集的基础。请注意,由于 simplifyCore 函数在默认规则列表中,因此默认情况下,simplify 会将表达式中具有运算符等效项的函数调用转换为其运算符形式。
要将规则指定为字符串,请使用‘->’分隔左模式和右模式。指定规则为对象时,以下键具有意义
- l - 左模式
- r - 右模式
- s - 代替 l 和 r,将其拆分为 -> 的字符串形式
- repeat - 是否重复此规则直到表达式稳定
- assuming - 提供一个上下文对象,如同 simplify 的 ‘context’ 选项。上下文对象中的每个属性必须按顺序匹配当前上下文,否则该规则将不被应用。
- imposeContext - 提供一个上下文对象,如同 simplify 的 ‘context’ 选项。指定的任何设置将覆盖当前上下文,用于此规则的所有匹配项。
有关理论的更多详细信息,请参阅
可以作为 simplify 的最后一个参数传递一个可选的 options 参数。当前可用的选项(括号中为默认值)
consoleDebug(false): 是否将正在简化的表达式及其任何更改以及负责的规则写入控制台context(simplify.defaultContext): 一个提供每个运算符属性的对象,这些属性决定了允许哪些简化。当前有意义的属性是:可交换的、可结合的、总的(操作是否对所有参数都已定义)以及琐碎的(操作应用于单个参数是否会保留该参数不变)。默认上下文非常宽松,几乎允许所有简化。只有与默认值不同的属性才需要指定;默认上下文用作回退。另外还提供了simplify.realContext和simplify.positiveContext上下文,以使 simplify 能够仅执行保证保留表达式所有值的简化,假设所有变量和子表达式都是实数或正实数,或者相应地。 (请注意,在某些情况下,这些比默认上下文更严格;例如,默认上下文允许x/x简化为 1,而simplify.realContext则不允许,因为0/0不等于 1。)exactFractions(true): 是否尝试将所有常量转换为精确的有理数。fractionsLimit(10000): 当exactFractions为 true 时,只有当分子和分母都小于fractionsLimit时,常量才会表示为分数。
Syntax #
math.simplify(expr)
math.simplify(expr, rules)
math.simplify(expr, rules)
math.simplify(expr, rules, scope)
math.simplify(expr, rules, scope, options)
math.simplify(expr, scope)
math.simplify(expr, scope, options)
Parameters #
| Parameter | Type | Description |
|---|---|---|
expr |
Node | string | 要简化的表达式 |
rules |
SimplifyRule[] | 可选的自定义规则列表 |
scope |
Object | 可选的变量作用域 |
options |
SimplifyOptions | 可选的配置设置 |
Returns #
| Type | Description |
|---|---|
| Node | 返回 expr 的简化形式 |
Throws #
Type | Description —- | ———–
Examples #
math.simplify('2 * 1 * x ^ (2 - 1)') // Node "2 * x"
math.simplify('2 * 3 * x', {x: 4}) // Node "24"
const f = math.parse('2 * 1 * x ^ (2 - 1)')
math.simplify(f) // Node "2 * x"
math.simplify('0.4 * x', {}, {exactFractions: true}) // Node "x * 2 / 5"
math.simplify('0.4 * x', {}, {exactFractions: false}) // Node "0.4 * x"
另请参阅 #
simplifyCore, derivative, evaluate, parse, rationalize, resolve