在Sympy中替换组合函数

时间:2018-07-26 21:04:52

标签: python sympy

我正在尝试以f(g(x))的形式生成一些随机表达式。我希望能够将g替换为sin(x)x**2,并将f替换为cos(x)log(x)。所以我会得到类似sin(cos(x))log(x**2)的东西(但随机)。

此任务遇到的部分是替换外部和内部函数。

这是我的代码:

import sympy
from sympy import abc

x = abc.x
f = sympy.Function('f')(x)
g = sympy.Function('g')(x)

full=f.subs(x, g)
newExpr = sympy.sin(x)
newExpr2 = sympy.cos(x)

print(full)

replaced_inner = full.subs(g, newExpr)
print(replaced_inner)

both = replaced_inner.subs(f, newExpr2)
print(both)

full打印f(g(x)),这样可以正常工作
replaced_inner打印f(sin(x)),因此效果很好
我希望both打印f(sin(x))时会打印cos(sin(x))

我尝试使用args[0]f.func,但没有取得进展。

如何替换内部和外部函数(以及最终更复杂的东西,如f(g(h(x)))

我可以简单地创建cos(sin(x)),但是我想使用变量来做,这样我就可以随机分配要替换的函数。

1 个答案:

答案 0 :(得分:2)

问题出在诸如<{1}}之类的功能和诸如sympy.Function('f')之类的表达式上。定义sympy.Function('f')(x)后,您将f = sympy.Function('f')(x)表达式f制成。由于 表达式f(x)没有f(g(x))作为子表达式,尝试替换失败。

如果您使用实际功能,而不是过早插入f(x),则所有这些都已解决。

x

此打印

f = sympy.Function('f')
g = sympy.Function('g')

full = f(g(x))
newExpr = sympy.sin
newExpr2 = sympy.cos

print(full)

replaced_inner = full.subs(g, newExpr)
print(replaced_inner)

both = replaced_inner.subs(f, newExpr2)
print(both)

此外:您可能还对支持某些模式的replace方法感兴趣。这里不是必需的,但是对于更高级的替换来说可能是必需的。