SymPy學習之Advanced Expression Manipulation

Understanding Expression Trees
>>> from sympy import *
>>> x, y, z = symbols('x y z')
>>> expr = x**2 + x*y
>>> srepr(expr) #使用srepr查看內部保存形式
Add(Pow(Symbol('x'), Integer(2)), Mul(Symbol('x'), Symbol('y')))
#symbols是類Symbol的實例
>>> x = symbols('x')
>>> x = Symbol('x')
#指數在內部用Pow函數表示
>>> srepr(x**2)
Pow(Symbol('x'), Integer(2))
>>> Pow(x, 2)
2**x
#乘積在內部用Mul函數表示
>>> srepr(x*y)
Mul(Symbol('x'), Symbol('y'))
>>> Mul(x, y)
x⋅y
#相加在內部用Add函數表示
>>> Add(Pow(x, 2), Mul(x, y))
x**2 + x*y
#一個比較複雜的例子
>>> expr = sin(x*y)/2 - x**2 + 1/y
>>> srepr(expr)
Add(Mul(Integer(-1), Pow(Symbol('x'), Integer(2))), Mul(Rational(1, 2), sin(Mu l(Symbol('x'), Symbol('y')))), Pow(Symbol('y'), Integer(-1)))
#減號在內部被譯成加相反數
>>> srepr(x - y)
Add(Symbol('x'), Mul(Integer(-1), Symbol('y')))
#除號在內部被譯成乘被除數的倒數
>>> expr = x/y
>>> srepr(expr)
Mul(Symbol('x'), Pow(Symbol('y'), Integer(-1)))
#內部表達是無序的
>>> 1 + x
x + 1
#func用於獲取頂部節點
>>> expr = Add(x, x)
>>> expr.func  #此處爲Mul,不是Add
<class 'sympy.core.mul.Mul'>
>>> expr  #在內部被自動轉換成乘了
2⋅x
#一些特殊的類型
>>> Integer(2).func
<class 'sympy.core.numbers.Integer'>
>>> Integer(0).func
<class 'sympy.core.numbers.Zero'>
>>> Integer(-1).func
<class 'sympy.core.numbers.NegativeOne'>
#下面兩個都是Integer的子類,所以isinstance可用
#args獲取頂層元素
>>> expr = 3*y**2*x
>>> expr.func
<class 'sympy.core.mul.Mul'>
>>> expr.args
(3, x, y**2)
>>> srepr(expr)
Mul(Integer(3), Symbol('x'), Pow(Symbol('y'), Integer(2)))
#expr.func的頂層爲Mul函數,用*將頂層數據解析作爲參數,巧妙
>>> expr.func(*expr.args)
3*x*y**2
>>> expr == expr.func(*expr.args)
True
#args的結果是排序了的,而且可以進一步解析
>>> expr.args[2].args
(y, 2)
#定義函數,將表達式前序解析
>>> def pre(expr):
... print(expr)
... for arg in expr.args:
... pre(arg)
>>> expr = x*y + 1
>>> pre(expr)
x*y + 1
1
x*y
x
y
#調用內部函數解析
>>> for arg in preorder_traversal(expr):
... print(arg)
x*y + 1
1
x*y
x
y


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章