Python的SymPy模块

您所在的位置:网站首页 assumption函数 Python的SymPy模块

Python的SymPy模块

2023-03-24 08:19| 来源: 网络整理| 查看: 265

计算机直接对数学符号进行正确的计算称为符号计算。符号计算也称为计算机代数。SymPy是Python版的开源计算机代数系统实现,是使用纯Python代码,没有第三方库。SymPy开发是Ondrej Certik从2006年8月开始的,此后不断有开发者加入项目,规模达到几百人。现在这个程序库包括26个模块,可以满足常用的计算需求,如符号计算、积分、代数、离散数学、量子物理、画图与打印等,计算结果输出为LaTeX或其他格式。 SymPy程序库分为一个核心模块和多个高级可选模块: ·Assumptions:假设引擎 ·Concrete:符号积和符号总和 ·Core basic class structure:基本的,及加、乘、指数等 ·Functions:基本的函数和特殊的函数 ·Galgebra:几何代数 ·Geometry:几何实体 ·Integrals:符号积分 ·Interactive:交互会话 ·Logic:布尔代数和定理证明 ·Matrices:线性代数和矩阵 ·mpmath:快速的任意精度的数值运算 ·ntheory:数论函数 ·Parsing:数学的和最大化的句法分析 ·Physics:物理单位和量子相关 ·Plotting:用Pyglet进行二维和三维画图 ·Polys:多项式代数和因式分解 ·Printing:漂亮的打印和代码生成 ·Series:符号极限和截断的序列 ·Simplify:用其他形式改写表达式 ·Solvers:代数、循环和差分 ·Statistics:标准概率分布 ·Utilities:测试架构和兼容性相关的内容 SymPy包括很多功能,从基本符号算术到多项式、微积分、求解方程、离散数学、几何、统计和物理,主要处理整型数据、实数和有理数三种类型数据,整数是不带小数点的数字,实数是带小数点的数字,有理数包括分子和分母,用Ration类定义有理数,该类需要两个数字。SymPy的核心功能是基本的算术、扩展、简化、替换、模式匹配和各种函数。

1. 符号、表达式和基本运算:

1)符号的定义: 在SymPy中,在任何表达式中使用符号前,必须先定义该符号,定义符号只需要用Symbol类中的symbol来定义一个符号即可。示例: from __future__ import division from sympy import * x,y,z=symbols('x y x') m0,m1,m2,m3,m4=symbols('m0:5') x1=Symbol('x1') print(x1+500) y=22/7 代码中使用symbol只生成一个符号;生成多个符号使用symbols,可以用空格分隔多个符号名,也可以使用冒号:生成一个系列,冒号前是第一个值,冒号后是生成符号的数量。 2)将SymPy对象的数值转换为近似浮点值: 可以用evalf()和n()来获得任何对象的浮点近似值,默认的精度是15位有效数字,而且可以通过调整参数改为任何想要的精度。示例: from __future__ import division from sympy import sin,pi x=sin(50) print(pi.evalf()) print(pi.evalf(50)) # 50位有效数字 print(x.n()) print(x.n(20)) # 20位有效数字 3)表达式的常用操作: 表达式可以使用collect、expand、factor、simplify和subs等操作。示例: from sympy import collect,expand,factor,simplify from sympy import Symbol,symbols from sympy import sin,cos x,y,a,b,c,d=symbols('x y a b c d') expr=5*x**2+2*b*x**2+cos(x)+51*x**2 simplify(expr) factor(x**2+x-30) expand((x-5)*(x+6)) collect(x**3+a*x**2+b*x**2+c*x+d,x) expr=sin(x)*sin(x)+cos(x)*cos(x) print(expr) print(expr.subs({x:5,y:25})) print(expr.subs({x:5,y:25}).n())

2. 求解方程:

solve可以求解各种类型的方程,需要待解的表达式和变量两个输入参数。示例: from sympy import solve,symbols a,b,c,x,y=symbols('a b c x y') solve(6*x**2-3*x-30,x) solve(a*x**2+b*x+c,x) substitute_solution=solve(a*x**2+b*x+c,x) print([substitute_solution[0].subs({'a':6,'b':-3,'c':-30}),  substitute_solution[1].subs({'a':6,'b':-3,'c':-30})]) # [5/2, -2] print(solve([2*x+3*y-3,x-2*y+1],[x,y])) # {x: 3/7, y: 5/7} 还有另一种形式的solve方法,将一系列方程作为第一个输入参数,将未知数列表作为第二个参数: from sympy import solve,symbols x,y=symbols('x y') print(solve([2*x+y-4,5*x-3*y],[x,y])) # {x: 12/11, y: 20/11} print(solve([2*x+2*y-1,2*x-4*y],[x,y])) # {x: 1/3, y: 1/6}

3. 有理数、指数和对数函数:

SymPy有很多函数可以用于处理有理数,可以对有理数做简化、扩展、合并、拆分等操作,用于计算两个有理数的加法使用together函数,计算有理数的除法用到apart函数。SymPy还支持一些指数和对数操作,log用于计算以b为底的对数,ln用于计算以e为底的自然对数,log10用于计算以10为底的对数。 from sympy import together,apart,symbols,exp,log,ln import mpmath x1,x2,x3,x4,x=symbols('x1 x2 x3 x4 x') x1/x2+x3/x4 print(together(x1/x2+x3/x4)) # (x1*x4 + x2*x3)/(x2*x4) print(apart((2*x**2+3*x+4)/(x+1))) # 2*x + 1 + 3/(x + 1) print(together(apart((2*x**2+3*x+4)/(x+1)))) # (2*x*(x + 1) + x + 4)/(x + 1)) print(exp(1)) print(log(4).n()) print(log(4,4).n()) print(ln(4).n()) print(mpmath.log10(4))

4. 多项式:

SymPy允许定义和执行多项式的各种操作,还可以求解多项式的根。为了检查两个多项式是否相等,要使用simplify函数。 from sympy import * p,q,x=symbols('p q x') p=(x+4)*(x+2) q=x**2+6*x+8 print(simplify(p-q)==0) # True

5. 三角函数和复数:

模块提供了从角度到弧度的转换,除了sin、cos、tan这些基本的三角函数,还有简化和扩展的三角函数。SymPy还支持在不存在实数解时的复数解。 from sympy import * x,y=symbols('x y') expr=sin(x)*cos(y)+cos(x)*sin(y) expr_exp=exp(5*sin(x)**2+4*cos(x)**2) print(trigsimp(expr)) # sin(x + y) print(trigsimp(expr_exp)) # exp(sin(x)**2 + 4) print(expand_trig(sin(x+y))) # sin(x)*cos(y) + sin(y)*cos(x) print(solve(x**2+4,x)) # [-2*I, 2*I]

6. 线性代数:

SymPy线性代数模块中的函数包括对矩阵的各种操作,例如快速特殊矩阵的构建、特征值、特征向量、转置、行列式的值和逆。有三个快速生成特殊矩阵的函数,sye、zeros和ones,eye生成一个实体矩阵,而zeros和ones生成的矩阵的全部元素分别是0和1。基本算术运算有+、-、*和**也能用于矩阵,还可以删除矩阵中某些选中的行和列。 from sympy import * A=Matrix([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]) A.row_del(3) A.col_del(3) print(A[0,1]) print(A[0:2,0:3]) B=Matrix([[1,2,3],[5,6,7],[9,10,11]]) A.row_join(B) B.col_join(B) print(A+B) print(A-B) print(A*B) print(A**2) print(eye(3)) print(zeros(3,3)) print(ones(3,3)) print(A.transpose()) M=Matrix([[1,2,3],[4,5,6],[7,8,10]]) print(A.det()) 默认情况下,矩阵的逆都是用高斯消元法计算得出,也可以指定用LU分解法来计算。SymPy有很多方法可以用来计算简化的行阶梯型(rref函数)和零空间(nullspace函数)。如果A是一个矩阵,那么nullspace就是所有向量v的集合,满足Av=0,还可以对矩阵元素做替换操作。 from sympy import * A=Matrix([[1,2],[3,4]]) A.inv() print(A.inv()*A) print(A*A.inv()) A=Matrix([[1,-2],[-2,3]]) print(A.eigenvals())               # solve(det(A-eye(2)*x),x) print(A.eigenvects()) print(A.rref()) print(A.nullspace()) x=Symbol('x') M=eye(3)*x print(M.subs(x,4)) y=Symbol('y') print(M.subs(x,y)) print(M.inv()) print(M.inv('LU')) A=Matrix([[1,2,1],[2,3,3],[1,3,2]]) Q,R=A.QRdecomposition() print(Q) M=[Matrix([1,2,3]),Matrix([3,4,5]),Matrix([5,7,8])] result1=GramSchmidt(M) result2=GramSchmidt(M,True)

7. 微积分:

微积分操作包括极限、导数、序列的求和以及积分。求极限问题的示例: from sympy import limit,oo,symbols,exp,sin,cos print(oo+5) # oo print(6700>和b ab b



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3