本文主要参考资料来自sympy的官网:

Introduction - SymPy 1.4 documentation​docs.sympy.org

一般,我们使用计算机软件进行数学计算,主要是数值计算,就算有变量,也是代入具体数值来算的,我们在初中到大学学到的符号计算,很多时候无法用计算机来进行,比如下面的多项式化简:

上面的式中没有任何一个具体数值,完全是符号进行计算,这时我们只能手算了。当然,我们可以用商业软件mathematics, 但是非常昂贵,幸好我们还有python,有了开源的sympy模块,我们可以做到如下功能:

  • core symbolic mathematics: 基础运算,包括:化简Simplification,各种函数运算等;
  • Polynomials:多项式运算及求解
  • Calculus:极限、微分、积分
  • Solving equations:各种方程求解
  • Combinatorics:组合学
  • Discrete math:离散数学
  • Matrices:矩阵运算
  • Geometry:几何学
  • Physics:物理学
  • Statistics:统计学
  • Cryptography:密码学

下面我们分几个专题来介绍其功能,这篇介绍基础的运算。

  1. Symbols : 符号

在进行符号运算前,必须先定义符号,下面的例子我们定义了两个符号x,y:

import sympy as sy
x,y = sy.symbols('x y') #符号间用空格隔开
print(type(x))
print(type(y))

输出:

sympy.core.symbol.Symbol
sympy.core.symbol.Symbol


2. Symbols expression: 符号表达式

当一个表达式中有任何一个变量是sympy symbol,就变成一个symbols expression,它不会直接进行运算,除非你使用subs()方法代入具体的数值,看下面的例子:

import sympy as sy
x,y=sy.symbols("x y")
f=x**2+3*x-5
print(f"f(x)={f}") #直接打印f是显示表达式
xx=3
print(f"f({xx})={f.subs({x:xx})}") #代入具体数值来计算最终的结果
yy=4
f1=(x**2+y**2)**0.5
print(f"f1(x,y)={f1}")  #直接打印f1是显示表达式
print(f"f1({xx},{yy})={f1.subs({x:xx, y:yy})}") #代入具体数值来计算最终的结果

结果:

f(x)=x**2 + 3*x - 5
f(3)=13
f1(x,y)=(x**2 + y**2)**0.5
f1(3,4)=5.00000000000000


3. Substitution : 代换

上面的例子,显示了如何在表达式中代入具体的数值,但是替换还可以有更多的可能,看下面的例子:

,
--->
import sympy as sy
a,x,t=sy.symbols("a x t")
f=sy.cos(x)
print(f"f(t)={f.subs({x: a**t})}")

输出:

f(t)=cos(a**t)


4. evalf:计算出具体的值

不单单用sympy symbols组成的表达式,用sympy functionssympy Rational组成的表达式,都是不会直接计算出实际的数值,这时候可以用evalf函数来实际计算出具体的数值,看下例:

import sympy as sy
y = sy.sqrt(2)+sy.Rational(3,8)
print(f"{y}={y.evalf()}")

输出:

3/8 + sqrt(2)=1.78921356237310


5. 更漂亮和专业的输出

ipython中,运行:sympy.init_printing()后,可以以比较漂亮的格式来打印(用sympy.pprint()函数)输出公式,比如:

import sympy as sy
sy.init_printing()
sy.pprint(x**2+sy.Rational(1,3)) 

输出:

 2   1
x  + ─3

如果在jupyter notebook中,可以用下面的方法用latex来输出漂亮的公式:

from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x,y=sy.symbols("x y")
f=x**2+3*x-5
display(Latex(f"$$f(x)={sy.latex(f)}$$"))xx=3
sy.pprint(f"f({xx})={f.subs({x:xx})}")
yy=4
f1=sy.sqrt(x**2+y**2)display(Latex(f"$$f_1(x,y)={sy.latex(f1)}$$"))
sy.pprint(f"f1({xx},{yy})={f1.subs({x:xx, y:yy})}")

输出:

关于latex的介绍,参见我的另一个专栏。


6. Simplification : 化简

对于sympy来说,最强大的一点就是对公式进行化简,下面显示几个例子:

from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x = sy.symbols("x")
y = (x**3 + x**2 - x - 1)/(x**2 + 2*x + 1)
display(Latex(f"$${sy.latex(y)}={sy.latex(sy.simplify(y))}$$"))

输出:

这里是用simplify()函数,绝大部分情况下它很好用,就是有几个问题:

  • 它不能控制我们最终想要的形式,比如想要多项式(和式a+b+c)的最简式,还是多项乘积(a*b*c)的最简式,这可以用后面介绍的两个函数来取代;
  • 它速度比较慢,同样,可以用其他更快的函数取代,但是通用性没有它好。

当我们需要化简为和式的表达式时,可以用expand()函数,参见下例:

from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x = sy.symbols("x")
y = (x + 1)**2
display(Latex(f"$${sy.latex(y)}={sy.latex(sy.expand(y))}$$")) 

输出:

当我们需要化简为乘积表达式时,可以用factor()函数,参见下例:

from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x = sy.symbols("x")
y = x**3 - x**2 + x - 1
display(Latex(f"$${sy.latex(y)}={sy.latex(sy.factor(y))}$$"))

输出:

当我们的表达式各项有相同的变量,我们可以用collect()函数来合并同阶的项,看下例:

from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x,y,z = sy.symbols("x y z")
f = x*y + x - 3 + 2*x**2 - z*x**2 + x**3
display(Latex(f"$${sy.latex(f)}={sy.latex(sy.collect(f,x))}$$"))

输出:

当我们需要把表达式转换为

这样的最简式的时候,可以用

cancel()函数,它会上下消除相同的项,见下例,另,cancel()函数最后分子分母都化简为多项式的和式,如果要化简为乘积式,可以用factor()函数。

from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x,y,z = sy.symbols("x y z")
f = (x*y**2 - 2*x*y*z + x*z**2 + y**2 - 2*y*z + z**2)/(x**2 - 1)
display(Latex(f"$${sy.latex(f)}={sy.latex(sy.cancel(f))}={sy.latex(sy.factor(f))}$$"))

输出:

下面看看apart()函数,可以用来把分数表示的多项式因式分解,看例子:

from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x,y,z = sy.symbols("x y z")
f = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)
display(Latex(f"$${sy.latex(f)}={sy.latex(sy.apart(f))}$$"))
print(sy.latex(f), sy.latex(sy.apart(f)))

输出:

对于三角函数,可以用:trigsimp()函数来化简,比如下例:

from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x,y,z = sy.symbols("x y z")
f = sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4
display(Latex(f"$${sy.latex(f)}={sy.latex(sy.trigsimp(f))}$$"))

反过来,可以用expand_trig()函数来展开三角函数,看下例:

from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x,y,z = sy.symbols("x y z")
f = sin(x+y)
display(Latex(f"$${sy.latex(f)}={sy.latex(sy.expand_trig(f))}$$"))

输出:

对于指数函数的化简,比较麻烦,因为一般指数函数的形式:

,对于底:
和指数:
,当它们取不同类型的值或范围的时候,其结果是不一样的,比如:
  • :当
    都是正数,且
    是实数,可以化简为:
    ,但是 其他情况就不行,比如设
    ,则
    ,而
    ,两边不相等;
  • :当
    是整数时,可以化简为:
    ,但是其他情况下,就不行,比如:设:
    , 而
    ,两者不相同;
  • :对于任何情况都合适。

缺省情况下,sympy假设symbols都是属于复数类型,这样上面的一些指数表达式就无法进行简化,而我们可以在定义symbols的时候,指定其属于什么类型,这样一些简化就可以进行,看下面的例子:

 from IPython.display import display, Latex
import sympy as sy
sy.init_printing()x, y = symbols('x y', positive=True) #定义为正实数
a, b = symbols('a b', real=True)     #定义为实数
z, t, c = symbols('z t c')f1 = t**c*z**c
f2 = x**a*x**b
f3 = x**a*y**a
display(Latex(f"$${sy.latex(f1)}={sy.latex(sy.powsimp(f1))}$$"))
display(Latex(f"$${sy.latex(f2)}={sy.latex(sy.powsimp(f2))}$$"))
display(Latex(f"$${sy.latex(f3)}={sy.latex(sy.powsimp(f3))}$$"))

输出:

注意上面第一个式子,由于

是复数,所以简化没法进行;

而第二、第三个式子中由于设定符号

都符合要求,所以可以进行简化。

除了这些以外,还有:expand_power_exp(), expand_power_base(), powdenest(), expand_log(), logcombine()等函数可以进行化简,参看下面的资料:

Simplification - SymPy 1.4 documentation​docs.sympy.org

Simplification - SymPy 1.4 documentation

latex 符号_sympy: 符号运算-1相关推荐

  1. 【LaTeX公式】LaTeX数学公式的符号表示

    转载自:http://blog.csdn.net/ws_20100/article/details/49159291 引言 由于CSDN的Markdown编辑器能轻松地支持LATEX的公式表示.  因 ...

  2. Latex公式常见符号

    Latex公式常见符号 一.运算符号 二.函数符号 三.括号.箭头 四.希腊字母 资源下载地址:Latex公式常见符号.pdf 一.运算符号 序号 数学符号 Latex表达式 助记 1 ×\times ...

  3. LaTex 各种特殊符号

    LaTex 各种特殊符号 蓝色的命令依赖 amsmath 宏包(非 amssymb 宏包): 带有角标 ℓ 的符号命令依赖 latexsym 宏包. Ref: LaTex常用特殊符号对应表

  4. latex箭头表示符号

    latex箭头表示符号 箭头类型 latex符号 ←\leftarrow← \leftarrow →\rightarrow→ \rightarrow ↔\leftrightarrow↔ \leftri ...

  5. latex强调/重音符号

    latex强调/重音符号 强调/重音符号 latex符号 x^\hat{x}x^ \hat xˋ\grave{x}xˋ \grave xˉ\bar{x}xˉ \bar xˊ\acute{x}xˊ \a ...

  6. 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

      第一题 #include<stdio.h>  int main()  {  unsigned int a=6;  int b=-20;  printf("%d\n" ...

  7. 无符号定点数加法运算的VHDL描述

    无符号定点数加法运算的VHDL描述 使用VHDL描述定点运算时添加运算支持的详细步骤 定位到Xilinx的安装路径下,然后找到 D:\Xilinx\Vivado\2021.1\scripts\rt\d ...

  8. 《C++ Primer 第五版》(第4.11节类型转换) ————关于无符号数和有符号数的运算探究

    1.关于无符号数和有符号数的运算 关于无符号数和有符号数的运算,在我看来一直是觉得只要有无符号数和有符号数的运算,有符号数就转化为无符号数,但是在<C++ Primer 第五版>的p142 ...

  9. Latex常见数学符号写法

    写在前面 本文主要记录一些Latex数学公式符号的写法,便于自己查阅.公式写法来源:刘海洋的<Latex入门>. 1 概述 Latex有两种数学公式,一种是行内公式,也就是和文本同行的数学 ...

最新文章

  1. 爬虫之利用requests.session进行状态保持
  2. python爬虫有什么用处-python为什么叫爬虫 python有什么优势
  3. oracle 字符串转为正数用 to_number()……
  4. 北斗导航 | 从北一到北二再到北三,你应该知道的北斗导航系统
  5. Android edittext限制字节数
  6. Hibernate之表间关系
  7. vue 保留小数点厚一位_2019黑龙江公务员考试行测资料分析:保留有效数字巧解对位数相乘...
  8. Bootstrap 分页导航中的翻页组件
  9. PaddlePaddle顶会论文复现 | ECO视频动作识别网络
  10. idea运行报错Parameter ‘name‘ not found. Available parameters are [arg1, arg0, param1, param2]
  11. 利用python对图像进行傅里叶变换_Python 实现图像快速傅里叶变换和离散余弦变换...
  12. 最新全国移动联通基站数据升级包(2013年4月)
  13. MVC5+EF6--1 创建Entity Framework数据模型
  14. Java基础教程——字节流
  15. CentOS系统FastDFS 配置和问题解决
  16. 关于正向设计方法包含哪些内容
  17. CMY/CMYK 打印机色彩
  18. 领域驱动设计实践框架-COLA的解读
  19. Shell脚本之函数
  20. 中国地图json、世界地图json

热门文章

  1. 死锁的 4 种排查工具 !
  2. vscode无法识别constexpr
  3. ASP.NET MVC 利用AreaRegistration进行Area区域模块化开发
  4. 蒙特卡洛法求圆周率 c语言,c++蒙特卡洛法求圆周率
  5. 计算机数据与安全课件,计算机数据及软件的安全.ppt
  6. 怎么把文件放到docker容器里
  7. oracle undo段的作用,Oracle数据库中Undo数据段的作用及类型
  8. oracle1461,Oracle 10.2.0.3的ORA-1461错误
  9. 世界之窗浏览器怎么隐藏收藏栏?
  10. win7更改适配器设置没有本地连接解决方法