Python-Sympy库的基本操作笔记01

Python-Sympy库的基本操作笔记01

视频学习:Bilibili:铜山居士
笔记记录:Bilibili:XLY23333
Python版本:Python311Python38


一、认识符号运算

(一)体会符号运算

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+x2x+1disp2=x1
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} xaxbxa+bpowsimp()
x a + b → x a x b x^{a+b}\to x^ax^b xa+bxaxbexpand_power_exp()
x a y a → ( x y ) a x^ay^a\to(xy)^a xaya(xy)apowsimp()
( x y ) a → x a y a (xy)^a\to x^ay^a (xy)axayaexpand_power_base()
( x a ) b → x a b (x^a)^b\to x^{ab} (xa)bxabpowdenest()
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=x2x6

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+x1disp2=(x1)(x2+1)disp3=(xy)(x2+xy+y2)disp4=(x+y)(x2xy+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(2z)+x(y+1)3disp2=x3x2z+2x2+xy+x3
collectcoeff搭配使用时可以输出表达式中特定次方项的系数
代码格式: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=x423x2+x1disp2.2=2x28x3x22x8disp3.1=x2+1xy22xyz+xz2+y22yz+z2disp3.2=x1y22yz+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+12x1x+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=1tan2(x)2tan(x)disp3=8cos4(x)8cos2(x)+1disp4=128cos8(x)256cos6(x)+160cos4(x)32cos2(x)+1


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值