SymPy是一个Python的科学计算库,用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题。
import sympy
1. 定义变量和表达式
1.1 定义一个Symbol类型的变量。
symbols("变量名", 变量类型)
# 定义1个变量x
x = symbols('x')
# 定义多个变量
x, y, z = symbols('x, y, z')
# 定义正数
x, y = symbols('x, y', positive=True)
# 定义实数
x, y = symbols('x, y', real=True)
# 定义整数
x, y = symbols('x, y', integer=True)
SymPy定义的变量在计算中可以放在表达式中输出。
from sympy import *
x = symbols("x")
print(x + 1)
输出:
x + 1
1.2 使用字符串定义表达式
from sympy import *
x, = symbols("x,")
str_ = "x**2 + 1"
expr = sympify(str_)
print(expr)
输出:
x**2 + 1
1.3 创建有理数
Rational(分子, 分母)
from sympy import *
expr = Rational(1, 3)
print(expr)
输出:
1/3
2. 替换
将表达式中的变量替换成其他变量、表达式或代入具体数值计算。可以传入列表进行多个变量同时替换。
subs(原变量, 要替换的值)
from sympy import *
x, y = symbols("x, y")
expr = x**2 + 1
print(expr)
expr = expr.subs(x, y)
print(expr)
expr = expr.subs(y, 4)
print(expr)
输出:
x**2 + 1 y**2 + 1 17
3. 输出值
SymPy输出数字时,默认输出化简后的代数表达式。如果想要输出float,使用evalf:
expr.evalf()
参数可选,为精确到小数点后位数
from sympy import *
x = symbols("x")
expr = sqrt(8)
print(expr)
expr = expr.evalf()
print(expr)
print(pi.evalf(20))
?输出:
2*sqrt(2) 2.82842712474619 3.1415926535897932385
4. 计算多点处的函数值
将多个自变量映射到同一个函数上,求出多个函数值。
lambdify(x, f(x), "numpy") 输出类型为NumPy
返回值为一个函数,函数的参数可以是numpy数组,求得对应的函数值。
import numpy as np
from sympy import *
a = np.arange(10)
expr = x**2
f = lambdify(x, expr, "numpy")
print(f(a))
输出:
[ 0? 1? 4? 9 16 25 36 49 64 81]
5. 判断相等
==判断两个表达式是否完全相等。要判断函数是否相等,可以使用equals。
expr1.equals(expr2)
返回值:相等返回True,否则返回False
?例:判断 与 是否相等。
from sympy import *
expr1 = cos(x)**2 - sin(x)**2
expr2 = cos(2*x)
print(expr1 == expr2)
print(expr1.equals(expr2))
?输出:
False True
6. 常数
pi 圆周率
E 自然对数
oo 正无穷大
7. 化简/展开表达式
7.1 simplify可以智能选择一种最好的方法进行表达式化简。实际开发中,如果已知需要使用哪种化简方法,建议指定化简方法以节省程序运行时间。
from sympy import *
x = symbols("x")
print(simplify(sin(x) ** 2 + cos(x) ** 2))
print(simplify((x ** 2 - 1) / (x + 1)))
输出:
1 x - 1
7.2?expand可以展开表达式。
from sympy import *
x = symbols("x")
print(expand((x + 1) ** 2))
输出:
x**2 + 2*x + 1
7.3? factor可以进行多项式的因式分解。
from sympy import *
x = symbols("x")
print(factor(x**2 + 2*x + 1))
输出:
(x + 1)**2?
7.4 collect可以收集多项式中相同次幂的项。
from sympy import *
x, y = symbols("x, y")
expr = 3 * x ** 2 + y * x ** 2 + 1
print(expr)
print(collect(expr, x))
输出:
x**2*y + 3*x**2 + 1 x**2*(y + 3) + 1
7.5?cancel将任意有理函数转换为标准分式形式。
from sympy import *
x = symbols("x")
expr = (x ** 2 + 2 * x + 1) / (x ** 2 + x)
print(expr)
print(cancel(expr))
输出:
(x**2 + 2*x + 1)/(x**2 + x) (x + 1)/x
7.6?apart对有理式进行裂项分解。
from sympy import *
x = symbols("x")
expr = (x ** 2 - 1) / x
print(expr)
print(apart(expr))
输出:
(x**2 - 1)/x x - 1/x
7.7? trigsimp可以通过三角恒等式简化三角函数。
from sympy import *
x = symbols("x")
expr = trigsimp(sin(x) * tan(x) / sec(x))
print(expr)
输出:
sin(x)**2
7.8?expand_trig可以展开三角函数。
from sympy import *
x = symbols("x")
expr = expand_trig(sin(2 * x))
print(expr)
输出:
2*sin(x)*cos(x)
?7.9 powsimp可以简化幂函数(将 、 化为 、 )。??
from sympy import *
x, a, b = symbols("x, a, b")
expr = powsimp(x ** a * x ** b)
print(expr)
输出:
x**(a + b)
7.10? expand_power_exp可以将幂函数 转化为 的形式。
from sympy import *
x, a, b = symbols("x, a, b")
expr = expand_power_exp(x ** (a + b))
print(expr)
?输出:
x**a*x**b
?7.11 expand_power_base可以将幂函数 转化为 的形式。
from sympy import *
x, y, a = symbols("x, y, a")
expr = expand_power_base((x * y) ** a)
print(expr)
?输出:
(x*y)**a
?7.12 powdenest可以将幂函数 转化为 的形式。
from sympy import *
x, a, b = symbols("x, a, b")
expr = powdenest((x ** a) ** b)
print(expr)
?输出:
(x**a)**b
7.13 expand_log可以将对数函数 、 展开为 、 的形式。注:log代表自然对数。
log(真数, 底数)
from sympy import *
x, y = symbols("x, y")
expr1 = expand_log(log(x ** 3), force=True)
expr2 = expand_log(log(x * y), force=True)
print(expr1)
print(expr2)
?输出:
3*log(x) log(x) + log(y)
?7.14 logcombine?可以将对数函数? 、 ?展开为 、 ?的形式。
from sympy import *
x, y = symbols("x, y")
expr1 = logcombine(3 * log(x), force=True)
expr2 = logcombine(log(x) + log(y), force=True)
print(expr1)
print(expr2)
输出:
log(x**3) log(x*y)
8. 内置函数
factorial(n) 阶乘
gamma(n) gamma函数
binomial(总数, 个数) 组合
|