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

Python Symphy:如何用常量计算表达式?,python,sympy,symbolic-math,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)) 我明白了 这是这个方程的正确解。但是现在我想从几个方面来评估这个函数。我知道我可以用subs函数替换x,但是有没有办法替换常量C_1和C_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))
我明白了


这是这个方程的正确解。但是现在我想从几个方面来评估这个函数。我知道我可以用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上有一个开放的解决方案,将
ics
标志添加到
dsolve

现在,您可以使用
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)
>>> 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)