sympy库使用:第2部分 初等运算,表达式运算(翻译 tcy)

用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舍入误差小于评估表达式后剩余的所需精度。

以字典的形式传入多个变量的值(不能指定列表)

用途:单点评估

实例1.1:

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.阻止表达式评估

实例1:

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 不是一个函数

===========================================================

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/87197891