python 数学公式_用Python学数学之Sympy代数符号运算

2023-10-25 14:20

本文主要是介绍python 数学公式_用Python学数学之Sympy代数符号运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在我们初、高中和大学近10年的学习时间里,数学一直占据着非常大的分量,但是回忆过去可以发现,我们把大量的时间都花在反复解题、不断运算上,计算方法、运算技巧、笔算能力以及数学公式的记忆仿佛成了我们学习数学的全部。这些记忆和技巧没几年就忘掉了,但很多人甚至还记得那份阴影;笔算与解题在AI、图形图像、数据分析等上被软件所取代。那我们学生时代的数学还剩下什么呢?

计算器与数学

说起数学计算器,我们常见的是加减乘除四则运算,有了它,我们就可以摆脱笔算和心算的痛苦。四位数以上的加减乘除在数学的原理上其实并不难,但是如果不借助于计算器,光依赖我们的运算能力(笔算和心算),不仅运算的准确度大打折扣,而且还会让我们对数学的运用停留在一个非常浅的层次。尽管四则运算如此简单,但是多位数运算的心算却在我们生活中被归为天才般的能力。但是数学的应用应该生活化、普及化,而不是只属于天才的专利,计算器改变了这一切,这就是计算器的魅力。

计算器还可以做科学运算,比如乘方、开方、指数、对数、三角函数等,尽管这些知识在我们初中时代,通过纸笔也是能运算起来的,但是也仅限于一些极其常用和简单的运算,一旦复杂起来,通过纸笔来运算就是一项复杂的工程了。所以说,计算器可以让我们离数学的应用更近。

但是我们学生时代所学的数学可远不止这些,尤其是高等数学(微积分)、线性代数、概率统计等数学知识应用非常广泛(我也是后来才知道),但是由于他们的运算非常复杂,我们即便掌握了这些知识,想要应用它又谈何容易,那有没有微积分、线性代数、概率统计等的计算器呢?

答案是有的,它们就是计算机代数系统Computer Algebra System,简称CAS,Python的Sympy库也支持带有数学符号的微积分、线性代数等进行运算。有了计算器,我们才能真正脱离数学复杂的解题本身,把精力花在对数学原理和应用的学习上,而这才是(在工作方面)数学学习的意义。

计算机代数系统

Sympy可以实现数学符号的运算,用它来进行数学表达式的符号推导和验算,处理带有数学符号的导数、极限、微积分、方程组、矩阵等,就像科学计算器一样简单,类似于

几大知名的数学软件比如Mathematica、Maxima、Matlab(需Symbolic Math Toolbox)、Maple等都可以做符号运算,在上篇文章中我们已经拿Python和R、Matlab对比了,显然Python在指定场景下确实优势非常明显,于是我又调研了一下Sympy与Mathematica的比较,在输入公式以及生成图表方面,Sympy确实不行(这一点Python有其他库来弥补),Mathematica能够做什么,Sympy基本也能做什么。

所以说Python在专业数学(数学、数据科学等)领域,由于其拥有非常多而且强大的第三方库,构成了一个极其完善的生态链,即使是面对世界上最为强势最为硬核的软件也是丝毫不虚的。本专栏用Python学数学的下一期也会介绍一些非常实用的数学工具和数学教材资源,让数学的学习更简单更生动。

Sympy的符号运算

如果之前是学数学相关专业了解计算机代数系统CAS,就会对数学符号的运算比较熟悉,而如果之前是程序员,可能会有点不太明白,下面我们就来了解一下。

Sympy与Math函数的区别

我们先来看一下Sympy库和Python内置的Math函数对数值计算的处理有什么不同。为了让代码可执行,下面的代码都是基于Python3的完整代码。

import sympy,math

print(math.sqrt(8))

print(sympy.sqrt(8))

执行之后,结果显示为:

2.8284271247461903

2*sqrt(2)

math模块是直接求解出一个浮点值,而Sympy则是用数学符号表示出结果,结合LaTex的语法就可以得出我们在课本里最熟悉的的:

equation?tex=%5C%5C2%5Csqrt%7B2%7D

数学符号与表达式

我们要对数学方程组、微积分等进行运算时,就会遇到变量比如x,y,z,f等的问题,也会遇到求导、积分等代数符号表达式,而Sympy就可以保留变量,计算有代数符号的表达式的。

from sympy import *

x = Symbol('x')

y = Symbol('y')

k, m, n = symbols('k m n')

print(3*x+y**3)

输出的结果为:3*x + y**3,转化为LaTex表示法之后结果为

equation?tex=3x%2By%5E3 ,输出的结果就带有x和y变量。Symbol()函数定义单个数学符号;symbols()函数定义多个数学符号。

折叠与展开表达式

factor()函数可以折叠表达式,而expand()函数可以展开表达式,比如表达式:

equation?tex=x%5E4%2Bxy%2B8x ,折叠之后应该是

equation?tex=x%28x%5E3%2By%2B8%29 。我们来看具体的代码:

from sympy import *

x,y = symbols('x y')

expr=x**4+x*y+8*x

f_expr=factor(expr)

e_expr=expand(f_expr)

print(f_expr)

print(e_expr)

表达式的折叠与展开,对应的数学知识就是因式分解,相关的数学知识在人教版初二的教程里。用Python学习数学专栏的目的就是要Python与初高中、大学的数学学习结合起来,让数学变得更加简单生动。

表达式化简

simplify()函数可以对表达式进行化简。有一些表达式看起来会比较复杂,就拿人教版初二上的一道多项式的乘法为例,简化

equation?tex=%282x%29%5E3%28-5xy%5E2%29

from sympy import *

x,y = symbols('x y')

expr=(2*x)**3*(-5*x*y**2)

s_expr=simplify(expr)

print(s_expr)

求解方程组

在人教版的数学教材里,我们初一上会接触一元一次方程组,初一下就会接触二元一次方程、三元一次方程组,在初三上会接触到一元二次方程,使用Sympy的solve()函数就能轻松解题。

解一元一次方程

我们来求解这个一元一次方程组。(题目来源于人教版七年级数学上)

equation?tex=6+%5Ctimes+x+%2B+6+%5Ctimes%28x-2000%29%3D150000

from sympy import *

x = Symbol('x')

print(solve(6*x + 6*(x-2000)-150000,x))

我们需要掌握Python的代码符号和数学符号之间的对应关系,解一元一次方程就非常简单。

解二元一次方程组

我们来看如何求解二元一次方程组。(题目来自人教版七年级数学下)

equation?tex=%5C%5C+%5Cbegin%7Bcases%7D+x%2B+y+%3D10%2C%5C%5C+2+%5Ctimes+x%2B+y%3D16++%5Cend%7Bcases%7D+

from sympy import *

x,y = symbols('x y')

print(solve([x + y-10,2*x+y-16],[x,y]))

很快就可以得出{x: 6, y: 4},也就是

equation?tex=%5C%5Cx%3D6%2Cy%3D4

解三元一次方程组

我们来看如何解三元一次方程组。(题目来自人教版七年级数学下)

equation?tex=%5C%5C+%5Cbegin%7Bcases%7D+x%2By%2Bz%3D12%2C%5C%5C+x%2B2y%2B5z%3D22%2C%5C%5C+x%3D4y.++%5Cend%7Bcases%7D+

执行之后,很快可以得出结果{x: 8, y: 2, z: 2},也就是

equation?tex=%5C%5Cx%3D8%2Cy%3D2%2Cz%3D2

解一元二次方程组

比如我们来求解人教版九年级一元二次方程组比较经典的一个题目,$ax^2+bx+c=0$.

from sympy import *

x,y = symbols('x y')

a,b,c=symbols('a b c')

expr=a*x**2 + b*x + c

s_expr=solve( expr, x)

print(s_expr)

执行之后得出的结果为[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)],我们知道根与系数的关系二次方程会有两个解,这里的格式就是一个列表。转为我们常见的数学公式即为:

equation?tex=%5C%5C%5Cfrac%7B-b%2B%5Csqrt%7B-4ac%2Bb%5E2%7D%7D%7B2a%7D+%E3%80%81-%5Cfrac%7Bb%2B%5Csqrt%7B-4ac%2Bb%5E2%7D%7D%7B2a%7D

微积分Calculus

微积分是大学高等数学里非常重要的学习内容,比如求极限、导数、微分、不定积分、定积分等都是可以使用Sympy来运算的。 求极限 Sympy是使用limit(表达式,变量,极限值)函数来求极限的,比如我们要求

equation?tex=%5Clim+%5Climits_%7Bx+%5Cto+0%7D+%5Cfrac%7Bsinx%28x%29%7D%7Bx%7D 的值。

from sympy import *

x, y, z = symbols('x y z')

expr = sin(x)/x

l_expr=limit(expr, x, 0)

print(l_expr)

执行后即可得到结果为1。

求导

可以使用diff(表达式,变量,求导的次数)函数对表达式求导,比如我们要对

equation?tex=sin%28x%29e%5Ex 进行

equation?tex=x 求导,以及求导两次,代码如下:

from sympy import *

x,y = symbols('x y')

expr=sin(x)*exp(x)

diff_expr=diff(expr, x)

diff_expr2=diff(expr,x,2)

print(diff_expr)

print(diff_expr2)

求导一次的结果就是exp(x)*sin(x) + exp(x)*cos(x),也就是

equation?tex=e%5Exsin%28x%29%2Be%5Excos%28x%29 ;求导两次的结果是2*exp(x)*cos(x),也就是

equation?tex=%5C%5C2e%5Excosx

求不定积分

Sympy是使用integrate(表达式,变量)来求不定积分的,比如我们要求$\int(e^x\sin{(x)} + e^x\cos{(x)})\,dx$

from sympy import *

x,y = symbols('x y')

expr=exp(x)*sin(x) + exp(x)*cos(x)

i_expr=integrate(expr,x)

print(i_expr)

执行之后的结果为:exp(x)*sin(x) 转化之后为:

equation?tex=%5C%5Ce%5Exsin%28x%29

求定积分

Sympy同样是使用integrate()函数来做定积分的求解,只是语法不同:integrate(表达式,(变量,下区间,上区间)),我们来看如果求解

equation?tex=%5Cint_%7B-%5Cinfty%7D%5E%5Cinfty+%5Csin%7B%28x%5E2%29%7D%5C%2Cdx

from sympy import *

x,y = symbols('x y')

expr=sin(x**2)

i_expr=integrate(expr, (x, -oo, oo))

print(i_expr)

执行之后的结果为sqrt(2)*sqrt(pi)/2,也就是

equation?tex=%5C%5C%5Cfrac%7B%5Csqrt%7B2%7D%5Csqrt%7B%5Cpi%7D%7D%7B2%7D

Sympy能够做的也远不止这些,初高中、大学的数学运算题在Sympy极为丰富的功能里不过只是开胃入门小菜而已。

这篇关于python 数学公式_用Python学数学之Sympy代数符号运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/283138

相关文章

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合