zoukankan      html  css  js  c++  java
  • Python科学计算库SymPy初探

    SymPy基础应用

     

    SymPy基础应用

     

    Rational值

    SymPy 具有用于处理有理数的Rational。 有理数是可以表示为两个整数(分子 p 和非零分母 q)的商或分数 p / q 的任何数字。

    In [1]:
    from sympy import Rational
    
    r = Rational(1/10)
    
    val = r * 3
    print(val.evalf())
    
    val2 = 1/10 * 3
    print(val2)
    
     
    0.300000000000000
    0.30000000000000004
    
    In [2]:
    print(type(val))
    print(type(val2))
    
     
    <class 'sympy.core.numbers.Rational'>
    <class 'float'>
    
    In [3]:
    print(val.evalf())
    print(val2)
    
     
    0.300000000000000
    0.30000000000000004
    
     

    SymPy pprint

    pprint()用于在控制台上漂亮地打印输出。 LaTeX 可以达到最佳效果,例如 在 Jupyter 笔记本中。

    prettify.py

    In [4]:
    from sympy import pprint, Symbol, exp, sqrt
    from sympy import init_printing
    
    init_printing(use_unicode=True)  # 对于某些字符,我们需要启用 unicode 支持
    
    x = Symbol('x')
    
    a = sqrt(2)
    pprint(a)
    print(a)
    
    print("------------------------")
    
    c = (exp(x) ** 2)/2
    pprint(c)
    print(c)
    
     
    √2
    sqrt(2)
    ------------------------
     2⋅x
    ℯ   
    ────
     2  
    exp(2*x)/2
    
     

    平方根

    平方根是一个数字,乘以它会产生指定的数量。

    In [5]:
    from sympy import sqrt, pprint, Mul
    
    x = sqrt(2)
    y = sqrt(2)
    
    pprint(Mul(x,  y, evaluate=False))  # 使用evaluate属性推迟对乘法表达式的求值。
    print('equals to ')
    print(x * y)
    
     
    √2⋅√2
    equals to 
    2
    
    In [6]:
    Mul(x,y)
    
    Out[6]:
    $displaystyle 2$
     

    SymPy 符号

    符号计算适用于符号,以后可以对其进行求值。 使用符号之前,必须在 SymPy 中定义符号。

    In [7]:
    from sympy import Symbol, symbols
    from sympy.abc import x, y
    
    expr = 2*x + 5*y
    print(expr)
    
    a = Symbol('a')
    b = Symbol('b')
    
    expr2 = a*b + a - b
    print(expr2)
    
    i, j = symbols('i j')
    expr3 = 2*i*j + i*j
    print(expr3) 
    
     
    2*x + 5*y
    a*b + a - b
    3*i*j
    
     

    from sympy.abc import x, y 可以从sympy.abc模块导入符号。 它将所有拉丁字母和希腊字母导出为符号,因此我们可以方便地使用它们。

     

    SymPy 规范表达形式

    SymPy 会自动将表达式转换为规范形式。 SymPy 仅执行廉价操作; 因此,表达式可能无法求值为最简单的形式。

    In [8]:
    from sympy.abc import a, b
    expr = b*a + -4*a + b + a*b + 4*a + (a + b)*3
    print(expr)
    
     
    2*a*b + 3*a + 4*b
    
     

    SymPy 扩展代数表达式

    使用expand(),我们可以扩展代数表达式; 即该方法尝试消除幂和乘法。

    In [9]:
    from sympy import expand, pprint
    from sympy.abc import x
    
    expr = (x + 1) ** 2
    
    pprint(expr)
    
    print('-----------------------')
    print('-----------------------')
    
    expr = expand(expr)
    pprint(expr)
    
     
           2
    (x + 1) 
    -----------------------
    -----------------------
     2          
    x  + 2⋅x + 1
    
     

    SymPy 简化表达式

    可以使用simplify()将表达式更改为更简单的形式。

    In [10]:
    from sympy import sin, cos, simplify, pprint
    from sympy.abc import x,y
    
    expr = sin(x+y) / (sin(y)*cos(x))
    
    pprint(expr)
    
    print('-----------------------')
    
    expr = simplify(expr)
    pprint(expr)
    
     
      sin(x + y) 
    ─────────────
    sin(y)⋅cos(x)
    -----------------------
    tan(x)    
    ────── + 1
    tan(y)    
    
     

    SymPy 比较表达式

    SymPy 表达式与equals()而不是==运算符进行比较。

    In [11]:
    from sympy import pprint, Symbol, sin, cos
    
    x = Symbol('x')
    
    a = cos(x)**2 - sin(x)**2
    b = cos(2*x)
    
    print(a.equals(b)) #  在应用该方法之前,SymPy 尝试简化表达式。
    
    # we cannot use == operator
    print(a == b)
    
     
    True
    False
    
     

    SymPy 求值表达式

    可以通过替换符号来求值表达式。

    In [12]:
    from sympy import pi
    print(pi.evalf(10))  # 保留十位有效数字
    
     
    3.141592654
    
    In [13]:
    # 通过用数字替换a和b符号来求值表达式
    from sympy.abc import a, b
    from sympy import pprint
    expr = b*a + -4*a + b + a*b + 4*a + (a + b)*3
    print(expr.subs([(a, 3), (b, 2)]))
    
     
    29
    
     

    SymPy 求解方程

    solve()solveset()求解方程。

    In [14]:
    from sympy import Symbol, solve
    x = Symbol('x')
    sol = solve(x**2 - x, x)
    print(sol)
    
     
    [0, 1]
    
     

    solve()的第一个参数是公式。 该公式以适合 SymPy 的特定形式编写; 即x**2 - x代替x**2 = x。 第二个参数是我们需要解决的符号。

    或者,我们可以将Eq用于公式。

    In [15]:
    from sympy import pprint, Symbol, Eq, solve
    x = Symbol('x')
    eq1 = Eq(x + 1, 4)
    pprint(eq1)
    sol = solve(eq1, x)
    print(sol)
    
     
    x + 1 = 4
    [3]
    
    In [16]:
    from sympy.solvers import solveset
    from sympy import Symbol, Interval, pprint
    
    x = Symbol('x')
    
    sol = solveset(x**2 - 1, x, Interval(0, 50))
    print(sol)
    
     
    {1}
    
     

    使用solveset(),我们找到了给定间隔的解决方案。

     

    SymPy 序列

    序列是其中允许重复的对象的枚举集合。 序列可以是有限的或无限的。 元素的数量称为序列的长度。 与集合不同,同一元素可以在序列中的不同位置出现多次。 元素的顺序很重要。

    In [17]:
    from sympy import summation, sequence, pprint
    from sympy.abc import x
    
    s = sequence(x, (x, 1, 10))
    print(s)
    pprint(s)
    print(list(s))
    
    print(s.length)
    
    print(summation(s.formula, (x, s.start, s.stop)))
    # print(sum(list(s)))
    
     
    SeqFormula(x, (x, 1, 10))
    [1, 2, 3, 4, …]
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    10
    55
    
     

    SymPy 极限

    极限是函数(或序列)“接近”作为输入(或索引)“接近”某个值的值。

    In [18]:
    from sympy import sin, limit, oo
    from sympy.abc import x,y
    
    l1 = limit(1/x, x, oo)
    print(l1)
    
    l2 = limit(exp(x)/(y), x, 1)
    print(l2)
    
     
    0
    E/y
    
     

    SymPy 矩阵

    在 SymPy 中,我们可以使用矩阵。 矩阵是数字或其他数学对象的矩形数组,为其定义了运算(例如加法和乘法)。

    矩阵用于计算,工程或图像处理。

    In [19]:
    from sympy import Matrix, pprint
    
    M = Matrix([[1, 2], [3, 4], [0, 3]])
    print(M)
    pprint(M)
    
    N = Matrix([2, 2])
    
    print("---------------------------")
    print("M * N")
    print("---------------------------")
    
    pprint(M*N)
    
     
    Matrix([[1, 2], [3, 4], [0, 3]])
    ⎡1  2⎤
    ⎢    ⎥
    ⎢3  4⎥
    ⎢    ⎥
    ⎣0  3⎦
    ---------------------------
    M * N
    ---------------------------
    ⎡6 ⎤
    ⎢  ⎥
    ⎢14⎥
    ⎢  ⎥
    ⎣6 ⎦
    
     

    SymPy 绘图

    SymPy 包含用于绘图的模块。 它基于 Matplotlib 构建。

    In [20]:
    import sympy
    from sympy.abc import x
    from sympy.plotting import plot
    plot(sin(x))
    
     
    <Figure size 640x480 with 1 Axes>
    Out[20]:
    <sympy.plotting.plot.Plot at 0x227ddeceec8>
     

    一元函数的导函数

    In [21]:
    from sympy import *
    x = symbols('x')
    expr = sin(x) * exp(x)
    pprint(diff(expr, x))
    
     
     x           x       
    ℯ ⋅sin(x) + ℯ ⋅cos(x)
    
     

    求不定积分

    In [22]:
    from sympy import *
    x = symbols('x')
    expr = exp(x) * sin(x) + exp(x) * cos(x)
    pprint(integrate(expr, x))
    
     
     x       
    ℯ ⋅sin(x)
    
     

    求定积分

    In [23]:
    from sympy import *
    x = symbols('x')
    expr = exp(x) * sin(x) + exp(x) * cos(x)
    pprint(integrate(expr, x, (x,-oo,oo)))
    
     
    <-∞, ∞>
    
     

    求微分方程的解

    In [24]:
    from sympy import *
    y = Function('y')
    t = Symbol('t')
    sol = dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t))
    print(sol)
    
     
    Eq(y(t), C2*exp(-t) + (C1 + t/2)*exp(t))
    
     

    打印latex公式

    In [25]:
    from sympy import *
    x = symbols('x')
    expr = cos(x)**2
    latex(Integral(expr, (x, 0, pi)))
    
    Out[25]:
    '\int\limits_{0}^{\pi} \cos^{2}{\left(x \right)}\, dx'
    In [26]:
    latex(expr)
    
    Out[26]:
    '\cos^{2}{\left(x \right)}'
    In [27]:
    pprint(Integral(expr, (x, 0, pi)))
    
     
    π           
    ⌠           
    ⎮    2      
    ⎮ cos (x) dx
    ⌡           
    0           
    
     
  • 相关阅读:
    ConcurrentHashMap实现原理--转载
    java原子操作的实现原理--转载
    Catch Me If You ... Can't Do Otherwise--转载
    微框架spark--api开发利器
    Exploring Micro-frameworks: Spring Boot--转载
    简约之美jodd--props属性使用
    jodd-cache集锦
    java根据url获取完整域名
    Jodd-vtor验证框架
    倒排列表求交集算法 包括baeza yates的交集算法
  • 原文地址:https://www.cnblogs.com/louis6575/p/12496702.html
Copyright © 2011-2022 走看看