当前位置: 首页 > news >正文

python sympy库

sympy库是python的符号运算库,是电脑辅助简单数学函数计算的好工具。本文简单记录了一下有关sympy的方法。建议使用jupyter notebook,这样输出的函数很好看。


文章目录

  • sympy基础
    • 安装
    • 自变量(Symbols)
    • 函数表达式(Expr)
    • 变量替换与赋值
    • 精确求值
    • 微分
    • 积分
    • Taylor展开
      • 一元展开
      • 多元展开
      • 查看展开项
    • 极限
    • 解方程
    • 画图

sympy基础

安装

pip install sympy

自变量(Symbols)

通过symbols方法将字符串声明为数学函数的变量,这些变量往往是函数的自变量。

import sympy
# 声明单个变量
x = sympy.symbols('x')# 声明多个变量(以下方法皆可)
x,y = sympy.symbols(['x','y'])
x,y = sympy.symbols("x,y")
x,y = sympy.symbols("x y")

函数表达式(Expr)

函数表达式通过变量的运算构造具体函数,或者通过Function函数构造抽象函数。

f = sympy.sqrt(3*x*y) +x*sympy.sin(y) +y**2 +x**3  # 具体函数
u = sympy.Function('u')  # 抽象函数

变量替换与赋值

expr.subs()可以实现变量替换,替换成数字实现赋值。

g1 = f.subs(x,y) # 将f表达式中的x换成y,并将替换的结果,赋给g
g2 = f.subs({x:2*x, y:2*y}) #多次替换,字典
g3 = f.subs({x:1,y:2})

精确求值

expr.evalf(n)可以求一个表达式的保留n位有效数字的精确值

g3 = f.subs({x:1,y:2})
print(g.evalf(4))  # 8.359

微分

sympy可以实现自动求微分,方法如下

h1 = sympy.diff(f,x)   # f对x求微分
h1 = f.diff(x)   # 同上
h2 = sympy.diff(f,x,2,y,1)  # f对x求2次微分,对y求1次微分

积分

sympy可以实现自动求不定积分和定积分,区别在于是否传入积分上下限

l1 = sympy.integrate(f,x)    # 不定积分
l2 = sympy.integrate(f,(x,1,3))  #定积分

Taylor展开

一元展开

sympy可以实现泰勒展开,具体函数抽象函数都可以。但是不能对多元函数同时泰勒展开。

taylor1 = sympy.series(f,x,0,4)  # f对x在0处泰勒展开到4阶
taylor2 = sympy.series(f,x,0,4).removeO  # f对x在0处泰勒展开到4阶,去除皮亚诺余项
taylor3 = sympy.series(u(x),x,0,4)  # 抽象函数u对x在0处泰勒展开到4阶

多元展开

多元泰勒展开可以使用以下方法
参考链接:https://www.thinbug.com/q/23803320

def Taylor_polynomial_sympy(function_expression, variable_list, evaluation_point, degree):"""Mathematical formulation reference:https://math.libretexts.org/Bookshelves/Calculus/Supplemental_Modules_(Calculus)/Multivariable_Calculus/3%3A_Topics_in_Partial_Derivatives/Taylor__Polynomials_of_Functions_of_Two_Variables:param function_expression: Sympy expression of the function:param variable_list: list. All variables to be approximated (to be "Taylorized"):param evaluation_point: list. Coordinates, where the function will be expressed:param degree: int. Total degree of the Taylor polynomial:return: Returns a Sympy expression of the Taylor series up to a given degree, of a given multivariate expression, approximated as a multivariate polynomial evaluated at the evaluation_point"""from sympy import factorial, Matrix, prodimport itertoolsn_var = len(variable_list)point_coordinates = [(i, j) for i, j in (zip(variable_list, evaluation_point))]  # list of tuples with variables and their evaluation_point coordinates, to later perform substitutionderiv_orders = list(itertools.product(range(degree + 1), repeat=n_var))  # list with exponentials of the partial derivativesderiv_orders = [deriv_orders[i] for i in range(len(deriv_orders)) if sum(deriv_orders[i]) <= degree]  # Discarding some higher-order termsn_terms = len(deriv_orders)deriv_orders_as_input = [list(sum(list(zip(variable_list, deriv_orders[i])), ())) for i in range(n_terms)]  # Individual degree of each partial derivative, of each termpolynomial = 0for i in range(n_terms):partial_derivatives_at_point = function_expression.diff(*deriv_orders_as_input[i]).subs(point_coordinates)  # e.g. df/(dx*dy**2)denominator = prod([factorial(j) for j in deriv_orders[i]])  # e.g. (1! * 2!)distances_powered = prod([(Matrix(variable_list) - Matrix(evaluation_point))[j] ** deriv_orders[i][j] for j in range(n_var)])  # e.g. (x-x0)*(y-y0)**2polynomial += partial_derivatives_at_point / denominator * distances_poweredreturn polynomialTaylor_polynomial_sympy(u(x,y),[x,y],[0,0],2)  #函数u对(x,y)在(0,0)处泰勒展开

查看展开项

taylor1.coeff(x)  # 查看taylor1中x项(x-x0项)的系数。 

极限

sympy可以实现求极限,注意极限方向

lim1 = sympy.limit(f, x, sympy.oo)  # 趋于无穷
lim2 = sympy.limit(f, x, 0)  # 趋于0,默认值 dir='+',也就是趋于+0
lim3 = sympy.limit(f, x, 0, dir="-")  # 趋于0,默认值调整为dir='-',也就是趋于-0

解方程

sympy可以实现解方程,方法是令Expr=0,所以在解方程时,要先构造一个等于0的左端项。返回结果是一个列表,每一项是一个解。如果是方程组,解列表每一项是一个元组,元组对应位置是对应自变量的值。

func = f-3
sympy.solve(func,x)  # 返回f=3时x的值
sympy.solve([x**2+y**2-1, x+y-1],[x,y])  #x^2+y^2=1;x+y=1

画图

sympy可以实现绘制函数图像,要先安装matplotlib库。

pip install matplotlib

sympy可以绘制一元函数、二元函数、隐函数的图像,方法如下

from sympy.plotting import plot,plot3d,plot_implicit 
from sympy import Eq  # 构造隐函数时使用# 绘制一元函数图像
plot(x**2,x)  # 绘制以x为自变量的函数图像
plot(x**2,(x,-3,4))  # 绘制以x为自变量的函数图像,绘制区间限制在[-3,4]上
plot(x,x**2,x**3,(x,0,4))  # 绘制多个图像 # 绘制二元函数图像,呈现3D图
plot3d(x**2*y,(x,-10,10),(y,-10,10))# 绘制隐函数图像
plot_implicit(Eq(x**2+y**4,1),(x,-2,2),(y,-2,2))
http://www.lryc.cn/news/34578.html

相关文章:

  • 达梦数据库统计信息的导出导入
  • 信息系统基本知识(六)
  • <C++>智能指针
  • 1.分析vmlinux可执行文件是如何生成的? 2.整理内核编译流程:uImage/zImage/Image/vmlinx之间关系
  • 数据结构4——线性表3:线性表的链式结构
  • weblogic 忘记密码重置密码
  • 安卓开发之动态设置网络访问地址
  • 深度学习模型训练工作汇报(3.8)
  • 【ns-3】添加nr(5G-LENA)模块
  • (枚举)(模拟)(前缀和)(数组模拟哈希)(可二分)1236. 递增三元组
  • mysql五种索引类型(实操版本)
  • 微服务进阶之 SpringCloud Alibaba
  • 前端性能优化笔记2 第二章 度量
  • 关于new和delete的一些思考,为什么不能在析构函数中调用delete释放对象的内存空间,new和delete的原理
  • 一场以数字技术深度影响和改造传统实业的新风口,正在开启
  • 【LeetCode】13. 罗马数字转整数
  • 2023/3/8集合之TreeSet HashSet简介 不含代码
  • 【面试1v1实景模拟】面试中常见的Java关键字详解
  • MySQL8.0.16存储过程比5.7.22性能大幅下降
  • 基于MATLAB的无线信道的传播与衰落(附完整代码与分析)
  • SDX62如何查看Kernel版本和Operating System Version Patch Level
  • 001+limou+HTML——(1)HTML入门知识
  • 使用Arduino Uno构建一个巡线机器人
  • 【C++】类和对象(收尾)
  • Linux延迟操作
  • np.insert()函数用法
  • 学习笔记-架构的演进之容器的封装-3月day06
  • Gorm根据关系模型中的属性查询原模型数据
  • 车载技术【USB接口】—Android配件协议AOA【AOA连接】
  • SpringBoot的基本概念和使用