我有用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以便我可以评估函数?
答案 0 :(得分:1)
在GitHub上有一个开放的PR,它会向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)
答案 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
进行分解,并且可以继续,直到达到常量。