SymPy:如何计算带有常量的表达式?

SymPy: How do I evaluate an expression with constants?

我用 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 以便我可以计算函数?

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

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 进行分解,并继续进行直到达到常量。

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

目前,您可以使用 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)