Sympy简单教程(3)

SymPy - 查询

SymPy中包含假设模块用于从表达式中提取信息. 此模块为此目的定义了 ask() 函数.

sympy.assumptions.ask(property)

下述性质对于一个表达式提供了有用的信息 −

代数数 algebraic(x)

所谓代数数, 必须是一个有理系数多项式的非零根. 因为\sqrt2是方程x^2-2=0的一个根, 因此√2 它是代数数.

复数 complex(x)

判断x是否是复数, 当且仅当x输入复平面时返回True.

合数 composite(x)

调用 ask(Q.composite(x)) 判断x是否合数(非素数), 返回 true 当且仅当 x 是一个正整数而且至少有一个不是1和自己之外的因数.

偶数 even, 奇数 odd

函数 ask() 返回True 如果 x 分别在偶数集合或者奇数集合之内.

纯虚数 imaginary

这个性质进行虚数推断. 如果是一个实数和虚数单位I相乘则返回 true.

整数 integer

Q.integer(x) 返回 true 如果 x 属于整数集合.

有理数 rational, 无理数 irrational

Q.irrational(x) 返回 true 当且仅当 x 是实数而且不能表示为两个整数的比值. 例如, \pi 是一个无理数.

正数 positive, 负数 negative

判断一个数是正或者负. 注意0既不是正也不是负.

零 zero, 非零 nonzero

判断一个数是0或者非零

>>> from sympy import * 
>>> x=Symbol('x') 
>>> x=10 
>>> ask(Q.algebraic(pi))
False
>>> ask(Q.complex(5-4*I)), ask( Q.complex(100))
(True, True)
>>> x,y=symbols("x y") 
>>> x,y=5,10 
>>> ask(Q.composite(x)), ask(Q.composite(y))
(False, True)
>>> ask(Q.even(x)), ask(Q.even(y))
(False, True)
>>> x,y= 2*I, 4+5*I 
>>> ask(Q.imaginary(x)), ask(Q.imaginary(y))
(True, False)
>>> x,y=5,10 
>>> ask(Q.even(x)), ask(Q.even(y)), ask(Q.odd(x)), ask(Q.odd(y))
(False, True, True, False)
>>> x,y=5,-5 
>>> ask(Q.positive(x)), ask(Q.negative(y)), ask(Q.positive(x)), ask(Q.negative(y))
(True, True, True, True)
>>> ask(Q.rational(pi)), ask(Q.irrational(S(2)/3))
(False, False)
>>> ask(Q.zero(oo)), ask(Q.nonzero(I))
(False, False)

SymPy - 化简

Sympy 有强大的能力化简数学表达式. SymPy 中有许多函数执行各种类型的化简运算. 一个通用函数称为 simplify() 会尝试取得一个表达式的最简形式.

化简函数 simplify()

这个函数在 sympy.simplify 模块中定义. simplify() 尝试应用智能启发式 intelligent heuristics 使输入表达式更简单 “simpler”. 如下的代码化简了表达式 \sin^2x+\cos^2x .

>>> from sympy import * 
>>> x=Symbol('x')
>>> expr=sin(x)**2 + cos(x)**2 
>>> simplify(expr)

上述代码输出结果 −

1

展开 expand()

函数 expand() 是SymPy中最重要的一个通用简化函数, 通常用于展开多项式表达式. 例如 −

>>> a,b=symbols('a b') 
>>> expand((a+b)**2)

上述代码输出一个等价于以下结果的表达式 −

a^2+2ab+b^2

>>> expand((a+b)*(a-b))

上述代码输出一个等价于以下结果的表达式 −

a^2-b^2

通常函数 expand() 使得表达式更长而不是更短. 但是, 有时候调用 expand() 会使得表达式变得更短.

>>> expand((x + 1)*(x - 2) - (x - 1)*x)

上述代码输出 −

-2

分解因式 factor()

这个函数以多项式为参数, 返回它在有理数上的不可约因式之积.

>>> x,y,z=symbols('x y z') 
>>> expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
>>> factor(expr)

上述代码输出一个等价于以下结果的表达式 −

z(x+2y)^2

>>> factor(x**2+2*x+1)

上述代码输出 −

(x+1)^2

函数 factor() 是函数 expand() 的逆运算. 由factor()返回的每一个因式都是不可约的. 函数 factor_list() 返回一个更有组织的输出结果.

>>> expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
>>> factor_list(expr)

上述代码输出一个等价于以下结果的表达式 −

(1, [(z, 1), (x + 2*y, 2)])

合并同类项 collect()

这个函数合并一个表达式中同类项, 依据的是表达式列表的有理数幂.

>>> expr=x*y + x - 3 + 2*x**2 - z*x**2 + x**3 
>>> expr

上述代码输出一个等价于以下结果的表达式 −

x^3 + x^2z + 2x^2 + xy + x - 3

在这个表达式上运用 collect() 函数结果如下 −

>>> collect(expr,x)

上述代码输出一个等价于以下结果的表达式 −

x^3 + x^2(2 - z) + x(y + 1) - 3

>>> expr=y**2*x + 4*x*y*z + 4*y**2*z+y**3+2*x*y 
>>> collect(expr,y)

上述代码输出一个等价于以下结果的表达式 −

y^3+y^2(x+4z)+y(4xz+2x)

消元 cancel()

函数cancel() 将有理分式函数化简为标准的范式 p/q, 其中 p 和 q 是不含公因式的多项式展开式. p和q的首相系数没有分母 i.e., 它们都是整数.

>>> expr1=x**2+2*x+1 
>>> expr2=x+1 
>>> cancel(expr1/expr2)

上述代码输出一个等价于以下结果的表达式 −

x+1

>>> expr = 1/x + (3*x/2 - 2)/(x - 4) 
>>> expr

上述代码输出一个等价于以下结果的表达式 −

\frac{\frac{3x}{2} - 2}{x - 4} + \frac{1}{x}

>>> cancel(expr)

上述代码输出一个等价于以下结果的表达式 −

\frac{3x^2 - 2x - 8}{2x^2 - 8}

>>> expr=1/sin(x)**2 
>>> expr1=sin(x) 
>>> cancel(expr1*expr)

上述代码输出一个等价于以下结果的表达式 −

\frac{1}{\sin(x)}

三角函数化简 trigsimp()

这个函数用于化简三角函数恒等式. 要注意对于反三角函数命名时在三角函数名称前面加了一个字母a而不是arc. 例如反余弦函数表示为 acos().

>>> from sympy import trigsimp, sin, cos 
>>> from sympy.abc import x, y
>>> expr = 2*sin(x)**2 + 2*cos(x)**2 
>>> trigsimp(expr)

上述代码输出 −

2

函数 trigsimp 使用启发式运用最合适的三角恒等式进行化简.

幂化简powersimp()

这个函数针对表达式中相同基和指数的相通过组合进行化简.

>>> expr=x**y*x**z*y**z 
>>> expr

上述代码输出一个等价于以下结果的表达式  −

x^y x^z y^z

>>> powsimp(expr)

上述代码输出一个等价于以下结果的表达式 −

x^{y+z} y^z

你可以通过改变函数 powsimp() 的参数combine=’base’ 或 combine=’exp’只组合基或者指数. 默认情况下, combine=’all’, 这时将进行两种组合. 如果 force 设置为 True 那么忽略此命令中前面的假设, 相同的基将被组合化简.

>>> powsimp(expr, combine='base', force=True)

上述代码输出一个等价于以下结果的表达式 −

x^y(xy)^z

组合数化简combsimp()

包含阶乘的表达式可以通过函数 combsimp() 进行化简. SymPy 提供函数 factorial() 表示阶乘.

>>> expr=factorial(x)/factorial(x - 3) 
>>> expr

上述代码输出一个等价于以下结果的表达式 −

\frac{x!}{(x - 3)!}

为了简化上述组合表达式我们使用函数 combsimp() 如下 −

>>> combsimp(expr)

上述代码输出一个等价于以下结果的表达式 −

x(x-2)(x-1)

组合数 binomial(x, y) 是指从不同的x个对象中选择y种的不同方法总数. 它也经常写作 xCy.

>>> binomial(x,y)

上述代码输出一个等价于以下结果的表达式 −

\begin{pmatrix}x\\ y \end{pmatrix}

>>> combsimp(binomial(x+1, y+1)/binomial(x, y))

上述代码输出一个等价于以下结果的表达式 −

\frac{x + 1}{y + 1}

对数化简logcombine()

这个函数接纳对数作为参数并依据如下规则组合它们 −

  • log(x) + log(y) == log(x*y) 如果x,y都是正的
  • a*log(x) == log(x**a) 如果x是正的而a是实数
>>> logcombine(a*log(x) + log(y) - log(z))

上述代码输出一个等价于以下结果的表达式 −

a\log(x) + \log(y) - \log(z)

如果这个函数的参数 force 设置为 True, 那么在没有其它假定的情况下, 上述的假定都认为是满足的.

>>> logcombine(a*log(x) + log(y) - log(z), force=True)

上述代码输出一个等价于以下结果的表达式 −

\log\frac{x^a y}{z}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值