代码之家  ›  专栏  ›  技术社区  ›  mike

辛函数代换

  •  3
  • mike  · 技术社区  · 7 年前

    我用的东西像

    x = Function('x',real=True)(t)
    

    这给了 x(t) nonlinsolve solveset ,因为它们不能替代这些函数)等等。

    然而,我想将我的结果导出到MATLAB。所以我需要 (t) 跑了。我可以填充一个 dict 具有 d = {x(t):x} ,但我认为有一种更优雅的方法可以实现所有功能,比如 y(t),z(t) ,...

    我想要的结果是输入

    expr = x(t)-y(t)
    output = x-y
    

    其中,x和y可以是Symphy已知的“函数”,但不应存在 (t) 在输出中。我确实希望避免再次引入所有变量,而不依赖于时间!

    1 回复  |  直到 7 年前
        1
  •  3
  •   user6655984 user6655984    7 年前

    这是一个循环 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)