用sympy进行初等运算
===========================================================
1.初等运算
from sympy import *
x,y,z = sympy.symbols('x y z')
# 1.1求对数
sympy.log(sympy.E) # 1 自然对数
sympy.log(8,2) # 3 以2为底8的对数
sympy.log(1000,10) # 3以10为底1000的对数
#1.2指数幂
sympy.S('E')**1 #E#转换为sympy表达式,能提高精度
2 ** 3 #8 python表达式
sympy.S('2')**3 #8
sympy.S('10')**3 #1000
4** (1/2) # 4.0 python表达式
sympy.sqrt(4) # 2 求平方根
sympy.sqrt(-1) # I
sympy.root(8,3) # 2求8的3次方根
# 1.3求阶乘
sympy.factorial(4) #24
# 1.4求三角函数
sympy.sin(sympy.pi/2)#1
sympy.asin(1) #pi/2
===========================================================
# 2.表达式求值
#实例1:一元表达式
fx = 2*x + 1;fx.evalf(subs={x:2}) #5.00000000000000用evalf传入变量的值:字典
#实例2:多元表达式:
f = 2 * x + y;f.evalf(subs = {x:1,y:2})#4.00000000000000
#实例3::只传入一个变量输出原来表达式
f.evalf(subs = {x:1})#2.0*x + y
#实例4:subs传递变量
f.subs({x:1,y:2}) ==f.subs([(x,1),(y,2)]) #4
===========================================================
3.备注
3.1创建表达式
3.1.1查看符号表达式:
srepr(2**x) # "Pow(Integer(2), Symbol('x'))"
sympify(2)==S(2)# True 非SymPy对象将转换为SymPy对象
type(S(2)) # sympy.core.numbers.Integer
3.1.2创建:
实例1:expr= x**2 + 3*x - 1/2
实例2:str_expr = "x**2 + 3*x - 1/2";expr = sympify(str_expr); expr = S(str_expr);
实例3:
Mul(x, Pow(y, -1))== x*y**-1 #True 表示x/y 符号有Add,Mul,Pow
Mul(sin(x*y), Pow(Integer(2), -1))==Mul(Rational(1, 2),sin(x*y))# sin(x*y)/2
实例4:
expr = 3*y**2*x;expr.func’’’ sympy.core.mul.Mul’’’;expr.args #(3, x, y**2)
expr.func(*expr.args)#3*x*y**2
===========================================================
3.2表达式替换/传值计算
3.2.1.用subs进行算式替换: 返回副本(并不能对两个符号x,y进行交换)
# expression.subs(x, y) : # 将算式中的x替换成y
# expression.subs({x:y,u:v}) : # 使用字典进行多次替换
# expression.subs([(x,y),(u,v)]) : # 使用列表进行多次替换
f = 2 * x + y
f.subs({x:1,y:2}) #4
f.subs([(x,1),(y,2)]) #4
实例1:评估表达式在某一点的值
expr = cos(x) + 1;expr.subs(x, 0)#2;
实例2.1:用另一个子表达式替换子表达式
expr = x**y ;expr = expr.subs(y, x**y)#x**(x**y)
实例2.2:应用简化表达式
expr = sin(2*x) + cos(2*x)
expand_trig(expr) #2*sin(x)*cos(x) + 2*cos(x)**2 - 1
expr.subs(sin(2*x), 2*sin(x)*cos(x))#2*sin(x)*cos(x) + cos(2*x)
实例2.3:
expr = x**4 - 4*x**3 + 4*x**2 - 2*x + 3
replacements = [(x**i, y**i) for i in range(5) if i % 2 == 0]
expr.subs(replacements) #-4*x**3 - 2*x + y**4 + 4*y**2 + 3
===========================================================
3.2.2evalf(n=15,chop=False)将数值表达式计算为浮点数(n浮点数精度)
参数:chop=True舍入误差小于评估表达式后剩余的所需精度。
以字典的形式传入多个变量的值(不能指定列表)
用途:单点评估
sqrt(8).evalf()# 2.82842712474619
pi.evalf(100) # 计算前100位数π
cos(2*x).evalf(subs={x: 2.4})#0.0874989834394464更高效和数值稳定
实例1.2:
expr= cos(1)**2 + sin(1)**2-1
expr.evalf(),expr.evalf(chop=True) #-0.e-124 , 0
实例2.1:f=2*x+y;f.evalf(subs = {x:1,y:2})#4.00000000000000
实例2.2:f.evalf(subs = {x:1}) #2.0*x + y只传入一个变量输出表达式
===========================================================
3.2.3.lambdify将SymPy表达式转换为可以进行数值计算的表达式(类似lambda)
多点来评估一个表达式,用SymPy会很慢,应用NumPy和SciPy库 。
实例1:
import numpy
a = numpy.arange(6)
expr = sin(x)
f = lambdify(x, expr, "numpy")
f(a)#[ 0. 0.84147098 0.90929743 0.14112001 -0.7568025 -0.95892427]
实例2:
f = lambdify(x, expr, "math"); f(0.1)#0.0998334166468使用标准库数学模块
实例3:将lambdify应用函数传递字典
def mysin(x):return x
f = lambdify(x, expr, {"sin":mysin})
f(0.1)#0.1
===========================================================
3.3.阻止表达式评估
x + x#2*x
expr=Add(x, x, evaluate=False) #x + x
expr== sympify("x + x", evaluate=False)#True
expr + x #3*x
实例2.1:
expr = x + UnevaluatedExpr(x)#x + x
x + expr #2*x + x
(x + expr).doit() #3*x评估表达式
实例2.2:(1*5/7)*(1*3/4)
UnevaluatedExpr(S.One*5/7)*UnevaluatedExpr(S.One*3/4)# (5/7)*(3/4)
x*UnevaluatedExpr(1/x) #x*1/x
实例2.3:UnevaluatedExpr不能阻止评估作为参数给出的表达式
expr1 = UnevaluatedExpr(x + x) #2*x
expr2 = sympify('x + x', evaluate=False) #x + x
UnevaluatedExpr(sympify("x + x", evaluate=False)) + y#y + x + x
===========================================================
3.4.相等性==判断:
实例1:
(x + 1)**2 == (x + 1)**2 #True 完全相等
(x + 1)**2 == x**2 + 2*x + 1 #False不完全相等
Eq((x + 1)**2 , x**2 + 2*x + 1) # Eq((x + 1)**2, x**2 + 2*x + 1)
Eq(1,1) # True
实例2:检查是否相等:
方法2.1: expand
a = (x + 1)**2;b = x**2 + 2*x + 1
expand(a-b,trig=True)==0 #True提取公因式
a.expand() == b.expand() #True
(a- b).expand()==0 #True
方法2: simplify(a-b) 并非绝对可靠一般情况下完全相同
如果.expand()没有帮助,尝试simplify(),trigsimp()更先进的转换
simplify(a - b)==0 #True
方法3: trigsimp
trigsimp(cos(x)**2 + sin(x)**2) == 1 #True
方法4: equals
a.equals(b) #True 通过在随机点数值计算它们
===========================================================
3.5.测试SymPy表达式的结构
实例1.1:
x = Symbol("x", integer=True);x.is_integer #True 对应Python int
x = Symbol("x", real=True);x.is_real #True 对应Python float
x = Symbol("x", complex=True);x.is_complex #True 对应Python complex
实例1.2:
x = Integer(2);x.is_Integer #True 对应SymPy int
x=Float(10);x.is_Float #True对应SymPy float
x=Rational(1,2);x.is_Rational #True对应SymPy 有理数
b=symbols('b',zero=True);b.is_zero#True
实例2.1:
e = sign(x**2)
isinstance(e, sign) #True
isinstance(e, exp) #False
isinstance(e, Function) #True
实例2.2:
e = sign; f = exp; g = Add
isinstance(e, FunctionClass)#True
isinstance(f, FunctionClass) #True e和f是函数
isinstance(g, FunctionClass)#False
g is Add #True 不是一个函数
===========================================================