添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

从前面的文章我们知道,SymPy中的符号方程不是用 = == 表示的,而是用 Eq 表示的。
【SymPy】(七)方程求解(八)矩阵_sympy_02

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

如果要求解的方程已经等于0,则这一点特别有用。我们在编程时不用键入 Eq solveset(Eq(expr,0),x) ,只需使用 solveset(expr,x) 即可求解方程。
例如:
【SymPy】(七)方程求解(八)矩阵_sympy_03

2 求解代数方程

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

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

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

当求解一个等式时, solveset 的输出有:有限集,域,映射集
【SymPy】(七)方程求解(八)矩阵_sympy_04

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

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

  • (1) 方程式形式:

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

  • 增广矩阵形式:

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

  • 无穷多个解时:

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


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

(2) nonlinsolve 不会返回LambertW形式的解(如果存在LambertW形式解的话)。
solve 则可用于这种情况:
【SymPy】(七)方程求解(八)矩阵_sympy_13

(3) nonlinsolve 不能很好地求解具有三角函数的方程组。
solve 也可用于此类情况(但不能给出所有解决方案)
【SymPy】(七)方程求解(八)矩阵_sympy_14

solveset 只给出每个解。要得到包含多重性的多项式的解,使用 roots
【SymPy】(七)方程求解(八)矩阵_sympy_15

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

solveset 无法求解由LambertW(超越方程求解器)求解的方程。
solve 可以:
【SymPy】(七)方程求解(八)矩阵_sympy_16

3 求解微分方程

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

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

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

f(x)的未估值导数:
【SymPy】(七)方程求解(八)矩阵_sympy_18

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

如求解微分方程 f(x)2f(x)+f(x)=sin(x)
【SymPy】(七)方程求解(八)矩阵_sympy_19

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

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

(八)矩阵
from sympy import *

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

例如,构造矩阵:

为了便于生成列向量,单独一个元素列表被认为是列向量
【SymPy】(七)方程求解(八)矩阵_sympy_23

矩阵的操作与SymPy或Python中的任何其他对象一样。
【SymPy】(七)方程求解(八)矩阵_sympy_24

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

1 基本操作 1.1 获取矩阵形状

要得到矩阵的形状,请使用shape
【SymPy】(七)方程求解(八)矩阵_sympy_25

1.2 访问行和列

若要获取矩阵的单个行或列,请使用rowcol。例如,M.row(0)将获取第一行。M.col(-1)将获取最后一列。
【SymPy】(七)方程求解(八)矩阵_sympy_26

1.3 删除和插入行和列

要删除行或列,请使用row_delr col_del。这些操作将修改矩阵。
【SymPy】(七)方程求解(八)矩阵_sympy_27

要插入行或列,请使用 row_insertcol_insert
【SymPy】(七)方程求解(八)矩阵_sympy_28

2 基本方法

简单的加法和乘法操作仅通过使用+***来完成。要求矩阵的逆,则计算-1次方。
【SymPy】(七)方程求解(八)矩阵_sympy_29
【SymPy】(七)方程求解(八)矩阵_sympy_30
【SymPy】(七)方程求解(八)矩阵_sympy_31

Matrix的转置,用T
【SymPy】(七)方程求解(八)矩阵_sympy_32

3 矩阵构造函数

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

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

相似地,ones创建全1矩阵
【SymPy】(七)方程求解(八)矩阵_sympy_35

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

4 先进的方法 4.1 行列式

要计算矩阵的行列式,请使用det
【SymPy】(七)方程求解(八)矩阵_sympy_37

4.2 简化的阶梯形式

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

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

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

4.3 零空间(Nullspace)

要找到矩阵的零空间,请使用nullspace,得到输出张成矩阵零空间的列向量。
【SymPy】(七)方程求解(八)矩阵_sympy_39
使用ASCII Pretty Printer格式输出:
【SymPy】(七)方程求解(八)矩阵_sympy_40

4.4 列空间(Columnspace)

要找到矩阵的零空间,请使用columnspace,得到输出张成矩阵列空间的列向量。
【SymPy】(七)方程求解(八)矩阵_sympy_41

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

要求矩阵的特征值,请使用eigenvalseigenvals返回一个字典:{特征值:代数重数}
【SymPy】(七)方程求解(八)矩阵_sympy_42

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

要找到矩阵的特征向量,请使用eigenvects。返回(特征值:代数重数,[特征向量])
【SymPy】(七)方程求解(八)矩阵_sympy_43

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

使用diagonalize实现对角化,返回一个元组

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

如果只需要特征多项式,请使用charpoly。这比eigenvals更有效,因为有时符号根的计算成本很高。
【SymPy】(七)方程求解(八)矩阵_sympy_46

未完待续:

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

方法必须先创建后使用,该过程称为方法定义 方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为方法调用 package com.itheima_01;public class MethodDemo { public static void main(String[] ar

3.shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得命令帮助 内部命令help 命令的“--help” 选项 使用man命令阅读手册页 命令行编辑的几个辅助 4.【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY... 5.Programming abstractions in C阅读笔记:p88-p90