符号对象声明函数
symbols
用法(一):
x=symbols('x')
用法(二)
fromsympyimportsymbols
x,y,z=symbols('xyz')
print('
变量
z
的类型为:
',type(z))
用法(三)
fromsympyimportsymbols
s=symbols('s0:10')#创建符号变量 s0, s1, ..., s9 并返回一个包含这些符号的元组。
print('s
的数据类型是:',type(s))#检查 s 的数据类型,应该是 tuple。
print('s
的长度是:',len(s))#获取元组 s 的长度,应该是 10。
print('s=',s)
print('s[5]=',s[5])#访问元组 s 中的第6个元素(索引从0开始),即 s5
用法(四):限定符号对象的取值范围
x=sympy.symbols('x',
integer=True
)#限定x为整数
y=sympy.symbols('y',
real=True
)#限定y为实数
>>>z=sympy.symbols('z',
complex=True
)#限定z为复数
>>>w=sympy.symbols('w',
positive=True
)#限定w为正数
>>>u=sympy.symbols('u',
negtive=True
)#限定u为负数
>>>y=sympy.symbols('y')#尝试访问
y
的假设(assumptions)属性
>>>
y.assumptions0
一些符号常量
sympy.E:自然常数e
sympy.I:虚数单位i
sympy.pi:圆周率π
sympy.oo:无穷大
import sympy
a=[sympy.E,sympy.I,sympy.pi,sympy.oo]
for i in a:
print(i.evalf(12))#
evalf(12)
方法用于将符号常量转换为具有12位有效数字的浮点数表示。对于每个常量,调用
evalf(12)
并打印结果
另一种声明符号对象的函数
var
>>>sympy.var('x,yz')
直接利用声明过的符号变量、运算符、函数生成表达式
import sympy
a,b,c=sympy.symbols('abc')
s=a*sympy.sin(b*sympy.sqrt(c))print('s=',s)
将数学表达式中的变量或表达式的所有实例替换为其他变量或表达式或值。
from sympy import *
x,y=symbols('xy')
exp=x**2+1
print("BeforeSubstitution:{}".format(exp))
#将y^2替换x
res_exp=exp.subs(x,y**2)
print("AfterSubstitution:{}".format(res_exp))
from sympy import*
x1,x2=symbols('x1,x2')#声明符号变量,否则会认为没有定义
def func1():
returnpow(x1,2)+2*pow(x2,2)-2*x1*x2-2*x2
x=symbols('x')
def func2():
returnpow(x,2)+2*x
f1=func1()
print(f1.subs(x1,2).subs(x2,2))#求2替代x1,2替代x2两个位置变量
f2=func2()
print(f2.subs(x,2))#只含一个自变量函值
符号表达式的化简
SymPy
表达式的化简可分为普通化简(
simplify,
用于代数式化简)、三角化简(
trigsimp
,用
于三角函数化简),指数化简(
powsimp
,用于指数函数化简),有理式化简(
radsimp
)等
from sympy import simplify,trigsimp,powsimp
from sympy import symbols
from sympy import sin,cos,tan,exp
x,y=symbols('x,y')
s=(x**3+x**2-x-1)/(x**2+2*x+1)
print('s被化简前:',s);
print('s被化简后:',simplify(s))
t=sin(2*x)/cos(x)
print('t被化简前:',t);
print('t被化简后:',trigsimp(t))
ex=exp(2*x-2*y)/exp(x-y)
print('ex被化简前:',ex);
print('ex被化简后:',powsimp(ex))
simplify
的另一个功能:直接将字符串转化为符号表达式
importsympy
str_expr='x**2+3*x-g'
expr=sympy.sympify(str_expr)
多项式计算
多项式展开
expand()
x=sympy.symbols(‘x’)
sympy.expand((x+2)*(x-3))
sympy.expand((x+1)*(x-2)-(x-1)*x)
因式分解
factor()
x=sympy.symbols(‘x’)
sympy.factor(x**3-x**2+x-1)
合并同类项
collect()
x=sympy.symbols(‘x’)
expr=x*y+x-3+2*x**2-5*x**2+x**3+(x+y)*(x-y)
sympy.collect(expr,x)
分式的化简与计算
分式的拆分
apart()
from sympy import *
x=symbols('x')
s=1/((x+2)*(x+1)*(2*x+3))
print('s=',s)
print('化简后的s=',apart(s,x))
代数式的合并
together()
,分式化简
cancel()
from sympy import *
x=symbols('x')#声明符号变量,否则会认为没有定义
s=1/((x+2)*(x+1)*(2*x+3))print('s=',s)
print('化简后的s=',apart(s,x))
print('重新合并后的s=',together(apart(s,x),x))
print('重新合并后再展开的结果rs=',cancel(together(apart(s,x),x)),x)
符号微积分
计算函数极限
limit(function,variable,point,‘+-’)
示例
from sympy import limit,var,sin
var('x');
s=sin(x)/abs(x);
t1=limit(s,x,0,'+');#在0+极限
t2=limit(s,x,0,'-');
print(t1,t2)
from sympy import limit,symbols,oo
x=symbols('x')
s=(1+1/x)**x
t1=limit(s,x,-oo);
print(t1)
计算数列极限
from sympy import limit,symbols,sin,pi
n=symbols('n',integer=True)
s=sin(pi*n)
t1=limit(s,x,oo);
print(t1)
from sympy import limit,symbols,cos,pi,oo
n=symbols('n',integer=True)
s=limit(n**2*(1-n*sin(1/n)),n,oo)
s.doit()#调用
print(s)
计算导数及偏导数
diff(function, variable, degree),
variable----对谁偏导
degree----几阶偏导
from sympy import var,symbols,cos,diff,exp
var('x,y');
f1=diff(cos(x**2))
f2=diff(exp(x**2+y**2),x,2)
print(f1)
print(f2)
from sympy import *
var('x,y')
s=x*y-exp(x)-exp(y);
d=-diff(s,x)/diff(s,y);
#在(x,y)的导数
di=d.subs({x:0,y:0})
print(d,di)
上述是隐函数的导数
计算不定积分和定积分
Integral(function,integration_variable)
from sympy import *
var('t,x')
s=t*exp(t**2);
I1=Integral(s,t)
I1.doit()
print(I1)
integrate(function,
(
integration_variable,lower_limit, upper_limit)
)
这是定积分,
from sympy import *
var('t,x')
s=t*exp(t**2);
I1=integrate(s,(t,0,1))
print(I1)
计算变限积分
from sympy import *
var('t,x')
s=t*exp(t**2);
I1=integrate(s,(t,0,x**2))
print(I1)
from sympy import *
var('t,x')
s=t*exp(t**2);
I1=integrate(s,(t,0,x**2))
print(I1)
#对变现积分求导
di1=diff(I1)
print(di1)
函数展开为级数
from sympy import *
var('x')
f=exp(x);
s1=f.series(x)
print(s1)#默认展开6阶
s2=f.series(x,0,7)
print(s2)
print(s2.removeO())#移除高阶无穷小
s3=f.series(x,1,4)#在x=1处展开到四阶
print(s3)
求解方程
(
组
)
sympy.solve([equation1,equation2,...equationN],[x1,x2,...,xN])
from sympy import *
x=symbols('x')
y=symbols('y')
print(solve([3*y+5*y-19,4*x-3*y-6],[x,y]))
求解一个方程
from sympy import *
x=symbols('x')
print(solve(x**3+x**2+2*x-4,x))
sympy.linsolve 求解线性方程组
from sympy import *
x, y, z = symbols("x y z")
print("====默认等式为0的形式 ====")
eq = [x+y+z-2, 2*x-y+z+1, x+2*y+2*z-3]
result = linsolve(eq, [x, y, z])
print(result)
# 矩阵形式
print("======矩阵形式 =======")
eq = Matrix(([1, 1, 1, 2], [2, -1, 1, -1], [1, 2, 2, 3]))
result = linsolve(eq, [x, y, z])
print(result)
print("====增广矩阵形式 ======")
A = Matrix([[1, 1, 1], [2, -1, 1], [1, 2, 2]])
b = Matrix([[2], [-1], [3]])
system = A, b
result = linsolve(system, x, y, z)
print(result)
nonlinsolve()用于求解非线性方程组,例如包含二次方,三角函数的方程
from sympy import *
x, y, z = symbols("x y z")
result=nonlinsolve([x**2+y**2+z**2-1,x-z],[x,y])
print(result)
dsolve()用于求解常微分方程
from sympy import *
y = symbols('y', function=True)#y是因变量
x = symbols('x')
eq = Eq(y(x).diff(x, 2)-2*y(x).diff(x) +y(x), sin(x))#必须带上自变量。y(x)
print(dsolve(eq, y(x))) #求通解
Sympy
符号绘图
sympy
绘制二维曲线
from sympy.plotting import plot
plot(expr, range, **kwargs)
from sympy.plotting import plot
from sympy import *
x=Symbol('x')
plot(x**2, (x,-12,25),line_color='red')
from sympy.plotting import plot
from sympy import *
var('x,y,t')
#同时绘制两条曲线
plot(sin(t),cos(t),(t,0,2*pi),line_color='blue',title='sin,cos')
不同区间上绘制两条曲线
from sympy.plotting import plot
from sympy import *
var('x,y,t')
plot((sin(t),(t,0,2*pi)),(cos(t),(t,-2*pi,2*pi)))
绘制隐函数曲线
sympy.plot_implicit(expr, x_var=None, y_var=None, adaptive=True,
depth=0, points=300, line_color='blue' , show=True, **kwargs)
from sympy import plot_implicit, symbols, Eq
x,y=symbols('x y')
p1=plot_implicit(Eq(x**2 + y**2,16),line_color='red')
填充图形:
from sympy import plot_implicit, symbols
x, y = symbols('x y')
p1=plot_implicit(abs(x)+abs(y)<=4,(x,-4,4))
from sympy.plotting import plot_parametric
u = symbols('u')
expr1 = (u, cos(2*pi*u)/2 + 1/2)
expr2 = (u, sin(2*pi*u)/2 + 1/2)
p = plot_parametric(expr1, expr2, (u, 0, 1), line_color=
'blue')
p[0].line_color =
'red'
p.show()
以上是绘制二维曲线
sympy
绘制三维参数曲线
from sympy.plotting import plot3d_parametric_line
plot3d_parametric_line(expr_x, expr_y, expr_z, range, **kwargs)
from sympy import symbols, cos, sin
from sympy.plotting import plot3d_parametric_line
u = symbols('u')
plot3d_parametric_line(cos(u), sin(u), u, (u, -5, 5))
sympy
绘制三维曲面
from sympy.plotting import plot3d
plot3d(expr, range_x, range_y, **kwargs)
from sympy import symbols
from sympy.plotting import plot3d
x, y = symbols('x y')
plot3d(x**2+y**2, (x, -5, 5), (y, -5, 5))