代码之家  ›  专栏  ›  技术社区  ›  Daniel

Symphy:如何计算带有常数的表达式?

  •  1
  • Daniel  · 技术社区  · 9 年前

    这个微分方程是用辛写的

    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,这样我就可以计算函数?

    2 回复  |  直到 9 年前
        1
  •  1
  •   asmeurer    9 年前

    有一个开放的 PR 在GitHub上,这将添加一个 ics 标记为 dsolve .

    现在,您可以使用手动替换这些值 subs 使用 solve 解决 C1 C2 ,并使用 潜艇 将这些值替换回解中。

    例如,如果 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)
    
        2
  •  0
  •   laolux    9 年前

    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 可以一直持续到我们达到常数。

    推荐文章