SymPy:如何用常量计算表达式?

时间:2017-07-20 05:47:31

标签: python sympy symbolic-math

我有用SymPy编写的微分方程

diffeq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x))

其中f(x)是符号函数符号,x是变量符号。

当我用这个解决它时:

expr = dsolve(diffeq, f(x))

我得到了

f(x)=(C_1+C_2x)ex+12cos(x)

这个等式的正确解决方案。但现在我想在几个方面评估这个功能。我知道我可以用subs函数替换x,但是有没有办法替换常量值C_1和C_2以便我可以评估函数?

2 个答案:

答案 0 :(得分:1)

在GitHub上有一个开放的PR,它会向ics添加dsolve标记。

目前,您可以使用subs手动替换值,使用solve解析C1C2,并使用subs代替重新回到解决方案中。

例如,如果f(0) = 1f'(0) = 0,则使用类似

的内容
>>> p1 = expr.subs([(x, 0), (f(0), 1)])
>>> dexpr = Eq(expr.lhs.diff(x), expr.rhs.diff(x))
>>> p2 = dexpr.subs([(x, 0), (f(x).diff(x).subs(x, 0), 0)])
>>> p1
Eq(1, C1 + 1/2)
>>> p2
Eq(0, C1 + C2)
>>> C1, C2 = symbols('C1 C2')
>>> sol = solve([p1, p2], [C1, C2])
>>> sol
{C1: 1/2, C2: -1/2}
>>> expr.subs(sol)
Eq(f(x), (-x/2 + 1/2)*exp(x) + cos(x)/2)

答案 1 :(得分:0)

您可以从表达式中获取常量。它有点乱,但它有效:

v1 = expr.args[1].args[1].args[0].args[0]
v2 = expr.args[1].args[1].args[0].args[1].args[0]
expr.subs(v1,1).subs(v2,2)

说明: 看看expr.args。它是等式的左侧和右侧的元组。这里我们想要元组的第二个条目,因此索引1。 然后我们得到一些sympy.core.add.Add。我们可以再次使用args进行分解,并且可以继续,直到达到常量。