python进阶之符号计算概述SymPy

news2024/11/19 13:17:30

一、概述

1.1SymPy简介

SymPy 是一个由 Python 编写的符号计算库,它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。它完全由 Python 写成,不依赖于外部库。SymPy 支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散数学、几何学、概率与统计、物理学等方面的功能

1.2SymPy具体应用

从 SymPy 的 1.4 版本文档中,可以看出,SymPy 可以支持很多初等数学,高等数学,甚至研究生数学的符号计算。在初等数学和高等数学中,SymPy 可以支持的内容包括但不限于:

  1. 基础计算(Basic Operations);
  2. 公式简化(Simplification);
  3. 微积分(Calculus);
  4. 解方程(Solver);
  5. 矩阵(Matrices);
  6. 几何(geometry);
  7. 级数(Series);

在更多的数学领域中,SymPy 可以支持的内容包括但不限于:

  1. 范畴论(Category Theory);
  2. 微分几何(Differential Geometry);
  3. 常微分方程(ODE);
  4. 偏微分方程(PDE);
  5. 傅立叶变换(Fourier Transform);
  6. 集合论(Set Theory);
  7. 逻辑计算(Logic Theory)。

1.3快速入门

sympy.exp(1), sympy.I, sympy.pi, sympy.oo

新建符号

在使用符号之前,先要利用 symbols 函数定义符号,语句是:

# 新建符号 x, y
x, y = symbols('x y')

例子 

from sympy import *
x, y, z = symbols('x y z')
y = expand((x + 1)**2) # expand() 是展开函数
y

将字符串转换为 SymPy 表达式

利用 sympify 函数可以将字符串表达式转换为 SymPy 表达式。

注意sympify 是符号化,与另一个函数  simplify (化简)拼写相近,不要混淆。
str_expr = 'x**2 + 2*x + 1'
expr = sympify(str_expr)
expr

转换为指定精度的数值解

可以使用符号变量的 evalf 方法将其转换为指定精度的数值解,例如:

pi.evalf(3) # pi 保留 3 位有效数字

利用 lambdify 函数将 SymPy 表达式转换为 NumPy 可使用的函数

如果进行简单的计算,使用 subs 和 evalf 是可行的,但要获得更高的精度,则需要使用更加有效的方法。例如,要保留小数点后 1000 位,则使用 SymPy 的速度会很慢。这时,您就需要使用 NumPy 库。

lambdify 函数的功能就是可以将 SymPy 表达式转换为 NumPy 可以使用的函数,然后用户可以利用 NumPy 计算获得更高的精度。

import numpy
a = numpy.pi / 3
x = symbols('x')
expr = sin(x)
f = lambdify(x, expr, 'numpy')
f(a)
0.8660254037844386
expr.subs(x, pi/3)

多项式和有理函数化简

下面介绍几个用于多项式或有理函数化简的函数。

expand (展开)

将多项式展开,使用 expand 函数。例如:

x_1 = symbols('x_1')
expand((x_1 + 1)**2)

x_{1}^{2} + 2 x_{1} + 1

factor (因式分解)

用 factor 函数可以对多项式进行因式分解,例如:

factor(x**3 - x**2 + x - 1)

\left(x - 1\right) \left(x^{2} + 1\right)

实际上,多项式的展开和因式分解是互逆过程,因此  factor 和  expand 也是相对的。

collect (合并同类项)

利用 collect 合并同类项,例如:

expr = x*y + x - 3 + 2*x**2 - z*x**2 + x**3
collect(expr, x)

x^{3} + x^{2} \left(- z + 2\right) + x \left(x^{2} + 2 x + 2\right) - 3

cancel (有理分式化简)

消去分子分母的公因式使用 cancel 函数,例如:

cancel((x**2 + 2*x + 1)/(x**2 + x))

\frac{1}{x} \left(x + 1\right)

apart (部分分式展开)

使用 apart 函数可以将分式展开,例如:

expr = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)
expr

\frac{4 x^{3} + 21 x^{2} + 10 x + 12}{x^{4} + 5 x^{3} + 5 x^{2} + 4 x}

apart(expr)

\frac{2 x - 1}{x^{2} + x + 1} - \frac{1}{x + 4} + \frac{3}{x}

数列求和:

from sympy import *
x, a = symbols("x a")
Sum(x ** 2, (x, 1, a)).doit()

数列求积:

Product(x**2,(x, 1, a)).doit()

输出运算结果的  latex代码

使用 latex 函数可以输出运算结果的 latex 代码,例如:

print(latex(integrate(sqrt(x), x)))

\frac{2 x^{\frac{3}{2}}}{3}

二、课堂实操

2.1环境安装和版本检测

import pylab as pl
from sympy import *
import numpy as np
import sympy
sympy.__version__

2.2SymPy 的基础计算

在数学中,基础的计算包括实数和复数的加减乘除,那么就需要在程序中描述出实数与复数。

2.2.1经典公式

著名的欧拉公式    e^{ix} +1= 0

from sympy import *
E**(I*pi)+1

公式展开

init_printing(use_unicode=True)#公式显示

#执行SymPy提供的 init printing()可以使用数学符号显示运算结果。
#但它会将Python的内置对象也转换成LateX显示

x = symbols("x")#变量名定义成符号
#x = 2

expand(E**(I*x))#公式展开

2.2.2级数展开

init_printing(use_unicode=True)#公式显示
from sympy import *
x = symbols("x")
tmp = series(exp(I*x),x,0,9)
print(latex(tmp))

1 + i x - \frac{x^{2}}{2} - \frac{i x^{3}}{6} + \frac{x^{4}}{24} + \frac{i x^{5}}{120} - \frac{x^{6}}{720} - \frac{i x^{7}}{5040} + \frac{x^{8}}{40320} + \mathcal{O}\left(x^{9}\right)

2.2.3不定积分

- x \cos{\left (x \right )} + \sin{\left (x \right )}

tmp=integrate(x*sin(x),x)
tmp
#print(latex(tmp))

2.2.4定积分

tmp=integrate(x*sin(x),(x,0,2*pi))
tmp
#print(latex(tmp))

\int_{0}^{2 \pi} x \sin{\left (x \right )}\, dx 

Integral(x*sin(x),(x,0,2*pi))

from sympy import *
oo = symbols("oo")
x, y = symbols("x y")
z = integrate(exp(-x**2 - y**2), (x, -oo, oo), (y, -oo, oo))
z.evalf(10)

2.2.5导数

diff(sin(x)*exp(x),x)
#print(latex(diff(sin(x)*exp(x),x)))

e^{x} \sin{\left (x \right )} + e^{x} \cos{\left (x \right )}

# 求 3 阶导数
diff(x**4, x, 3)

24 x

2.2.6微分

t = Derivative(sin(x),x)
t

求解微分方程

使用 dsolve 函数求解微分方程。首先需要建立符号函数变量:

f = symbols('f', cls = Function)
diffeq = Eq(f(x).diff(x, 2) - 2*f(x).diff(x) + f(x), sin(x))
diffeq
dsolve(diffeq, f(x))

Eq 函数是 SymPy 中的一个重要函数,它可以用来创建或判断两个表达式是否相等。Eq 函数的一般用法是:

Eq(左辺, 右辺)

其中,左辺和右辺是两个 SymPy 的表达式,它们可以是符号、数字、函数、多项式等。Eq 函数会返回一个 Eq 对象,它表示左辺和右辺之间的等式关系。

2.2.7极限

limit(sin(x)/x,x,0)

limit(1/x, x, 0, '+')

2.2.8解方程

solve(x**2-4,x)

解线性方程组:

linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))

2.2.9表达式变换和公式化简

simplify((x+2)**2-(x-1)**2)

2.2.10矩阵运算

我们在进行矩阵运算之前,需要用 Matrix 构造矩阵,例如:

# 构造矩阵
Matrix([[1, -1], [3, 4], [0, 2]])

 \left[\begin{matrix}1 & -1\\3 & 4\\0 & 2\end{matrix}\right]

# 构造列向量
Matrix([1, 2, 3])

\left[\begin{matrix}1\\2\\3\end{matrix}\right]

# 构造行向量
Matrix([[1], [2], [3]]).T

\left[\begin{matrix}1 & 2 & 3\end{matrix}\right]

矩阵转置用矩阵变量的  T 方法。
# 构造单位矩阵
eye(4)

\left[\begin{matrix}1 & 0 & 0 & 0\\0 & 1 & 0 & 0\\0 & 0 & 1 & 0\\0 & 0 & 0 & 1\end{matrix}\right] 

# 构造零矩阵
zeros(4)

\left[\begin{matrix}0 & 0 & 0 & 0\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\end{matrix}\right]

# 构造壹矩阵
ones(4)

\left[\begin{matrix}1 & 1 & 1 & 1\\1 & 1 & 1 & 1\\1 & 1 & 1 & 1\\1 & 1 & 1 & 1\end{matrix}\right]

# 构造对角矩阵
diag(1, 2, 3, 4)

 \left[\begin{matrix}1 & 0 & 0 & 0\\0 & 2 & 0 & 0\\0 & 0 & 3 & 0\\0 & 0 & 0 & 4\end{matrix}\right]

矩阵转置

矩阵转置用矩阵变量的 T 方法。例如:

a = Matrix([[1, -1], [3, 4], [0, 2]])
a

 \left[\begin{matrix}1 & -1\\3 & 4\\0 & 2\end{matrix}\right]

# 求矩阵 a 的转置
a.T

 \left[\begin{matrix}1 & 3 & 0\\-1 & 4 & 2\end{matrix}\right]

求矩阵的幂

求矩阵 M的 2 次幂:

# 求矩阵 M 的 2 次幂
M = Matrix([[1, 3], [-2, 3]])
M**2

 \left[\begin{matrix}-5 & 12\\-8 & 3\end{matrix}\right]

特殊地,矩阵的 −1 次幂就是矩阵的逆。

# 求矩阵 M 的逆
M**-1

\left[\begin{matrix}\frac{1}{3} & - \frac{1}{3}\\\frac{2}{9} & \frac{1}{9}\end{matrix}\right] 

求矩阵的行列式

用矩阵变量的 det 方法可以求其行列式:

M = Matrix([[1, 0, 1], [2, -1, 3], [4, 3, 2]])
M

 \left[\begin{matrix}1 & 0 & 1\\2 & -1 & 3\\4 & 3 & 2\end{matrix}\right]

M.det()

−1

求矩阵的特征值和特征多项式

用矩阵变量的 eigenvals 和 charpoly 方法求其特征值和特征多项式。

M = Matrix([[3, -2,  4, -2], [5,  3, -3, -2], [5, -2,  2, -2], [5, -2, -3,  3]])
M
M.eigenvals()
{3: 1, -2: 1, 5: 2}
lamda = symbols('lamda')
p = M.charpoly(lamda)
factor(p)
  • 创建了一个 4x4 的矩阵 M,它的元素是:

  • 使用了 M.eigenvals() 方法来求解 M 的特征值,它返回了一个字典,表示 M 的特征值和它们的代数重数。您得到的结果是:

{3:1,−2:1,5:2}

这表示 M 有三个不同的特征值,分别是 3,-2,和 5。其中,3 和 -2 的代数重数都是 1,表示它们各自对应一个线性无关的特征向量;而 5 的代数重数是 2,表示它对应两个线性相关的特征向量。

  • 定义了一个符号变量 lamda,用来表示特征多项式的变量。您使用了 M.charpoly(lamda) 方法来求解 M 的特征多项式,它返回了一个 Poly 对象,表示 M 的特征多项式。您得到的结果是:

λ4−9λ3+18λ2+54λ−225

这表示 M 的特征多项式是一个四次多项式,它的系数是:

[1​−9​18​54​−225​]

  • 使用了 factor 函数来对 M 的特征多项式进行因式分解,它返回了一个表达式,表示 M 的特征多项式的因式分解形式。您得到的结果是:

(λ−3)(λ+2)(λ−5)2

这表示 M 的特征多项式可以分解为三个一次因式和一个二次因式的乘积。这也验证了 M 的特征值和它们的代数重数。

2.2.11数论

阶乘:

factorial(10)

分解质因数:

factorint(300)

factorint(300, visual=True)

求欧拉函数:

totient(25)

判断质数:

isprime(101)
True

求因子:

divisors(36)
[1, 2, 3, 4, 6, 9, 12, 18, 36]

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

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

相关文章

搭建Excel服务器

1、下载Excel服务器 下载地址 2、解压文件 3、打开服务器 4、服务器运行信息 5、连接测试 打开客户端 6、登录到服务器 默认账号 密码 admin 3 修改文件保存路径(服务器端点击配置) 7、客户端整体界面 8、配置权限 9、设计模板 10、其他用户登录就可以填写信息 11、用户&#…

JVM基础了解

JVM 是java虚拟机。 作用:运行并管理java源码文件锁生成的Class文件;在不同的操作系统上安装不同的JVM,从而实现了跨平台的保证。一般在安装完JDK或者JRE之后,其中就已经内置了JVM,只需要将Class文件交给JVM即可 写好的…

【MCUXpresso for VS Code】-- 工程搭建后期维护

​ 基于上一篇文章【MCUXpresso for VS Code】 – 基于VSCode搭建nxp mcu工程_ 本章将介绍工程搭建完成后,后期维护问题。 1.MCUXpresso 插件窗口 该窗口,通常用在编译调试,工程导入导出等场合。编译和调试除了点击图标外,也可以…

python简单计算器

附赠源码: import PySimpleGUI as sg import relistsNumber [[AC, (, ), %],[1, 2, 3, ],[4, 5, 6, -],[7, 8, 9, x],[0, ., , ], ]layout [[sg.Text(font(黑体, 10), key-msg-)],[sg.Multiline(,key-show-,s(22, 10),font(黑体, 14),border_width1,expand_xTrue…

Java进阶(3)——手动实现ArrayList 源码的初步理解分析 数组插入数据和删除数据的问题

目录 引出手动实现ArrayList定义接口MyList<T>写ArrayList的实现类增加元素删除元素 写测试类进行测试数组插入数据? 总结 引出 1.ArrayList的结构分析&#xff0c;可迭代接口&#xff0c;是List的实现&#xff1b; 2.数组增加元素和删除元素的分析&#xff0c;何时扩容…

Spring三级缓存解决循环依赖问题

一、Bean对象的创建过程 一般的Bean对象如下&#xff1a;首先通过构造器构造一个普通对象&#xff0c;然后进行依赖注入&#xff0c;再进行一些初始化操作&#xff0c;初始化后根据AOP生成代理对象&#xff0c;最后再放入单例池map&#xff0c;这个单例池map就是一级缓存。 …

Data Abstract for .NET and Delphi Crack

Data Abstract for .NET and Delphi Crack .NET和Delphi的数据摘要是一套或RAD工具&#xff0c;用于在.NET、Delphi和Mono中编写多层解决方案。NET和Delphi的数据摘要是一个套件&#xff0c;包括RemObjects.NET和Delphi版本的数据摘要。RemObjects Data Abstract允许您创建访问…

DHCP Server

简介 动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 是 RFC 1541&#xff08;已被 RFC 2131 取代&#xff09;定义的标准协议&#xff0c;该协议允许服务器向客户端动态分配 IP 地址和配置信息。 使用UDP协…

C++MFC 串口通信 上位机

本节介绍 在工业控制中&#xff0c;工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行&#xff0c;应用广泛。 一般情况下&#xff0c;工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的&#xff0c;只能由作为主…

软件测试知识库+1,5款顶级自动化测试工具推荐和使用分析

“工欲善其事必先利其器”&#xff0c;在自动化测试领域&#xff0c;自动化测试工具的核心地位不容置疑的。目前市面上有很多可以支持接口测试的工具&#xff0c;在网上随便一搜就可以出来很多&#xff0c;利用自动化测试工具进行接口测试&#xff0c;可以很好的提高测试效率&a…

Web3创新者之夜,与其他开发者一同畅谈波卡生态

Token2049在即&#xff0c;许多开发者都将在9月中齐聚新加坡&#xff0c;一同讨论区块链生态发展及未来。届时将会有超过1万名与会者&#xff0c;并有超过300个赞助商和项目协助支持本次大会。波卡作为跨链互操作性的龙头生态也将参与至本次盛会之中。 为了让波卡社区的成员、贡…

uniapp微信小程序消息订阅快速上手

一、微信公众平台小程序开通消息订阅并设置模板 这边的模板id和详细内容后续前后端需要使用 二、uniapp前端 需要是一个button触发 js&#xff1a; wx.getSetting({success(res){console.log(res)if(res.authSetting[scope.subscribeMessage]){// 业务逻辑}else{uni.request…

Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)

一、自动化简介 1.自动化测试概念&#xff1a; 是把以人为驱动的测试转化为机器执行的一种过程&#xff0c;它是一种以程序测试程序的过程 2.自动化测试分类&#xff1a; 一般IT上所说的自动化测试是指功能自动化测试&#xff0c;通过编码的方式用一段程序来测试一个软件的功…

Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 持续更新中(预计8.18完成)~

Ctfshow 命令执行 web29 pregmatch是正则匹配函数&#xff0c;匹配是否包含flag&#xff0c;if(!preg_match("/flag/i", $c))&#xff0c;/i忽略大小写 可以利用system来间接执行系统命令 flag采用f*绕过&#xff0c;或者mv fl?g.php 1.txt修改文件名&#xff0c…

初识Visual Basic编辑器并建立一段简单的代码(下)

【分享成果&#xff0c;随喜正能量】时间宝贵&#xff0c;切莫贪睡。学习诸大菩萨的精神&#xff0c;勇猛精进不懈怠&#xff1b;随缘进取不疲厌。单是说不行&#xff0c;要紧的是做。 《VBA之Excel应用》&#xff08;10178983&#xff09;是非常经典的&#xff0c;是我推出的…

【运维】linkis1.3.2添加jdbc引擎(添加mysql、greenplum、starrocks、doris数据源查询)与配合多数据源管理提交任务初探

文章目录 一. 引擎的安装1. 前置工作2. 获取引擎插件3. 上传和加载4. 引擎刷新4.1. 重启刷新4.2. 检查引擎是否刷新成功 二. 测试mysql、starrocks与doris数据库1. 通过shell提交任务2. 通过(IDE)shell进行提交3. 通过接口提交 三. 添加greenplum四. 通过linkis的数据源管理提交…

【java毕业设计】基于SSM+MySql的人才公寓管理系统设计与实现(程序源码)--人才公寓管理系统

基于SSMMySql的人才公寓管理系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于SSMMySql的人才公寓管理系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方式。更多毕业…

VGG简单学习

VGG简单学习 简单介绍 在AlexNet网络的基础上&#xff0c;为了设计深层神经网络&#xff0c;牛津大学设计了VGG网络,采用块的设计理念&#xff0c;将AlexNet中多个重复的卷积层和池化层组成一个块 论文中&#xff0c;使用3x3卷积核&#xff0c;padding1的卷积层 和带有2x2的汇…

网工内推 | 网络工程师专场,CCNP证书优先,多次晋升机会

01 上海正诺信息科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责公司办公内网内网需求对接、实施和方案的标准化&#xff1b; 2、负责办公网络、机房的网络设备&#xff08;接入层&#xff09;的运维、变更、故障解决&#xff1b; 3、负责公司网…

网络通信原理ARP协议(第四十六课)

ARP/RARP报文 ARP(Address Resolution Protocol,地址解析协议)是用来将IP地址解析为MAC地址的协议。RARP(Reverse Address Resolution Protocol,反向地址解析协议)是用来将MAC地址解析为IP地址的协议。 字段长度(bit)含义Ethernet Address of Destination48比特目的…