我的编程空间,编程开发者的网络收藏夹
学习永远不晚

用Python学数学之Sympy代数符

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

用Python学数学之Sympy代数符

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

计算器与数学

说起数学计算器,我们常见的是加减乘除四则运算,有了它,我们就可以摆脱笔算和心算的痛苦。四位数以上的加减乘除在数学的原理上其实并不难,但是如果不借助于计算器,光依赖我们的运算能力(笔算和心算),不仅运算的准确度大打折扣,而且还会让我们对数学的运用停留在一个非常浅的层次。

尽管四则运算如此简单,但是多位数运算的心算却在我们生活中被归为天才般的能力。但是数学的应用应该生活化、普及化,而不是只属于天才的专利,计算器改变了这一切,这就是计算器的魅力。
计算器还可以做科学运算,比如乘方、开方、指数、对数、三角函数等,尽管这些知识在我们初中时代,通过纸笔也是能运算起来的,但是也仅限于一些极其常用和简单的运算,一旦复杂起来,通过纸笔来运算就是一项复杂的工程了。所以说,计算器可以让我们离数学的应用更近

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

答案是有的,它们就是计算机代数系统Computer Algebra System,简称CAS,Python的Sympy库也支持带有数学符号的微积分、线性代数等进行运算。

有了计算器,我们才能真正脱离数学复杂的解题本身,把精力花在对数学原理和应用的学习上,而这才是(在工作方面)数学学习的意义。

计算机代数系统

Sympy可以实现数学符号的运算,用它来进行数学表达式的符号推导和验算,处理带有数学符号的导数、极限、微积分、方程组、矩阵等,就像科学计算器一样简单,类似于计算机代数系统CAS,虽然CAS通常是可视化软件,但是维基百科上也把Sympy归为CAS。

几大知名的数学软件比如MathematicaMaximaMatlab(需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的语法就可以得出我们在课本里最熟悉的的:$2\sqrt{2}$。

数学符号与表达式

我们要对数学方程组、微积分等进行运算时,就会遇到变量比如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表示法之后结果为$3x+y^3$,输出的结果就带有x和y变量。Symbol()函数定义单个数学符号;symbols()函数定义多个数学符号。

折叠与展开表达式

factor()函数可以折叠表达式,而expand()函数可以展开表达式,比如表达式:$x^4+xy+8x$,折叠之后应该是$x(x^3+y+8)$。我们来看具体的代码:

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()函数可以对表达式进行化简。有一些表达式看起来会比较复杂,就拿人教版初二上的一道多项式的乘法为例,简化$(2x)^3(-5xy^2)$。

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()函数就能轻松解题。

解一元一次方程

我们来求解这个一元一次方程组。(题目来源于人教版七年级数学上)
$$6 \times x + 6 \times(x-2000)=150000$$

from sympy import *
x = Symbol('x')
print(solve(6*x + 6*(x-2000)-150000,x))

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

解二元一次方程组

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

$$ \begin{cases} x+ y =10,\\ 2 \times x+ y=16 \end{cases} $$

from sympy import *
x,y = symbols('x y')
print(solve([x + y-10,2*x+y-16],[x,y]))

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

解三元一次方程组

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

$$ \begin{cases} x+y+z=12,\\ x+2y+5z=22,\\ x=4y. \end{cases} $$

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

解一元二次方程组

比如我们来求解人教版九年级一元二次方程组比较经典的一个题目,$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)],我们知道根与系数的关系二次方程会有两个解,这里的格式就是一个列表。转为我们常见的数学公式即为:
$$\frac{-b+\sqrt{-4ac+b^2}}{2a} 、-\frac{b+\sqrt{-4ac+b^2}}{2a}$$

微积分Calculus

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

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(表达式,变量,求导的次数)函数对表达式求导,比如我们要对$sin(x)e^x$进行$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),也就是$e^xsin(x)+e^xcos(x)$;求导两次的结果是2*exp(x)*cos(x),也就是
$$2e^xcosx$$

求不定积分

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) 转化之后为:
$$e^xsin(x)$$

求定积分

Sympy同样是使用integrate()函数来做定积分的求解,只是语法不同:integrate(表达式,(变量,下区间,上区间)),我们来看如果求解
$\int_{-\infty}^\infty \sin{(x^2)}\,dx$

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,也就是
$$\frac{\sqrt{2}\sqrt{\pi}}{2}$$

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

用Python学数学之Sympy代数符

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

用Python学数学之Sympy代数符

在我们初、高中和大学近10年的学习时间里,数学一直占据着非常大的分量,但是回忆过去可以发现,我们把大量的时间都花在反复解题、不断运算上,计算方法、运算技巧、笔算能力以及数学公式的记忆仿佛成了我们学习数学的全部。这些记忆和技巧没几年就忘掉了,
2023-01-31

python学习之数字

目录 python学习之数字 1.python数值类型 2. 数字类型转换 3. 常用函数 3.1 数学函数 3.2 随机函数
2023-01-30

python学习之数组二

作用于数组的函数:通用函数:函数基于元素的,以单元方式作用于数组的,返回的是与原数组具有相同形状的数组。不通用函数(数组函数):函数能以行或者列的方式作用于整个矩阵;如果没有提供任何参数时,它们将作用于整个矩阵。例如:max、sum和min
2023-01-31

python学习之数据类型与运算符号

python版本:3.6    python编辑器:pycharm 最新版本整理成代码如下:#!/usr/bin/env python#-*- coding: utf-8 -*-# 数学操作符print(2 ** 3) # ** 指数
2023-01-30

python学习之数组查找。

import numpy as npdef FindIndex(source, Destina): i = 0; for iterating_var in source: if(iterating_var == D
2023-01-31

PYTHON学习0039:函数---迭代

迭代就类似循环。数字不是可迭代类型。Iterable表示是否是可迭代对象,Iterator表示是否是迭代器。数据流是一个有序的数据排列集合,表示没有截止的,就像水流和时间一样,无穷无尽的。而列表,字典等有起点和终点的。
2023-01-31

python 常用数学函数

python 中自带常用数学函数,使用前需加载 math 模块import  math0.常数:                (1) math.e    =  2.71828...                (2)math.pi  
2023-01-31

Python科学计算学习之高级数组(二)

代码性能和向量化  背景:Python是一种解释型的编程语言,基本的python代码不需要任何中间编译过程来得到机器代码,而是直接执行。而对于C、C++等编译性语言就需要在执行代码前将其编译为机器指令。 但是,解释型代码的速度比编译型代码要
2023-01-31

Python学习日志之Python数据结

Python数据结构初识:一、Python数据结构概述1.何为数据结构   在程序中,同样的一个或几个数据组织起来,可以有不同的组织方式,也就是不同的存储方式,不同的组织方式就是不同的结构,我们把这些数据组织在一起的结构就叫做数据结构例如:
2023-01-31

python学习之map函数和reduc

MapReduce:面向大型集群的简化数据处理   引文map()函数Python中的map()函数接收两个参数,一个是调用函数对象(python中处处皆对象,函数未实例前也可以当对象一样调用),另一个是调用函数所需要的参数,返回值是迭代计
2023-01-30

浅谈Python数学建模之整数规划

目录一、从线性规划到整数规划1.1、为什么会有整数规划?1.2、四舍五入就能得到整数解吗?二、整数规划的求解方法2.1、分支定界法(Branch and bound)2.2、割平面法(Cutting plane)2.3、整数规划的编程方案三
2022-06-02

浅谈Python数学建模之数据导入

目录一、数据导入是所有数模编程的第一步二、在程序中直接向变量赋值2.1、为什么直接赋值?2.2、直接赋值的问题与注意事项三、Pandas 导入数据3.1、Pandas 读取 Excel 文件3.2、Pandas 读取 csv 文件3.3、P
2022-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录