latex 符号_sympy: 符号运算-1

本文主要参考资料来自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})}")

输出:

b935ea20e28ecd01d1c48b088646c6b0.png

关于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))}$$"))

输出:

3b99bf0974b4be8c5f365988e2d1a5f1.png

这里是用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西浦与杭电计算机选哪个,四邮四电究竟谁强谁弱?哪三所大学报考更有性价比?...

四邮 北京邮电学院 南京邮电学院 西安邮电大学 重庆邮电学院 四电 西安电子科技大学 电子科技大学 桂林电子科技大学 杭州电子科技大学。总体来说:成电西电>北邮>杭电>南邮重邮≈桂电>西邮。实力基本和各校年经费成正比,成电>西电>北邮…

android 获取当前时间_js如何获取当前时间并显示

js可以通过Date对象获取当前日期和时间,使用Date()获取系统当前时间,在使用getFullYear()、getMonth()、getDate() 、getHours()等方法获取特定格式的时间,在使用innerHTM方法显示。web前端学习:打造全网web前端全栈资料库&#x…

css居中的几种方法_CSS布局中的水平居中的方法

在我们做网站的过程中,怎么都逃不掉居中这个话题,各种花里胡哨的,可能只需要掌握两三个就可以完成一个网页的布局了。今天就来介绍下水平居中有哪些方法。第一种,设置当前元素水平居中,元素为block时要让p元素水平居中…

如何唤醒计算机,待机后如何唤醒计算机?介绍睡眠待机的优势

当我们将鼠标拖到习惯的位置时,我们会发现计算机实际上包括三个选项:关机,重新启动和睡眠。睡眠意味着您暂时不需要使用计算机,但是在需要时,界面可以保持不变。但是很不知道睡觉后怎么醒?如果您无法成功唤…

apollo 配置中心_配置中心——Apollo小记

一、什么是配置配置是程序运行时,动态调整行为的能力。配置有以下属性:配置是独立于程序的只读变量同一份程序在不同的配置下才会有不同的行为,而且配置对于程序来说是只读的,所以程序可以通过读取配置来改变自己的行为&#xff0…

云南计算机专修学校附中,昆明高中哪家强? 师附中和昆一中高考尖子生最多...

原标题:昆明高中哪家强? 师附中和昆一中高考尖子生最多云南网讯(记者 念新洪)昆明高中哪家强?来从11月16日公示的“昆明市2015年高中教育质量考核结果”中找答案吧!据悉,根据年初签订的责任书和目标考核规定&#xff0…

python在线编辑器import_maya_关于脚本编辑器导入python模块

import sys for p in sys.path: print p rigDir C:\Users\lenovo\Documents\maya\scripts\python\rigLib if not rigDir in sys.path: sys.path.append( rigDir ) from rigLib.base.control import * ArmCtl rigLib.base.control.Control(prefix 1_arm) 问题与解决方法 # Er…

css button 四种状态,css中按钮的四种状态

css中按钮有四种状态普通状态hover 鼠标悬停状态active 点击状态focus 取得焦点状态.btn:focus{outline:0;} 可以去除按钮或a标签点击后的蓝色边框下面的例子中.btn1用focus按钮会按下,不弹起.btn2用active按钮点击按下,会弹起html:Save Sett…

html红色星号怎么做_码农的插花艺术:HTML(一)

这是笔者学习html的过程中的小小心得和体会,由于笔者也是前端初学者,能力有限难免出错,恳请各位读者看到有错误的地方多多包涵,也欢迎各位在评论区积极讨论。严格来讲html并不算一种“语言”。html的文档可以以txt的形式保存&…

scrapy没有运行结果_关于Scrapy爬虫项目运行和调试的小技巧(下篇)

前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下。今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧。三、设置网站robots.txt规则为False一般的,我们在运用…

信佑无盘主服务器密码,(信佑无盘帮助手册.doc

(信佑无盘帮助手册1.无盘服务器配置:1.系统盘:1 块2.数据盘和内存最底配置: 内存:4G数据盘: 1块回写盘: 1,块150台以下:intel 3000-5000 芯片系列主板 或AMD平台,64位CPU8 -16G3块sas做读,3块sas做写.100台以下&#…

easyui datagrid oncheck 修改行样式_100 种 PPT 图表样式送给你

你好,这里是诺灰屋我是诺灰距离上一篇推文,已有近一个月的时间没有给大家写推送了。这期间,我一直在进行数据图表方面知识的网络调研。甚至于在知网上找了几篇论文来看,当然,内容很枯燥,不实用。同时&#…

学excel还是学python_已经会Excel了还需要学python吗?

作为一名现代职场人,相信Excel是我最熟悉不过的工具了。作为数据处理的日常办公软件,Excel以其优秀的数据分析处理功能,简单易用的操作成为大家的最爱。也许你不知道python是什么,但是一定知道Excel。 作为一名小白,我…

系统如何启动数据库服务器,怎么启动sql数据库服务器

怎么启动sql数据库服务器 内容精选换一换PostgreSQL支持逻辑备份。您可使用pg_dump逻辑备份功能,导出备份文件,再通过psql导入到RDS中,实现将PostgreSQL的数据导入到云数据库RDS中。云数据库RDS服务支持开启公网访问功能,通过弹性…

富士康服务器主板X58维修,富士康X58 Blood Rage主板BIOS预览

富士康X58主板Blood Rage在软硬件方面都已经设计完成,下边就来看看BIOS设定部分。通用条目这里暂且略过,只看看富士康独特的“Quantum BIOS”部分,有关系统各部件的条件以及超频都要在这儿完成。Quantum BIOS主界面:分为处理器功能…

python手动安装包_python pip如何手动安装二进制包

python中使用pip安装扩展包的时候,有时候会遇到如下类似报错: Running setup.py install for mysqlclient ... error ...(中间报错信息省略) building MySQLdb._mysql extension error: Microsoft Visual C 14.0 is required. Get it with "Build T…

amd cpu不能在cmd环境下运行java代码_00 开发环境搭建

我们来着手在本地计算机环境安装 TensorFlow 最新版框架。TensorFlow 框架支持多种常见的操作系统,如 Windows 10、Ubuntu 18.04、Mac OS 等等,同时也支持运行在 NVIDIA 显卡上的 GPU 版本和仅适用 CPU 完成计算的 CPU 版本。我们以最为常见 Windows 10 …

更新无限无线连接更新服务器,02-H3C WBC560多业务无线控制器软件升级操作指导...

本文中的绿洲平台指的是WBC560多业务无线控制器中的本地绿洲。1.1.1 软件升级方式简介AC支持通过命令行进行软件升级和通过Web页面进行软件升级,命令行升级方式只能通过以太网口telnet到AC进行升级,无法通过HDM进行升级。升级方式说明需要重启AC来实现A…

pythonista_Pythonista20190325伤不起

图片发自简书App print("You enter a dark room with two doors. Do you go through door #1 or door #2?") door input("> ") if door "1": print("Theres a giant bear here eating a cheese cake,What do you do?") print(&…

nfc卡模式与标准模式_渠道如何标准化管理,建立新的销售模式,提升业绩完成率...

请您关注,转发,点赞!转化能力持续为您创作实用有效的营销工具,管理工具,计划表格,如何完成业绩方法,战略如何规划,如何总结和规划等实用文件,提高职场营销人的营销能力和…