【问题标题】:SymPy: How do I evaluate an expression with constants?SymPy:如何评估带有常量的表达式?
【发布时间】:2017-07-20 05:47:30
【问题描述】:

我有这个用 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 以便我可以评估函数?

【问题讨论】:

    标签: python sympy symbolic-math


    【解决方案1】:

    在 GitHub 上有一个开放的 PR,它将向 dsolve 添加一个 ics 标志。

    目前,您可以使用 subs 手动替换值,使用 solve 求解 C1C2,然后使用 subs 将值替换回解中。

    例如,如果f(0) = 1f'(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】:

      您可以从表达式中获取常量。这有点乱,但它有效:

      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 进行分解,并且可以继续直到达到我们的常量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多