pydrake 中的符号简化

Symbolic simplification in pydrake

我正在处理一个(system identification 类型)问题,我有一个非常复杂的符号表达式,我知道它在一组特定参数中是线性的。我想在此表达式上使用 DecomposeAffineExpressions,但由于分母中未取消的项,Drake 无法将表达式识别为线性表达式。我知道表达式确实是线性的,因为我可以转换为 sympy 并在那里进行简化(但我宁愿尽可能避免这种转换)。

是否可以在 Drake 中执行这种简化(参见下面的最小示例)?它 seems there is some support 用于更复杂的与 Trig 相关的简化,但我不清楚这如何适用于简单地取消分母中的冗余项。

最小示例:

实际发生了什么:

from pydrake.all import *

a = Variable('a')
b = Variable('b')

expr = (a*b)/b
print(expr)           # (a*b)/b
print(expr.Expand())  # (a*b)/b

我想做什么:

expr_simplified = expr.Simplify()  # (or something like this)
print(expr_simplified)             # a

我们目前在 Drake 中没有这种简化。原因之一是它不健全。例如,当 b = 0 时,(a * b) / ba 具有不同的评估输出。

话虽如此,我们了解到此功能可能很有用(例如,基于 b ≠ 0 的假设)。我将开始在 C++ 中实现它,并使其在 Python 端可用。请订阅问题,https://github.com/RobotLocomotion/drake/issues/8515 以获取有关此主题的更新。