Python数学建模-2.8SymPy库

SymPy库是一个强大的符号计算库,它为Python提供了符号数学计算的能力,它提供了大量的数学符号操作的函数和类,可以帮助用户进行各种复杂的数学计算,如代数、微积分、离散数学、量子力学等。与NumPy等库主要关注数值计算不同,SymPy专注于数学表达式的符号运算。这使得SymPy在处理代数、微积分、离散数学以及物理学的许多领域中的问题时非常有用。

1.SymPy库的主要特点

  1. 符号表达式:SymPy允许用户使用符号变量代替具体的数值进行计算。这使得用户可以构建和操作复杂的数学表达式,而无需立即进行数值评估。

  2. 代数运算:SymPy提供了丰富的代数运算功能,包括符号表达式的加法、减法、乘法、除法、幂运算、对数运算等。此外,它还可以进行因式分解、展开、简化等代数操作。

  3. 微积分:SymPy可以处理微积分问题,包括求导、积分以及微分方程的求解。用户可以通过简单的函数调用,对符号表达式进行求导或积分运算。

  4. 离散数学:SymPy还提供了处理离散数学问题的功能,如求解差分方程、处理组合数学和概率论中的表达式等。

  5. 矩阵运算:SymPy提供了矩阵运算的功能,包括矩阵的创建、转置、求逆、行列式计算、特征值和特征向量的求解等。

  6. 与其他库的集成:SymPy可以与Python中的其他数学库(如NumPy、SciPy)进行无缝集成,从而提供更加全面和强大的数学计算能力。

使用SymPy库时,用户通常需要首先定义符号变量,然后构建符号表达式,最后调用相应的函数进行运算。例如,可以使用symbols函数定义符号变量,使用Eq类创建等式,然后使用solve函数求解方程。同样地,可以使用diff函数进行求导运算,使用integrate函数进行积分运算等。

2.基本用法

首先,我们需要导入SymPy库:

from sympy import symbols, Eq, solve, diff, integrate, simplify

定义符号变量

使用symbols函数可以定义符号变量:

x, y = symbols('x y')

构建符号表达式

定义符号变量后,我们可以构建符号表达式:

expr = x**2 + 2*x*y + y**2

方程求解

使用Eq类可以创建等式,然后使用solve函数来求解方程:

equation = Eq(x**2 + y**2, 1)  # 定义方程 x^2 + y^2 = 1  
solutions = solve(equation.subs(y, 1), x)  # 将y替换为1,然后解方程  
print(solutions)  # 输出方程解

 输出结果:

[0]

求导

使用diff函数可以对符号表达式进行求导:

 

derivative = diff(x**2, x)  # 对x^2关于x求导  
print(derivative)  # 输出导数结果

输出结果:

2*x

积分

使用integrate函数可以对符号表达式进行积分:

integral = integrate(x**2, x)  # 对x^2关于x进行积分  
print(integral)  # 输出积分结果

输出结果

 x**3/3

表达式化简

使用simplify函数可以对复杂的符号表达式进行化简:

expr_complex = x**2 + 2*x*y + y**2  
simplified_expr = simplify(expr_complex)  # 化简表达式  
print(simplified_expr)  # 输出化简后的表达式

输出结果:

x**2 + 2*x*y + y**2

矩阵运算

SymPy也支持矩阵运算。可以使用Matrix类来创建矩阵,并进行各种矩阵运算:

from sympy import Matrix  
  
# 创建一个2x2矩阵  
matrix_A = Matrix([[1, 2], [3, 4]])  
  
# 计算矩阵的行列式  
determinant = matrix_A.det()  
print(determinant)  
  
# 计算矩阵的逆  
inverse_matrix = matrix_A.inv()  
print(inverse_matrix)

输出结果:

-2
Matrix([[-2, 1], [3/2, -1/2]])

交换变量值

虽然SymPy本身并没有直接提供交换变量值的函数,但你可以通过简单的赋值操作来实现:

from sympy import symbols, Eq, solve, diff, integrate, simplify

a, b = symbols('a b')
a_value = 10
b_value = 20

# 交换变量值
a, b = b, a

print(a)  # 输出20
print(b)  # 输出10

输出结果:

b
a
这些只是SymPy库功能的一部分,实际上SymPy提供了许多其他功能,如求解微分方程、处理几何对象、进行多项式运算等。


3.实例操作

例1:求方程组的符号解。

\left\{\begin{matrix} _{x1^2+x2^2=1,} & & \\ {x1}= {x2.}& & \end{matrix}\right.

解:

方法1:

import sympy as sp
sp.var('x1,x2')
s=sp.solve([x1**2+x2**2-1,x1-x2],[x1,x2])
print(s)

输出结果:

[(-sqrt(2)/2, -sqrt(2)/2), (sqrt(2)/2, sqrt(2)/2)]

方法2:

import sympy as sp
x = sp.var('x:2')  #定义符号数组
s = sp.solve([x[0]**2+x[1]**2-1,x[0]-x[1]], x)
print(s)

输出结果:

[(-sqrt(2)/2, -sqrt(2)/2), (sqrt(2)/2, sqrt(2)/2)]

例2:求下列矩阵的特征值和特征向量的符号解:

\begin{bmatrix} 0 & 0 & 0& 1\\ 0& 0& 1& 0\\ 0 & 1 &0 &0 \\ 1 &0 &0 &0 \end{bmatrix}

解:

import numpy as np
import sympy as sp
a = np.identity(4)  #单位矩阵的另一种写法
b = np.rot90(a)
c = sp.Matrix(b)
print('特征值为:', c.eigenvals())
print('特征向量为:\n', c.eigenvects())

 输出结果:

特征值为: {-1.00000000000000: 2, 1.00000000000000: 2}
特征向量为:
 [(-1.00000000000000, 1, [Matrix([
[                 0],
[-0.707106781186548],
[ 0.707106781186548],
[                 0]])]), (1.00000000000000, 1, [Matrix([
[                 0],
[-0.707106781186548],
[-0.707106781186548],
[                 0]])]), (-1.00000000000000, 1, [Matrix([
[ 0.707106781186548],
[                 0],
[                 0],
[-0.707106781186548]])]), (1.00000000000000, 1, [Matrix([
[-0.707106781186548],
[                 0],
[                 0],
[-0.707106781186548]])])]

个人认为用SymPy没有Numpy好用,可以回见2.4内容

import numpy as np
a = np.eye(4)
b = np.rot90(a)
c, d = np.linalg.eig(b)
print('特征值为:', c)
print('特征向量为:\n', d)


#或者
import numpy as np

# 定义一个矩阵
A = np.array([[0, 0,0,1], [0,0,1,0],[0,1,0,0],[1,0,0,0]])

# 使用numpy.linalg.eig求特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)

print("特征值:")
print(eigenvalues)

print("特征向量:")
print(eigenvectors)

输出结果:

特征值为: [ 1. -1.  1. -1.]
特征向量为:
 [[ 0.70710678  0.70710678  0.          0.        ]
 [ 0.          0.          0.70710678 -0.70710678]
 [ 0.          0.          0.70710678  0.70710678]
 [ 0.70710678 -0.70710678  0.          0.        ]]

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Py小趴

整理不易,感谢金主!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值