SymPy - 求解器

  • 简述

    由于符号 = 和 == 在 Python 中被定义为赋值和相等运算符,因此它们不能用于制定符号方程。SymPy 提供 Eq() 函数来建立方程。
    
    >>> from sympy import * 
    >>> x,y=symbols('x y') 
    >>> Eq(x,y)
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    x = y
    由于当且仅当 xy=0 时 x=y 是可能的,所以上式可以写为 -
    
    >>> Eq(x-y,0)
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    x − y = 0
    SymPy 中的求解器模块提供了 soveset() 函数,其原型如下 -
    
    solveset(equation, variable, domain)
    
    默认情况下,域是 S.Complexes。使用 solveset() 函数,我们可以求解代数方程如下 -
    
    >>> solveset(Eq(x**2-9,0), x)
    
    获得以下输出 -
    {−3, 3}
    
    >>> solveset(Eq(x**2-3*x, -2),x)
    
    执行上述代码片段后获得以下输出 -
    {1,2}
    solveset 的输出是解的 FiniteSet。如果没有解决方案,则返回 EmptySet
    
    >>> solveset(exp(x),x)
    
    执行上述代码片段后获得以下输出 -
    $$\varnothing$$
  • 线性方程

    我们必须使用 linsolve() 函数来求解线性方程组。
    例如,方程式如下 -
    xy=4
    x+y=1
    
    >>> from sympy import * 
    >>> x,y=symbols('x y') 
    >>> linsolve([Eq(x-y,4),Eq( x + y ,1) ], (x, y))
    
    执行上述代码片段后获得以下输出 -
    $$\lbrace(\frac{5}{2},-\frac{3}{2})\rbrace$$
    linsolve() 函数还可以求解以矩阵形式表示的线性方程。
    
    >>> a,b=symbols('a b') 
    >>> a=Matrix([[1,-1],[1,1]]) 
    >>> b=Matrix([4,1]) 
    >>> linsolve([a,b], (x,y))
    
    如果我们执行上面的代码片段,我们会得到以下输出 -
    $$\lbrace(\frac{5}{2},-\frac{3}{2})\rbrace$$
  • 非线性方程

    为此,我们使用 nonlinsolve() 函数。这个例子的方程 -
    a 2 +a=0 ab=0
    
    >>> a,b=symbols('a b') 
    >>> nonlinsolve([a**2 + a, a - b], [a, b])
    
    如果我们执行上面的代码片段,我们会得到以下输出 -
    $$\lbrace(-1, -1),(0,0)\rbrace$$
  • 微分方程

    首先,通过将 cls=Function 传递给 symbols 函数来创建一个未定义的函数。要求解微分方程,请使用 dsolve。
    
    >>> x=Symbol('x') 
    >>> f=symbols('f', cls=Function) 
    >>> f(x)
    
    执行上述代码片段后获得以下输出 -
    f(x)
    这里 f(x) 是一个未计算的函数。它的导数如下 -
    
    >>> f(x).diff(x)
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$\frac{d}{dx}f(x)$$
    我们首先创建对应于以下微分方程的 Eq 对象
    
    >>> eqn=Eq(f(x).diff(x)-f(x), sin(x)) 
    >>> eqn
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$-f(x) + \frac{d}{dx}f(x)= \sin(x)$$
    
    >>> dsolve(eqn, f(x))
    
    上面的代码片段给出了与下面的表达式等效的输出 -
    $$f(x)=(c^1-\frac{e^-xsin(x)}{2}-\frac{e^-xcos(x)}{2})e^x$$