Sympy 函数替换
Sympy Function substitution
我使用像
这样的东西
x = Function('x',real=True)(t)
它在我的所有计算中将 x(t)
作为函数变量。我现在可以区分时间,求解(不是 nonlinsolve
或 solveset
,因为它们不能替代这些函数)等等。
但是,我想将我的结果导出到 MATLAB。所以我需要 (t)
消失。我可以用 d = {x(t):x}
填充 dict
,但我认为有一种更优雅的方法可以对所有函数执行此操作,例如 y(t),z(t)
、...
我想要的结果是输入
expr = x(t)-y(t)
output = x-y
其中 x 和 y 可以是 Sympy 已知的 "Function",但输出中不应有 (t)
。而且我确实想避免在不依赖时间的情况下再次引入我所有的变量!
这是一个循环 walks through the expression tree 并用与该函数名称匹配的符号替换参数为 t
的任何函数。替换是在表达式的另一个副本中进行的,以避免修改我们正在遍历的表达式。
示例:如果 expr 为 x(t) - y(t)
,则 expr1 为 x - y
。
expr1 = expr
for f in preorder_traversal(expr):
if f.args == (t,):
expr1 = expr1.subs(f, Symbol(str(f.func)))
print(expr1)
我使用像
这样的东西x = Function('x',real=True)(t)
它在我的所有计算中将 x(t)
作为函数变量。我现在可以区分时间,求解(不是 nonlinsolve
或 solveset
,因为它们不能替代这些函数)等等。
但是,我想将我的结果导出到 MATLAB。所以我需要 (t)
消失。我可以用 d = {x(t):x}
填充 dict
,但我认为有一种更优雅的方法可以对所有函数执行此操作,例如 y(t),z(t)
、...
我想要的结果是输入
expr = x(t)-y(t)
output = x-y
其中 x 和 y 可以是 Sympy 已知的 "Function",但输出中不应有 (t)
。而且我确实想避免在不依赖时间的情况下再次引入我所有的变量!
这是一个循环 walks through the expression tree 并用与该函数名称匹配的符号替换参数为 t
的任何函数。替换是在表达式的另一个副本中进行的,以避免修改我们正在遍历的表达式。
示例:如果 expr 为 x(t) - y(t)
,则 expr1 为 x - y
。
expr1 = expr
for f in preorder_traversal(expr):
if f.args == (t,):
expr1 = expr1.subs(f, Symbol(str(f.func)))
print(expr1)