Python-Sympy库的基本操作笔记01
视频学习:Bilibili:铜山居士
笔记记录:Bilibili:XLY23333
Python版本:Python311、Python38
一、认识符号运算
(一)体会符号运算
1.math库 对比 sympy库
(1)定义变量为符号
import math
r=5
L=2 #(✓)
L=R #(x)无法提前定义变量为符号
S=math.pi*r**2
print(f"圆的周长是:{L}")
print(f"圆的面积是:{S}")
(2)精确表示和近似值
import math
import sympy
print(round(math.pi),100) #output:3.14...,为有理数,是近似值
print(sympy.pi) #output:π,为准确值(符号表示)
二、sympy基础操作
(一)导入sympy第三方库
Case01: 'sympy.<方法/函数>'调用法
import sympy
#Eg:打印‘π’
print(sympy.pi)
可以更快认清Var和方法/函数的区别,确认是哪个库,可大量使用
Case02: '<方法/函数>'直接调用法
from sympy import *
#Eg:打印‘π’
print(pi)
更方便快捷,少量使用
(二)定义sympy符号
-Below note conditions-下方笔记默认执行在前方
#调入库,下方默认调入过
from sympy import *
#确保SymPy库在打印时使用Unicode字符以提供更美观的数学表达式
init_printing(use_unicode=True)
1.定义单个符号
代码格式:<Var>=symbols('<CN>')
把’CN’(CharName) 赋值给 Var
t=symbols('t')
2.定义多个符号
代码格式:<Var_1>,<Var_2>,...,<Var_n>=symbols('CN01 CN02 ... CNn')
把’CNi’的值赋给Vari
x,y,z=symbols('x y z')
3.定义特殊符号
代码格式:<Var>=symbols('SN')
把’SN’ 赋值给 Var,可以联合定义多个符号同时使用
a=symbols('alpha')
4.定义多个含下角标的连续的符号
代码格式:<Var>=symbols('x_start:end+1')
【右不保留】
分别定义’xstart’:'xend’给Var[start:end]
var=symbols(x_1:5)
print(var) #output:(x_1,x_2,x_3,x_4)
print(var[-1],var[1]) #output:(x_4,x_2)
(三)创建完整的表达式
Eg
x,y,z=symbols('x y z')
expr=cos((x+1)**2)
print(expr) #output:cos((x+1)**2)
(四)替换变量符号(赋值)
代码格式:<symVar>.subs(<VarC>,<Num>)
将symVar中变量符号VarC的值替换成Num
subs操作不影响原sympy变量
Eg01
x,y,z=symbols('x y z')
expr=exp(cos(x))+1
print(expr) #output:exp(cos(x))+1
#替换操作
print(expr.subs(x,0)) #output:1+e
Eg02
t,x=symbols('t x')
expr_1=exp(t)+1
expr_2=cos(x)
expr_new=expr_1.subs(t,expr_2)
print(expr_new) #output:exp(cos(x))+1
Eg03
x,y,z=symbols('x y z')
expr=x**3+4*x*y-z
#多变量替换:列表嵌套元祖
expr_1=expr.subs([(x,2),(y,4),(z,5)])
print(expr_1) #output:35
expr_2=expr.subs([(x,2),(y,4)])
print(expr_2) #output:40-z
(五)字符串表达为sympy表达式
代码格式:<symVar>=sympify(<strVar>)
将字符串strVar表达为sympy表达式并保存到symVar中去
Eg
str_expr='x**2+2*x+1'
expr=sympify(str_expr)
print(expr) #output:x**2+2*x+1
(六)为数值指定精度 和 取整
1.为数值指定精度
代码格式:<symVar>.evalf(<Num>)
Eg01
str_expr='x**2+2*x+1'
expr=sympify(str_expr)
print(expr.subs(x,2)) #output:9
print(expr.subs(x,2)) #output:<Sympy.core.numbers.Integer>
Eg02
expr=sqrt(8)
print(expr) #根号8=2倍根号2
print(expr.evalf(30)) #保留30位小数(银行家舍入法)
print(type(expr.evalf(30))) #output:<Sympy.core.numbers.Float>
print(type(0.001)) #output:<float>
Eg03
x=symbols('x')
expr=cos(2*x)
res=expr.subs(x,2.4)
#在数值替换的同时指定精度
expr.evalf(50,subs={x:2.4}) #用字典传递x的值
2.计算机二进制运算的误差
expr=cos(1)**2+sin(1)**2
print(expr.evalf()) #output:-4.0*10^-124
print(expr.evalf(chop=True)) #output:0
三、sympy的简化操作
Below note conditions下方笔记默认执行在前方
#调入库,下方默认调入过
from sympy import *
#确保SymPy库在打印时使用Unicode字符以提供更美观的数学表达式
init_printing(use_unicode=True)
#设定符号x y z a b c
x,y,z,a,b,c=symbols('x y z a b c')
(一)自动简化simplify
试图用一种智能的方法自动选择合理方法,不需要人为选择方法,适用于大多数的情况但也存在问题。
代码格式:simplify(<symVar>)
Eg01
expr=cos(x)**2+sin(x)**2
print(expr)
print(simplify(expr))
output01
{
d
i
s
p
1
=
cos
2
(
x
)
+
s
i
n
2
(
x
)
d
i
s
p
2
=
1
\begin{cases} {\rm disp1}=\cos^2(x)+sin^2(x)\\ {\rm disp2}=1 \end{cases}
{disp1=cos2(x)+sin2(x)disp2=1
Eg02
expr=(x**3+x**2-x+1)/(x**2+2*x+1)
print(expr)
print(simplify(expr))
output02
{
d
i
s
p
1
=
x
3
+
x
2
−
x
+
1
x
2
+
2
x
+
1
d
i
s
p
2
=
x
−
1
\begin{cases} {\rm disp1}=\dfrac{x^3+x^2-x+1}{x^2+2x+1}\\ {\rm disp2}=x-1 \end{cases}
⎩
⎨
⎧disp1=x2+2x+1x3+x2−x+1disp2=x−1
Eg-Question
expr=x**2+2*x+1
print(expr)
print(simplify(expr))
output-Question
{
d
i
s
p
1
=
x
2
+
2
x
+
1
d
i
s
p
2
=
x
2
+
2
x
+
1
\begin{cases} {\rm disp1}=x^2+2x+1 \\{\rm disp2}=x^2+2x+1 \end{cases}
{disp1=x2+2x+1disp2=x2+2x+1
Q1:对最简的含义不明确,不一定得到想要的结果
Q2:运行时间较长,效率较低
(二)规定化简和转化方式
化简转化方式 | 执行函数 |
---|---|
多项式展开 | expand() |
因式分解 | factor() |
合并同类项 | collect() |
有理分式简化 | cancel() |
部分分式分解 | apart() |
反三角函数 | a<tri_f(x)>() |
三角恒等式化简 | trigsimp() |
三角恒等式展开 | expand_trig() |
x a x b → x a + b x^ax^b\to x^{a+b} xaxb→xa+b | powsimp() |
x a + b → x a x b x^{a+b}\to x^ax^b xa+b→xaxb | expand_power_exp() |
x a y a → ( x y ) a x^ay^a\to(xy)^a xaya→(xy)a | powsimp() |
( x y ) a → x a y a (xy)^a\to x^ay^a (xy)a→xaya | expand_power_base() |
( x a ) b → x a b (x^a)^b\to x^{ab} (xa)b→xab | powdenest() |
1.多项式展开
代码格式:expand(<symVar>)
将表达式转化为简单单项式的和的形式
Eg
print((x+1)**2)
print(expand((x+1)**2))
print(expand((x+2)*(x-3)))
output
{
d
i
s
p
1
=
(
x
+
1
)
2
d
i
s
p
2
=
x
2
+
2
x
+
1
d
i
s
p
3
=
x
2
−
x
−
6
\begin{cases} {\rm disp1}=(x+1)^2 \\{\rm disp2}=x^2+2x+1 \\{\rm disp3}=x^2-x-6 \end{cases}
⎩
⎨
⎧disp1=(x+1)2disp2=x2+2x+1disp3=x2−x−6
2.因式分解
代码格式:factor(<symVar>)
将表达式转化为若干个不能继续分解的表达式乘积
Eg01
print(x**3-x**2+x-1)
print(factor(x**3-x**2+x-1))
print(factor(x**3-y**3))
print(factor(x**3+y**3))
print(factor(x**2*z+4*x*y*z+4*y**2*z))
output01
{
d
i
s
p
1
=
x
3
+
x
2
+
x
−
1
d
i
s
p
2
=
(
x
−
1
)
(
x
2
+
1
)
d
i
s
p
3
=
(
x
−
y
)
(
x
2
+
x
y
+
y
2
)
d
i
s
p
4
=
(
x
+
y
)
(
x
2
−
x
y
+
y
2
)
d
i
s
p
5
=
z
(
x
+
2
y
)
2
\begin{cases} {\rm disp1}=x^3+x^2+x-1 \\{\rm disp2}=(x-1)(x^2+1) \\{\rm disp3}=(x-y)(x^2+xy+y^2) \\{\rm disp4}=(x+y)(x^2-xy+y^2) \\{\rm disp5}=z(x+2y)^2 \end{cases}
⎩
⎨
⎧disp1=x3+x2+x−1disp2=(x−1)(x2+1)disp3=(x−y)(x2+xy+y2)disp4=(x+y)(x2−xy+y2)disp5=z(x+2y)2
如果只对分解后的各个因式感兴趣,可以使用factor_list()
获得一个仅含有因式的结构,由元组嵌套列表嵌套元组构成,最终的元组含有因式和因式的次方两个信息
代码格式:factor_list(<symVar>)
output:factor_list()
(1,[(<factor_1>,<power_1>),(<factor_2>,<power_2>),...])
Eg02
print(factor_list(x**3-y**3))#显示因式结构
print(factor_list(x**3-y**3)[1]) #显示因式list
print(factor_list(x**3-y**3)[1][0][0]) #显示因式list的第一项的内容
print(factor_list(x**3-y**3)[1][0][1])#显示因式list的第一项的次方数
output02
#显示因式结构
(1,[(x - y,1),(x**2 + x*y + y**2,1)])
#显示因式list
[(x - y,1),(x**2 + x*y + y**2,1)]
#显示因式list第一项的内容
x - y
#显示因式list第一项的次方数
1
EX-expand&factor互相转换
expr_1=(cos(x)+sin(x))**2
expr_2=cos(x)**2+2*cos(x)*sin(x)+sin(x)**2
print(expand(expr_1)==expr_2)
print(factor(expr_2)==expr_1)
3.合并同类项
代码格式:collect(<symVar>,<symbol>)
合并表达式中具有相同幂函数的符号
Eg
expr=x*y+x-3+2*x**2-z*x**2+x**3
print(collect(expr,x))
print(collect(expr,z))
output
{
d
i
s
p
1
=
x
3
+
x
2
(
2
−
z
)
+
x
(
y
+
1
)
−
3
d
i
s
p
2
=
x
3
−
x
2
z
+
2
x
2
+
x
y
+
x
−
3
\begin{cases} {\rm disp1}=x^3+x^2(2-z)+x(y+1)-3 \\{\rm disp2}=x^3-x^2z+2x^2+xy+x-3 \end{cases}
{disp1=x3+x2(2−z)+x(y+1)−3disp2=x3−x2z+2x2+xy+x−3
当collect
与coeff
搭配使用时可以输出表达式中特定次方项的系数
代码格式:collect(<symVar>,<symbol>)(<symbol>,<power>)
Eg
print(collect(expr,x).coeff(x,2)) #output:2-z
print(collect(expr,x).coeff(x,1)) #output:y+1
4.有理分式简化
代码格式:cancel(symVar)
将有理分式转化为边准规范形式 p q \frac{p}{q} qp,其中p,q是无公因式的展开多项式,且p,q的系数全部为整数
Eg
expr_1=(x**2+2*x+1)/(x**2+x)
print(expr_1)
print(cancel(expr_1))
expr_2=1/x+(3*x/2-2)/(x-4)
print(expr_2)
print(cancel(expr_2))
expr_3=(x*y**2-2*x*y*z+x*z**2+y**2-2*y*z+z**2)/(x**2-1)
print(expr_3)
print(cancel(expr_3))
output
{
d
i
s
p
1.1
=
x
2
+
2
x
+
1
x
2
+
x
d
i
s
p
1.2
=
x
+
1
x
d
i
s
p
2.1
=
3
x
2
−
2
x
−
4
+
1
x
d
i
s
p
2.2
=
3
x
2
−
2
x
−
8
2
x
2
−
8
x
d
i
s
p
3.1
=
x
y
2
−
2
x
y
z
+
x
z
2
+
y
2
−
2
y
z
+
z
2
x
2
+
1
d
i
s
p
3.2
=
y
2
−
2
y
z
+
z
2
x
−
1
\begin{cases} {\rm disp1.1}=\dfrac{x^2+2x+1}{x^2+x} \\{\rm disp1.2}=\dfrac{x+1}{x} \\{\rm disp2.1}=\dfrac{\frac{3x}{2}-2}{x-4}+\dfrac{1}{x} \\{\rm disp2.2}=\dfrac{3x^2-2x-8}{2x^2-8x} \\{\rm disp3.1}=\dfrac{xy^2-2xyz+xz^2+y^2-2yz+z^2}{x^2+1} \\{\rm disp3.2}=\dfrac{y^2-2yz+z^2}{x-1} \end{cases}
⎩
⎨
⎧disp1.1=x2+xx2+2x+1disp1.2=xx+1disp2.1=x−423x−2+x1disp2.2=2x2−8x3x2−2x−8disp3.1=x2+1xy2−2xyz+xz2+y2−2yz+z2disp3.2=x−1y2−2yz+z2
5.部分分式分解
代码格式:apart(symVar)
将表达式分解成若干个次数较低的有理分式的形式,来降低分子或分母多项式的次数,其结果满足两个要求
1)分式的分母是不可约多项式
2)分子多项式的次数需比分母多项式次数要低
Eg
expr=(4*x**3+21*x**2+10*x+12)/(x**4+5*x**3+5*x**2+4*x)
print(expr)
print(apart(expr))
output
{
d
i
s
p
1
=
4
x
3
+
21
x
2
+
10
x
+
12
x
4
+
5
x
3
+
5
x
2
+
4
x
d
i
s
p
2
=
2
x
−
1
x
2
+
x
+
1
−
1
x
+
4
+
3
x
\begin{cases} {\rm disp1}=\dfrac{4x^3+21x^2+10x+12}{x^4+5x^3+5x^2+4x} \\{\rm disp2}=\dfrac{2x-1}{x^2+x+1}-\dfrac{1}{x+4}+\dfrac{3}{x} \end{cases}
⎩
⎨
⎧disp1=x4+5x3+5x2+4x4x3+21x2+10x+12disp2=x2+x+12x−1−x+41+x3
6.反三角函数
代码格式:asin() acos() atan() acot()
Eg
expr=acos(x)
print(expr)
print(cos(acos(x)))
print(asin(1))
output
{
d
i
s
p
1
=
a
c
o
s
(
x
)
d
i
s
p
2
=
x
d
i
s
p
3
=
π
2
\begin{cases} {\rm disp1}=acos(x) \\{\rm disp2}=x \\{\rm disp3}=\dfrac{\pi}{2} \end{cases}
⎩
⎨
⎧disp1=acos(x)disp2=xdisp3=2π
7.三角恒等式化简
代码格式:trigsimp(<symVar>)
利用所有的三角恒等式化简表达式
Eg01
print(simplify(sin(x)**2+cos(x)**2))
print(trigsimp(sin(x)**2+cos(x)**2))
print(trigsimp(sin(x)*tan(x)/sec(x)))
output
{
d
i
s
p
1
=
1
d
i
s
p
2
=
1
d
i
s
p
3
=
sin
2
(
x
)
\begin{cases} {\rm disp1}=1 \\{\rm disp2}=1 \\{\rm disp3}=\sin^2(x) \end{cases}
⎩
⎨
⎧disp1=1disp2=1disp3=sin2(x)
Eg02
expr=(sin(x)**4-2*cos(x)**2*sin(x)**2+cos(x)**4)
print(factor(expr))
print(trigsimp(expr))
print(simplify(expr))
output
{
d
i
s
p
1
=
(
−
sin
(
x
)
+
cos
(
x
)
)
2
(
sin
(
x
)
+
cos
(
x
)
)
2
d
i
s
p
2
=
cos
(
4
x
)
2
+
1
2
d
i
s
p
3
=
cos
(
4
x
)
2
+
1
2
\begin{cases} {\rm disp1}=(-\sin(x)+\cos(x))^2(\sin(x)+\cos(x))^2 \\{\rm disp2}=\dfrac{\cos(4x)}{2}+\frac{1}{2} \\{\rm disp3}=\dfrac{\cos(4x)}{2}+\frac{1}{2} \end{cases}
⎩
⎨
⎧disp1=(−sin(x)+cos(x))2(sin(x)+cos(x))2disp2=2cos(4x)+21disp3=2cos(4x)+21
8.三角恒等式展开
代码格式:expand_trig(<symVar>)
利用所有的三角恒等式展开表达式
Eg
print(expand_trig(sin(x+y)))
print(expand_trig(tan(2*x)))
print(expand_trig(cos(4*x)))
print(expand_trig(cos(8*x)))
output
{
d
i
s
p
1
=
sin
(
x
)
cos
(
y
)
+
sin
(
y
)
cos
(
x
)
d
i
s
p
2
=
2
tan
(
x
)
1
−
tan
2
(
x
)
d
i
s
p
3
=
8
cos
4
(
x
)
−
8
cos
2
(
x
)
+
1
d
i
s
p
4
=
128
cos
8
(
x
)
−
256
cos
6
(
x
)
+
160
cos
4
(
x
)
−
32
cos
2
(
x
)
+
1
\begin{cases} {\rm disp1}=\sin(x)\cos(y)+\sin(y)\cos(x) \\{\rm disp2}=\dfrac{2\tan(x)}{1-\tan^2(x)} \\{\rm disp3}=8\cos^4(x)-8\cos^2(x)+1 \\{\rm disp4}=128\cos^8(x)-256\cos^6(x)+160\cos^4(x)-32\cos^2(x)+1 \end{cases}
⎩
⎨
⎧disp1=sin(x)cos(y)+sin(y)cos(x)disp2=1−tan2(x)2tan(x)disp3=8cos4(x)−8cos2(x)+1disp4=128cos8(x)−256cos6(x)+160cos4(x)−32cos2(x)+1