python科学计算代码库_Python干货之科学计算工具SymPy大全

Sympy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。官方在线文档:Welcome to SymPy’s documentation!

sympy库安装:pip3 install sympy

SymPy内置符号虚数单位I

>>> import sympy

>>> I

I

>>> I ** 2

-1

>>> sqrt(-1)

I

自然对数的底E

>>> import sympy

>>> E

E

>>> #取对数

>>> log(E)

1

无穷大oo

>>> import sympy

>>> oo

oo

>>> oo > 9999999

True

>>> 1/oo

0

>>> oo+12

oo

圆周率pi

>>> import sympy

>>> pi

pi

>>> pi**2

pi**2

>>> pi.evalf()

3.14159265358979

>>> sin(pi/2)

1

SymPy基础应用

数学格式输出:

init_printing()

添加变量:

x, y, z, a, b, c = symbols('x y z a b c')

声明分数:

Rational(1, 3)

化简式子:

simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))

因式分解:

expand((x + 2)*(x - 3))

提取公因式:

factor(x**3 - x**2 + x - 1)

约分:

cancel((x**2 + 2*x + 1)/(x**2 + x))

裂项:

apart((4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x))

变换形式:

tan(x).rewrite(sin)

数列求和:

Sum(x ** 2, (x, 1, a)).doit()

数列求积:

Product(x**2,(x, 1, a)).doit()

微积分

求导:

diff(cos(x), x)

求高阶导:

diff(x**4, x, 3)

连续求偏导:

diff(exp(x*y*z), x, y, 2, z, 4)

不定积分:

integrate(cos(x), x)

定积分:

integrate(exp(-x), (x, 0, oo))

多重积分:

integrate(exp(-x**2 - y**2), (x, -oo, oo), (y, -oo, oo))

极限:

limit(sin(x)/x, x, 0)

泰勒展开(到第4阶):

sin(x).series(x, 0, 4)

泰勒展开(在x=6处):

exp(x - 6).series(x, 6)

矩阵

矩阵求逆:

Matrix([[1, 3], [-2, 3]])**-1

求转置:

Matrix([[1, 2, 3], [4, 5, 6]]).T

生成单位矩阵:

eye(3)

求行列式:

Matrix([[1, 0, 1], [2, -1, 3], [4, 3, 2]]).det()

化成行阶梯形矩阵:

Matrix([[1, 0, 1, 3], [2, 3, 4, 7], [-1, -3, -3, -4]]).rref()

求列向量空间:

Matrix([[1, 1, 2], [2 ,1 , 3], [3 , 1, 4]]).columnspace()

M = Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]])

求特征值:

M.eigenvals()

求特征向量:

M.eigenvects()

求对角化矩阵,返回两个矩阵P、D满足PDP−1=MPDP−1=M:

M.diagonalize()

解方程

求解集:

solveset(x**2 - x, x)

求解集(显示多少个重根):

roots(x**3 - 6*x**2 + 9*x, x)

求解集(用Eq构造等式):

solveset(Eq(sin(x), 1), x, domain=S.Reals)

解线性方程组:

linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))

解线性方程组(矩阵表示):

linsolve(Matrix(([1, 1, 1, 1], [1, 1, 2, 3])), (x, y, z))

解非线性方程组:

nonlinsolve([exp(x) - sin(y), 1/y - 3], [x, y])

解微分方程:

f, g = symbols('f g', cls=Function)

dsolve(Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x)), f(x))

解不等式组:

from sympy.solvers.inequalities import *

reduce_inequalities([x <= x ** 2], [x])

逻辑代数

from sympy.logic.boolalg import *

合取范式:

to_cnf(~(x | y) | z)

析取范式:

to_dnf(x & (y | z))

化简逻辑函数:

simplify_logic((~x & ~y & ~z) | ( ~x & ~y & z))

from sympy.logic import *

化简最小项之和为析取范式

minterms = [0, 7]

SOPform([x, y, z], minterms)

化简最小项之和为合取范式

minterms = [[1, 0, 1], [1, 1, 0], [1, 1, 1]]

POSform([x, y, z], minterms)

化简最小项之和为析取范式(第7项任取)

minterms = [[1, 0, 1], [1, 1, 0]]

dontcares = [7]

SOPform([x, y, z], minterms, dontcares)

数论

from sympy.ntheory import *

阶乘:

factorial(10)

分解质因数:

factorint(300)

factorint(300, visual=True)

求欧拉函数:

totient(25)

判断质数:

isprime(101)

True

莫比乌斯函数:

mobius(13 * 17 * 5)

-1

乘法逆元(模后者意义):

mod_inverse(3, 5)

2

from sympy.ntheory.factor_ import *

求因子:

divisors(36)

[1, 2, 3, 4, 6, 9, 12, 18, 36]

from sympy.ntheory.modular import *

中国剩余定理解同余方程(模数需互质,前三个数为模数,后三个数为余数,返回第一个数为结果):

crt([99, 97, 95], [49, 76, 65])

(639985, 912285)

解同余方程(模数不需互质但比中国剩余定理慢,每个元组第一个数为余数,第二个数为模数,返回第一个数为结果):

solve_congruence((2, 3), (3, 5), (2, 7))

(23, 105)

from sympy.ntheory.residue_ntheory import *

求原根(如下2在模19意义下的所有幂占满了0到18):

primitive_root(19)

2

求离散对数(如下73mod15=4173mod15=41):

discrete_log(41, 15, 7)

3

总结

越研究越发现SymPy的强大,相信在科学计算方面SymPy已经能够解决日常遇到的多数计算问题了。本文列出的也只是其用法的一部分,更多的功能可以去SymPy的官网查找。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值