Python Symphy:如何用常量计算表达式?
这个微分方程是用SymPy写的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,这样我就可以计算函数?你可以从表达式中得到常数。虽然有点凌乱,但它能起作用:
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)