sympy的用法

什么是Sympy
Sympy 是一个可以进行符号运算的第三方科学计算库,数学对象可以被精确的表达,而不是近似值,这也意味着带有未计算的未知量可以以符号的形式留在数学表达式中。

一个更有趣的例子
在Sympy 中,用symbols来定义变量,也就是说,在使用某个变量前,必须先定义它。

x,y=sympy.symbols('x y')
expr=x+2*y;expr

x+2y

expr+1

x+2y+1
xexpr # 除了 x-x=0,sqr(8)=2sqrt(2),很多简化不能自动的进行,这是因为我们有可能希望展开,也有可能希望是多因式的形式,在sympy中,有专门的函数来进行转化

x(x+2y)

expanded_expr=sympy.expand(x*expr)
expanded_expr

x2+2xy

sympy.factor(expanded_expr)

x(x+2y)
sympy还可以用来 快速做题 简化表达式,计算导数,积分,极限,解方程,矩阵运算 。

x,y,z,nu=sympy.symbols('x y z nu')
  • 对 sin(x)exp(x)求导
sympy.diff(sympy.sin(x)*sympy.exp(x),x)

exsin(x)+excos(x)

  • 计算exsin(x)+excos(x)的积分
sympy.integrate(sympy.exp(x)*(sympy.sin(x)+sympy.cos(x)),x)

exsin(x)

  • 计算sin(x2)的无穷积分:
from sympy import *
sympy.integrate(sympy.sin(x**2),(x,-oo,oo))
  • sin(x)/x,当x趋近于0时的极限:
sympy.limit(sympy.sin(x)/x,x,0)
  • 解方程:x**2-2=0
sympy.solve(x**2-2,x)

[−2–√,2–√]

  • 解微分方程 y’’-y=e(t)
y=sympy.Function('y')
t=sympy.symbols('t')
sympy.dsolve(sympy.Eq(y(t).diff(t,t)-y(t),sympy.exp(t)),y(t))

在这里插入图片描述

  • 找矩阵[[1,2],[2,2]]的特征值:
sympy.Matrix([[1,2],[2,2]]).eigenvals()

在这里插入图片描述

等号

在Python中,=代表赋值,为了不与python冲突,所以等式不能用=来表示,而==代表逻辑判断等于,其返回布尔值,显然作为表示符号运算中的“等于”,也不合适。在Sympy中,我们用Eq来表示等式:

sympy.Eq(x+1,4)

False

  • 为了比较两个式子是否相等,可以将两个式子做减法,然后用simplify方法:
x=sympy.symbols('x')
a=(x+1)**2;a
b=x**2+1+2*x;b
(a-b).simplify()

0

  • 另外,还有一个equals方法可以用来判断,两个式子是否是相同的:
a.equals(b)
True

其他用途还有多项式/有理式函数简化,三角几何简化,指数和对数,特殊函数,重写rewrite,微积分,级数展开,有限差分,矩阵,理解表达式树等等,感兴趣可以去查一查,这里没有需求就暂时不放上去了。

溜了。

<think>我们正在讨论的是SymPy库中的lambdify函数。用户之前询问了关于解方程的问题,现在转向了lambdify函数的使用。需要注意的是,用户提供了一段关于series展开的引用,但这与lambdify无关,因此我们忽略该引用,专注于用户当前的问题。lambdify函数的作用是将SymPy表达式转换为可数值计算的函数,这样可以利用NumPy等库进行高效数值计算。下面我将详细介绍其用法,并提供示例。###1.lambdify函数的基本用法`lambdify`函数将SymPy符号表达式转换为适用于数值计算库(如NumPy)的函数。其基本语法为:```pythonlambdify(args,expr,modules)```-`args`:变量(符号)列表或元组,也可以是一个符号(单个变量)-`expr`:SymPy表达式-`modules`:指定使用的计算模块,默认为`math`(适用于单个数值),也可以指定为`numpy`(适用于数组)###2.示例1:将符号表达式转换为数值函数```pythonimportsympyasspimportnumpyasnp#定义符号x,y=sp.symbols('xy')#定义表达式expr=x**2+sp.sin(y)#转换为函数,使用math模块(默认)f_math=sp.lambdify((x,y),expr)#使用math模块的函数计算点(2,3)result1=f_math(2,3)print(result1)#输出:4+math.sin(3)#转换为函数,使用numpy模块(支持数组)f_numpy=sp.lambdify((x,y),expr,'numpy')#使用numpy数组x_vals=np.array([1,2,3])y_vals=np.array([4,5,6])result2=f_numpy(x_vals,y_vals)print(result2)#输出:[sin(4)+1,sin(5)+4,sin(6)+9]```###3.示例2:使用多个模块和自定义函数`modules`参数可以接受一个模块列表,也可以使用自定义的字典映射。当表达式中有特殊函数时,我们可以自定义转换规则。```python#定义表达式,使用Bessel函数fromsympyimportbesseljexpr=besselj(0,x)#默认情况下,lambdify可能无法识别besselj(如果使用math模块),因此需要指定使用scipy#方法1:使用字符串指定模块(lambdify会尝试导入)f_scipy=sp.lambdify(x,expr,'scipy')#方法2:直接传递模块字典importmathimportscipy.special#自定义模块映射:将besselj映射到scipy.special.j0f_custom=sp.lambdify(x,expr,{'besselj':scipy.special.j0})#测试x_val=2.0print(f_scipy(x_val))#使用scipy计算,结果为scipy.special.j0(2)print(f_custom(x_val))#同上#如果使用math模块,但math没有besselj,则会出错。所以应该确保使用支持所需函数的模块。```###4.注意事项-**模块选择**:默认使用`math`模块,适合标量计算;若要进行数组计算,使用`numpy`模块。-**函数覆盖**:SymPy中的函数名称可能和指定模块中的函数名称不一致,需要自定义映射。-**性能**:对于数值计算,尤其是数组运算,使用`numpy`模块可以显著提高速度。###5.进阶:多参数与矩阵运算lambdify同样支持矩阵表达式,并生成可处理数组的函数。```python#矩阵表达式fromsympyimportMatrix,sinM=Matrix([[x**2,x*y],[sp.sin(y),0]])f_matrix=sp.lambdify((x,y),M,'numpy')#输入标量时返回2x2矩阵print(f_matrix(1,2))#当输入为数组时,要求输入数组的广播形状一致x_arr=np.array([[1,2],[3,4]])y_arr=np.array([[2,3],[4,5]])result_matrix=f_matrix(x_arr,y_arr)#结果是一个2x2的数组,每个元素是2x2的矩阵?实际上,对于矩阵,lambdify会返回对应形状的数组,每个位置是表达式计算值。#注意:此例中,f_matrix(1,2)返回一个2x2的数组,而传入两个2x2数组时,将返回一个形状为(2,2,2,2)的数组(因为每个元素计算时会广播)。#为了避免这种维度扩展,我们通常使用标量参数或者对数组进行适当重塑。```###6.错误处理如果转换后的函数在调用时遇到未识别的函数,会抛出`NameError`。此时,需要检查自定义映射或指定合适的模块。以上便是`lambdify`函数的基本用法和示例。通过将符号表达式转换为数值函数,我们可以在实际数值计算中高效地利用SymPy的符号运算结果。相关问题:1.如何在lambdify中使用自定义函数?2.当使用NumPy模块时,如何处理表达式中的条件语句(如Piecewise函数)?3.lambdify能否支持TensorFlow或PyTorch等深度学习框架的模块?</think> ### SymPy `lambdify` 函数使用详解 `lambdify` 是 SymPy 中将符号表达式转换为数值计算函数的关键工具,可将符号数学表达式编译为高效的可调用函数(支持 NumPy、SciPy 等库)。以下是使用教程和示例: --- #### 1. 基本语法 ```python lambdify(args, expr, modules=None) ``` - `args`: 符号变量(单个或多个) - `expr`: SymPy 符号表达式 - `modules`: 目标计算库(默认为 `math`,推荐 `numpy`) --- #### 2. 使用示例 **示例 1:基础数值计算** ```python from sympy import symbols, sin, lambdify x = symbols('x') expr = sin(x) + x**2 # 符号表达式: $ \sin(x) + x^2 $ # 转换为可调用函数 f = lambdify(x, expr, "numpy") # 数值计算 import numpy as np result = f(np.array([0, np.pi/2, np.pi])) print(result) # 输出: [0. 3.57079633 9.8696044] ``` **示例 2:多变量函数** ```python x, y = symbols('x y') expr = x**2 + 3*x*y - y**3 # $ x^2 + 3xy - y^3 $ # 转换并计算 g = lambdify((x, y), expr) print(g(2, 1)) # 输出: 2 + 6 - 1 = 7 ``` **示例 3:使用自定义模块映射** ```python expr = sin(x)/x # $ \frac{\sin(x)}{x} $ # 指定使用 scipy.special.sinc 函数 f = lambdify(x, expr, {'sin': lambda y: np.sinc(y/np.pi)}) print(f(np.pi)) # 输出: scipy.sinc(1) ≈ 0 ``` --- #### 3. 关键特性 1. **支持数组运算**: 当使用 `modules="numpy"` 时,自动支持数组输入: ```python x_vals = np.linspace(0, 5, 10) print(f(x_vals)) # 返回包含 10 个结果的数组 ``` 2. **处理特殊函数**: 需显式指定非标准函数映射: ```python from sympy import besselj expr = besselj(0, x) # 贝塞尔函数 $ J_0(x) $ f = lambdify(x, expr, modules=[{'besselj': scipy.special.jv}, "numpy"]) ``` 3. **性能优化**: $\triangleright$ 比 `subs()` 快 $100\sim1000$ 倍[^1] $\triangleright$ 适用于数值积分、优化等场景 --- #### 4. 常见问题 - **精度差异**:符号表达式可能有简化解,数值计算保留浮点精度 - **未识别函数**:需在 `modules` 中手动添加函数映射 - **广播规则**:多变量函数输入需维度兼容 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值