latex 符号_sympy: 符号运算-1
本文主要参考资料来自sympy的官网:
Introduction - SymPy 1.4 documentationdocs.sympy.org
一般,我们使用计算机软件进行数学计算,主要是数值计算,就算有变量,也是代入具体数值来算的,我们在初中到大学学到的符号计算,很多时候无法用计算机来进行,比如下面的多项式化简:
上面的式中没有任何一个具体数值,完全是符号进行计算,这时我们只能手算了。当然,我们可以用商业软件mathematics, 但是非常昂贵,幸好我们还有python
,有了开源的sympy
模块,我们可以做到如下功能:
- core symbolic mathematics: 基础运算,包括:化简Simplification,各种函数运算等;
- Polynomials:多项式运算及求解
- Calculus:极限、微分、积分
- Solving equations:各种方程求解
- Combinatorics:组合学
- Discrete math:离散数学
- Matrices:矩阵运算
- Geometry:几何学
- Physics:物理学
- Statistics:统计学
- Cryptography:密码学
下面我们分几个专题来介绍其功能,这篇介绍基础的运算。
- 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 functions
或sympy 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 documentationdocs.sympy.org
Simplification - SymPy 1.4 documentation
latex 符号_sympy: 符号运算-1相关推荐
- 【LaTeX公式】LaTeX数学公式的符号表示
转载自:http://blog.csdn.net/ws_20100/article/details/49159291 引言 由于CSDN的Markdown编辑器能轻松地支持LATEX的公式表示. 因 ...
- Latex公式常见符号
Latex公式常见符号 一.运算符号 二.函数符号 三.括号.箭头 四.希腊字母 资源下载地址:Latex公式常见符号.pdf 一.运算符号 序号 数学符号 Latex表达式 助记 1 ×\times ...
- LaTex 各种特殊符号
LaTex 各种特殊符号 蓝色的命令依赖 amsmath 宏包(非 amssymb 宏包): 带有角标 ℓ 的符号命令依赖 latexsym 宏包. Ref: LaTex常用特殊符号对应表
- latex箭头表示符号
latex箭头表示符号 箭头类型 latex符号 ←\leftarrow← \leftarrow →\rightarrow→ \rightarrow ↔\leftrightarrow↔ \leftri ...
- latex强调/重音符号
latex强调/重音符号 强调/重音符号 latex符号 x^\hat{x}x^ \hat xˋ\grave{x}xˋ \grave xˉ\bar{x}xˉ \bar xˊ\acute{x}xˊ \a ...
- 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
第一题 #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n" ...
- 无符号定点数加法运算的VHDL描述
无符号定点数加法运算的VHDL描述 使用VHDL描述定点运算时添加运算支持的详细步骤 定位到Xilinx的安装路径下,然后找到 D:\Xilinx\Vivado\2021.1\scripts\rt\d ...
- 《C++ Primer 第五版》(第4.11节类型转换) ————关于无符号数和有符号数的运算探究
1.关于无符号数和有符号数的运算 关于无符号数和有符号数的运算,在我看来一直是觉得只要有无符号数和有符号数的运算,有符号数就转化为无符号数,但是在<C++ Primer 第五版>的p142 ...
- Latex常见数学符号写法
写在前面 本文主要记录一些Latex数学公式符号的写法,便于自己查阅.公式写法来源:刘海洋的<Latex入门>. 1 概述 Latex有两种数学公式,一种是行内公式,也就是和文本同行的数学 ...
最新文章
- 爬虫之利用requests.session进行状态保持
- python爬虫有什么用处-python为什么叫爬虫 python有什么优势
- oracle 字符串转为正数用 to_number()……
- 北斗导航 | 从北一到北二再到北三,你应该知道的北斗导航系统
- Android edittext限制字节数
- Hibernate之表间关系
- vue 保留小数点厚一位_2019黑龙江公务员考试行测资料分析:保留有效数字巧解对位数相乘...
- Bootstrap 分页导航中的翻页组件
- PaddlePaddle顶会论文复现 | ECO视频动作识别网络
- idea运行报错Parameter ‘name‘ not found. Available parameters are [arg1, arg0, param1, param2]
- 利用python对图像进行傅里叶变换_Python 实现图像快速傅里叶变换和离散余弦变换...
- 最新全国移动联通基站数据升级包(2013年4月)
- MVC5+EF6--1 创建Entity Framework数据模型
- Java基础教程——字节流
- CentOS系统FastDFS 配置和问题解决
- 关于正向设计方法包含哪些内容
- CMY/CMYK 打印机色彩
- 领域驱动设计实践框架-COLA的解读
- Shell脚本之函数
- 中国地图json、世界地图json
热门文章
- 死锁的 4 种排查工具 !
- vscode无法识别constexpr
- ASP.NET MVC 利用AreaRegistration进行Area区域模块化开发
- 蒙特卡洛法求圆周率 c语言,c++蒙特卡洛法求圆周率
- 计算机数据与安全课件,计算机数据及软件的安全.ppt
- 怎么把文件放到docker容器里
- oracle undo段的作用,Oracle数据库中Undo数据段的作用及类型
- oracle1461,Oracle 10.2.0.3的ORA-1461错误
- 世界之窗浏览器怎么隐藏收藏栏?
- win7更改适配器设置没有本地连接解决方法