【SymPy】(七)方程求解(八)矩阵

本文介绍了SymPy库在方程求解和矩阵操作方面的使用。讲解了如何使用solveset和solve函数解代数方程,包括线性和非线性方程组,并展示了微分方程的求解方法。此外,还详细阐述了矩阵的基本操作,如形状获取、行列式计算、特征值和特征向量的求解等。
摘要由CSDN通过智能技术生成

【SymPy】(一)SymPy简介

【SymPy】(二)使用SymPy需要避开的坑

【SymPy】(三)基本操作(四)打印

【SymPy】(五)简化

【SymPy】(六)微积分

(七)方程求解

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

1 等式

从前面的文章我们知道,SymPy中的符号方程不是用===表示的,而是用Eq表示的。
在这里插入图片描述

然而,还有一个更简单的方法:我们知道a=b相当于a−b=0。在SymPy中,任何不在Eq中的表达式都被SynPy的求解函数(如solveset())假定等于0。这意味着我们可以不使用x==y,而使用x-y(被求解函数认为是x-y==0)。

如果要求解的方程已经等于0,则这一点特别有用。我们在编程时不用键入Eqsolveset(Eq(expr,0),x),只需使用solveset(expr,x)即可求解方程。
例如:
在这里插入图片描述

2 求解代数方程

求解代数方程的主要函数是solveset。其语法为:solveset(equation, variable=None, domain=S.Complexes)

式中,等式可以是Eq实例或表达式的形式(假定为零)。

还有一个函数叫做solve,也可以用来解方程。它的语法为solve(equations, variables),后面会介绍它的用途。

当求解一个等式时,solveset的输出有:有限集,域,映射集
在这里插入图片描述

如果无解,则返回一个空集,如果无法找到解决方案,则返回一个条件集合。

在这里插入图片描述

solveset模块中,使用linsolve求解线性方程组。下面是linsolve的语法示例:

  • (1) 方程式形式:

在这里插入图片描述

  • 增广矩阵形式:

在这里插入图片描述

  • A x = b Ax=b Ax=b形式
    在这里插入图片描述

注:解的顺序对应于给定符号的顺序。

solveset模块中,使用nonlinsolve求解非线性方程组。

下面是nonlinsolve的示例。

  • 当只有实数解存在时:

在这里插入图片描述

  • 当只有复数解存在时:

在这里插入图片描述

  • 实数解和复数解同时存在时

在这里插入图片描述

  • 无穷多个解时:

在这里插入图片描述


注:
(1)解的顺序对应于给定符号的顺序。

(2)nonlinsolve不会返回LambertW形式的解(如果存在LambertW形式解的话)。
solve则可用于这种情况:
在这里插入图片描述

(3)nonlinsolve不能很好地求解具有三角函数的方程组。
solve也可用于此类情况(但不能给出所有解决方案)
在这里插入图片描述

solveset只给出每个解。要得到包含多重性的多项式的解,使用roots
在这里插入图片描述

roots的输出{0: 1, 3: 2}意思是:0是重数为1的根,3是重数为2的根。

solveset 无法求解由LambertW(超越方程求解器)求解的方程。
solve可以:
在这里插入图片描述


3 求解微分方程

要求解微分方程,可使用dsolve。首先,通过将cls=function传递给symbols函数来创建未定义的函数。

f, g = symbols('f g', cls=Function)

fg现在是未定义的函数。我们可以调用f(x),它表示一个未知函数。

在这里插入图片描述

f(x)的未估值导数:
在这里插入图片描述

要求解常微分方程,请将其和要求解的函数传递给dsolve

如求解微分方程 f ′ ′ ( x ) − 2 f ′ ( x ) + f ( x ) = sin ⁡ ( x ) f^{\prime \prime}(x)-2 f^{\prime}(x)+f(x)=\sin (x) f(x)2f(x)+f(x)=sin(x)
在这里插入图片描述

在这里插入图片描述

dsolve返回Eq的一个实例。这是因为一般情况下,微分方程的解不能为函数显式求解。

在这里插入图片描述

dsolve解中的任意常数是C1C2C3等形式的符号。

(八)矩阵

from sympy import *

要在SymPy中生成矩阵,使用Matrix对象。通过提供构成矩阵的行向量的列表来构造矩阵。

例如,构造矩阵:
[ 1 − 1 3 4 0 2 ] \left[\begin{array}{cc}1 & -1 \\3 & 4 \\0 & 2\end{array}\right] 130142

在这里插入图片描述

为了便于生成列向量,单独一个元素列表被认为是列向量
在这里插入图片描述

矩阵的操作与SymPy或Python中的任何其他对象一样。
在这里插入图片描述

关于SymPy矩阵需要注意的一点是,与SymPy中的其他对象不同,它们是可变的。这意味着可以对它们进行适当的修改。如果需要Matrix的不可变,请使用ImmutableMatrix

1 基本操作

1.1 获取矩阵形状

要得到矩阵的形状,请使用shape
在这里插入图片描述

1.2 访问行和列

若要获取矩阵的单个行或列,请使用rowcol。例如,M.row(0)将获取第一行。M.col(-1)将获取最后一列。
在这里插入图片描述

1.3 删除和插入行和列

要删除行或列,请使用row_delr col_del。这些操作将修改矩阵。
在这里插入图片描述

要插入行或列,请使用 row_insertcol_insert
在这里插入图片描述

2 基本方法

简单的加法和乘法操作仅通过使用+***来完成。要求矩阵的逆,则计算-1次方。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Matrix的转置,用T
在这里插入图片描述

3 矩阵构造函数

要创建单位矩阵,请使用eyeeye(n)将创建一个n×n单位矩阵。

在这里插入图片描述

zeros(n, m)创造一个 n × m 的零矩阵

在这里插入图片描述

相似地,ones创建全1矩阵
在这里插入图片描述

要创建对角矩阵,请使用diagdiag的参数可以是数字或矩阵。其中数字被解释为1×1矩阵。输入的矩阵按对角线排列。其余元素用0填充。

在这里插入图片描述

4 先进的方法

4.1 行列式

要计算矩阵的行列式,请使用det
在这里插入图片描述

4.2 简化的阶梯形式

若要将矩阵转换为简化的阶梯形式,请使用rref

rref返回两个元素的元组。第一个元素是简化的行梯队形式,第二个元素是主元的列索引。

在这里插入图片描述

注:rref返回的元组的第一个元素是Matrix类型。第二种是tuple类型。

4.3 零空间(Nullspace)

要找到矩阵的零空间,请使用nullspace,得到输出张成矩阵零空间的列向量。
在这里插入图片描述
使用ASCII Pretty Printer格式输出:
在这里插入图片描述

4.4 列空间(Columnspace)

要找到矩阵的零空间,请使用columnspace,得到输出张成矩阵列空间的列向量。
在这里插入图片描述

4.5 特征值、特征向量和对角化(Eigenvalues, Eigenvectors, and Diagonalization)

要求矩阵的特征值,请使用eigenvalseigenvals返回一个字典:{特征值:代数重数}
在这里插入图片描述

表示M特征值有-2、3和5,特征值-2和3的代数重数为1,特征值5的代数重数2。

要找到矩阵的特征向量,请使用eigenvects。返回(特征值:代数重数,[特征向量])
在这里插入图片描述

从结果我们也可以知道特征值5的几何重数为2,因为它有两个特征向量。因为所有特征值的代数重数和几何重数是相同的,所以M是可对角化的。

使用diagonalize实现对角化,返回一个元组 ( P , D ) (P,D) (P,D)D为对角矩阵且 M = P D P − 1 M=P D P^{-1} M=PDP1
在这里插入图片描述

在这里插入图片描述

Tip:要创建一个名为λ的符号,可以对SymPy符号和Python变量使用相同的名称——lamda(不带b)。它可以被打印为λ

如果只需要特征多项式,请使用charpoly。这比eigenvals更有效,因为有时符号根的计算成本很高。
在这里插入图片描述

未完待续:

【SymPy】(九)高级表达式操作

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二进制人工智能

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值