<<返回python首页 python

《Python 应用案例》

使用Sympy符号计算库求导函数

sympy

sympy是一个Python的符号计算库,用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题。 它旨在成为功能齐全的计算机代数系统。 它可以在 LaTeX 中显示结果。

安装

!pip3 install sympy -i  https://pypi.tuna.tsinghua.edu.cn/simple

什么是符号计算?

符号计算以符号方式处理数学对象的计算。这意味着数学对象被精确地表示,而不是近似地表示,并且具有未评估变量的数学表达式被保留为符号形式。

import math
#可以精确表达
print(math.sqrt(9))
#无法精确表达
print(math.sqrt(8))
import sympy
#以符号结果进行象征性表达
sympy.sqrt(3)
from sympy import init_printing
init_printing() #使符号打印结果美观化
#以符号结果进行象征性表达
sympy.sqrt(8)

定义符号

创建一个符号使用symbols(),会返回一个Symbol对象,用于表示符号变量,其有name属性,这是符号名

from sympy import symbols
x=symbols('x')

其中左边的x是一个符号对象,而右边括 号中用引号包着的x是符号对象的name属性, 两个x不要求一样,但是为了易于理解,通常将 符号对象和name属性显示成一样,另外name 属性是引号包起来的。如要同时配置多个符号 对象,symbols()中多个name属性可以以空格或者逗号分隔,然后用引号包住,如下:

from sympy import symbols
#同时定义多个符号
x,y = symbols('x y')
type(x)

通常,最好的做法是将Symbols分配给同名的Python变量。

定义表达式

有了符号之后 我们就可以定义表达式了,表达式可以用于求导和方程求解等用途。

expr = x + 2*y #定义表达式
expr
expr + 1
expr - x
x*expr
#导入sympy中的所有
from sympy import *

alpha,beta,gamma,theta = symbols('alpha,beta,gamma,theta')
log(alpha**beta)+gamma
sin(x)**2+cos(y)**2
mu,sigma = symbols('mu,sigma')
mu,sigma
exp(-(x-mu)**2/(2*sigma)**2)

表达式简化

expr = sin(x)**2+cos(x)**2
expr
from sympy import simplify,solveset
simplify(expr) # 简化表达式

解方程

solveset(x**2-4,x) #求解方程
solveset(sin(x),x)
from sympy import S
solveset((x-1)*(exp(x)+cos(x)+1),x,domain = S.Reals)

等式

eq = Eq(x**2,y)
eq
solveset(eq,x)

分式

#使用python默认方式计算
from __future__ import division
#计算除法
1/2
#反余弦计算
acos(1/2)
#返回的均是数据
#符号化
Rational(1,2)
acos(Rational(1,2))

积分

Integral(x**2,x)
#定积分
integrate(x**2,(x,0,3))

求导

import sympy
from sympy import *
x, y, z = symbols('x y z')
init_printing(use_unicode=True)

#Derivativer返回的是一个unevaluated derivative,
expr= 3*x**2*y*z
Derivative(expr,x,y,z)
Derivative(sin(x))
Derivative(expr, x, y, y, z, 4)
type(Derivative(exp,x,y,2))

计算:diff,返回给定函数关于某个变量的导函数

expr = exp(x*y*z)
diff(expr, x, y,2, z, 3)
#diff返回的是导函数的表达式
#对sin(x)求导
diff(sin(x))
diff(sin(x),x)#结果同上
#对cos(x)求导
diff(cos(x))
diff(cos(x),x)#结果同上
diff(sin(x)*exp(x),x)
diff(exp(x**2), x)

diff一次可以取多个导数 要采用多个导数,请根据需要多次传递变量,或在变量后传递数字。

例如,以下两个都找到的三阶导数

diff(x**4, x, x, x)
diff(x**4, x, 3)

求偏导diff

f = 3*x**2*y*z
diff(f, x,y)

高阶导数

expr = exp(x*y*z)
diff(expr, x, y, y, z, z, z, z)
diff(expr, x, y, 2, z, 4)
diff(expr, x, y, y, z, 4)

对表达式进行计算doit,相当于对表达式使用diff函数

Derivative(sin(x)).doit()#计算导函数,等同于使用diff(sin(x))
diff(sin(x))#等同于使用Derivative(sin(x)).doit()
移动端设备除iPad Pro外,其它移动设备仅能阅读基础的文本文字。
建议使用PC或笔记本电脑,浏览器使用Chrome或FireFox进行浏览,以开启左侧互动实验区来提升学习效率,推荐使用的分辨率为1920x1080或更高。
我们坚信最好的学习是参与其中这一理念,并致力成为中文互联网上体验更好的学练一体的IT技术学习交流平台。
您可加QQ群:575806994,一起学习交流技术,反馈网站使用中遇到问题。
内容、课程、广告等相关合作请扫描右侧二维码添加好友。

狐狸教程 Copyright 2021

进入全屏