zoukankan      html  css  js  c++  java
  • Python圈中的符号计算库-Sympy(转载)

    《本文来自公众号“大邓带你玩python”,转载》

    import math
    
    math.sqrt(8)
    
    2.8284271247461903

    我们看看Python中结果

    math.sqrt(8).math.sqrt(8)
    
    8.000000000000002

    本以为会得到8.0,但没想到得到8.000000000000002

    一、为什么会这样?

    如果我们平常计算的任务常常有类似于上面的例子这样的表达式,那么直接用python计算其结果只是真实值的逼近。如果这样的计算很大很多,误差会逐渐积累,这是我们不能忍受的,所以这时候就需要Python能处理这种数学符号计算。

    二、什么是数学符号计算?

    数学符号计算能处理表征数字的符号计算。这意味着数学对象被精确地表示,而不是近似地表示,而具有未被计算的变量的数学表达式被留在符号形式中。

    sympy库简介

    Sympy是Python的一个数学符号计算库。它目的在于成为一个富有特色的计算机代数系统。它保证自身的代码尽可能的简单,且易于理解,容易扩展。Sympy完全由Python写成,不需要额外的库。

    sympy的表达式与我们平常的手写的数学表达式略微有所区别,下面是sympy的方程表示符号

    • 加号  +
    • 减号  -
    • 除号  /
    • 乘号  *
    • 等号  Eq()
    • 指数  **
    • 对数  log()
    • e的指数次幂  exp()

    上面的例子我们用Python实现一下。

    import sympy
    
    sympy.sqrt(8)
    
    2*sqrt(2)

    用sympy计算

    sympy.sqrt(8)*sympy.sqrt(8)
    
    8

    三、简单学一下sympy中的几个实例

    • 定义数学符号(类似于数学中的变量)
    • 展开与折叠
    • 简化表达式
    • 解方程
    • 赋值计算
    • log计算
    • 导数
    • 积分
    • 求极限

    3.1  定义数学符号

    让我们定义一个符号表达式代表数学表达式 x+2yx+2y。首先我们要注意到python中的变量必须赋值才能使用,所以无法表达该数学表达式。所以这里一定要引入特殊的符号,这里有两种方法

    • 方法一
    from sympy import symbols
    
    x,y = symbols('x y')
    expr = x + 2*y
    
    expr
    x + 2*y
    • 方法二
    from sympy.abc import x,y
    
    expr2 = x + 2*y
    
    expr2
    x + 2*y

    **当数学表达式中的变量不是x,y这种单一字符,而是result这种多个字符长度的变量时,只能用方法一。

    3.2 展开与折叠

    from sympy import expand,factor
    from sympy.abc import x,y
    
    expr = x**2+x*y+3*x
    
    expr
    x**2 + x*y + 3*x
    • 折叠
    factor(expr)
    
    x**2 + x*y + 3*x
    • 展开
    expr2 = x*(x+y+3)
    expand(expr2)
    x**2 + x*y + 3*x

    3.3 简化表达式

    有时候我们需要简化表达式

    •  普通的化简
    from sympy import simplify
    from sympy.abc import x
    
    simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
    x - 1
    • 三角化简trigsimp
    from sympy import trigsimp,sin,cos
    from sympy.abc import x,y
    y = sin(x)/cos(x)
    
    trigsimp(y)
    tan(x)
    • 指数化简
    from sympy import powsimp
    from sympy.abc import x,a,b
    y = x**a * x**b
    
    y
    x**a*x**b
    
    #指数化简
    powsimp(y)
    x**(a + b)

    3.4 解方程

    注意在python中=是赋值的意思,==虽然表示等于,但是会有很大的问题。在sympy中,我们使用Eq(x,y)表示x=y

    from sympy.abc import x,y
    from sympy import solve,linsolve,Eq
    
    #对一个方程求解,使用solve
    solve(Eq(2*x-1,3), x)
    [2]

    使用linsolve([方程1,方程2,...],(变量1,变量2,...))

    #对多个方程求解,使用linsolve。方程的解为x=-1,y=3
    linsolve([x+2*y-5,2*x+y-1], (x,y))
    
    {(-1, 3)}

    3.5 赋值计算

    from sympy.abc import x,y
    from sympy import sin,cos
    y = sin(x)+cos(x)
    
    y
    sin(x) + cos(x)
    
    y.subs(x, x**2)
    sin(x**2) + cos(x**2)

    这里的赋值,不仅可以实现变量的替换,还可以赋与数字,进行计算。

    y.subs(x, 0)
    1

    3.6 log运算

    from sympy import log,expand_log
    from sympy.abc import x,y,e
    
    #expand_log为展开log,但需要将force=True,展开才能发生
    expand_log(log(x**3), force=True)
    3*log(x)
    
    #expand_log为展开log,但需要将force=True,展开才能发生
    expand_log(log(x**3))
    log(x**3)
    
    expand_log(log(e**x), force=True)
    x*log(e)

    3.7 导数

    from sympy import diff,sin,cos
    from sympy.abc import x,y,z,f
    
    #对sin(x)求导
    diff(sin(x))
    cos(x)
    
    diff(cos(x))
    -sin(x)

    偏导

    #求偏导
    f = 3*x**2*y*z
    
    diff(f, x,y)
    6*x*z

    3.8 积分

    from sympy.abc import pi,x
    from sympy import integrate,sin
    
    integrate(sin(x), (x,0,pi))
    -cos(pi) + 1

    3.9 极限

    from sympy.abc import x
    from sympy import limit
    
    limit(1/x, x, 0, '+')
    oo

    3.10 展开式

    高数中有泰勒展开式,拉格朗日展开式。

    e^x=1+x+x^2/2!+x^3/3!+x^4/4!+...+x^n/n!+o(x^n) 

    比如当n=3时,

    e^x=1+x+x^2/2+o(x^3)

    这里实现的方法是:sympy表达式.series(变量, 0, n)

    from sympy import exp,symbols
    
    x = symbols('x')
    expr = exp(x)
    
    expr.series(x, 0, 3)
    1 + x + x**2/2 + O(x**3)
  • 相关阅读:
    Valid Palindrome
    LeetCode: Path Sum 2
    LeetCode: Path Sum
    LeetCode:Convert Sorted Array to Binary Search Tree
    LeetCode:Convert Sorted List to Binary Search Tree
    LeetCode: Balanced Binary Tree
    LeetCode: Maximum Depth of Binary Tree
    django文件上传,只上传一张
    URLError: <urlopen error [Errno 10061] >
    error: <class 'socket.error'>, [Errno 101] Network is unreachable: file: /usr/local/python2.7.12/lib/python2.7/socket.py line: 575
  • 原文地址:https://www.cnblogs.com/sunshine-blog/p/8477523.html
Copyright © 2011-2022 走看看