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
求解 C1
和 C2
,并使用 subs
求解将值替换回解决方案。
例如,如果 f(0) = 1
和 f'(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)
我用 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
求解 C1
和 C2
,并使用 subs
求解将值替换回解决方案。
例如,如果 f(0) = 1
和 f'(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)