使用同名的符号替换sympy表达式中的函数
问题描述:
似乎sympy的solve
函数无法求解方程中存在的一些方程式,或者是要求解的目标。使用同名的符号替换sympy表达式中的函数
为了解决这个问题,我想创建一个通用函数,该函数会自动替换Function
s中的一个表达式,其中Symbol
同名。
例如,如果Function('myfunc')(Symbol('t'))
出现在表达式中,我想替换Symbol('myfunc')
。
subs
函数不能这样做,因为名称必须事先明确知道。
replace
函数看起来很有前途,特别是它的func - > func味道,但我无法弄清楚如何从对象中获取函数对象的名称。
答
这里是我的建议:
import sympy
t = sympy.Symbol("t")
x = sympy.Symbol("x")
F = sympy.Function("F")(t)
G = sympy.Function("G")
def remove_undefineds(expression):
for item in sympy.preorder_traversal(expression):
if isinstance(item, sympy.function.AppliedUndef):
name = str(item).split('(')[0]
expression = expression.subs(item, sympy.Symbol(name))
return expression
expression = F + G(x) + t**x
cleaned = remove_undefineds(expression)
产量:
In [1]: expression
Out[1]: t**x + F(t) + G(x)
In [2]: cleaned
Out[2]: F + G + t**x
的想法是遍历表达preorder_traversal,检查每一个项目无论是AppliedUndefined(IE F的一个实例( _),F是一个未定义的函数),如果是,则用符号名称替换它。
我使用了字符串split来单独获取“myfunc”部分,假设参数在这一步被删除;否则只能由str(item)
替代。
我还假设只有undefind函数被替换,否则必须相应地增加...