当方程中存在solve
s或者是要解决的目标时,似乎sympy的Function
函数无法求解某些方程。
为了解决这个问题,我想创建一个通用函数,它会自动用Function
同名的表达式替换Symbol
。
例如,如果表达式中出现Function('myfunc')(Symbol('t'))
,我希望用Symbol('myfunc')
代替。
subs
函数无法执行此操作,因为必须事先明确知道名称。
replace
函数看起来很有希望,特别是func - > func的味道,但我无法弄清楚如何从对象中获取函数对象的名称。
答案 0 :(得分:0)
这是我的建议:
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的实例(即F(_),其中F是未定义的函数),如果是,则将其替换为相应名称的符号
我使用字符串拆分来单独获取“myfunc”部分,假设在此步骤中应删除参数;否则只能由str(item)
替换。
我还假设只有替换未找到的函数,否则就必须相应地增加...