# poly
具有指定根的多项式或特征多项式
函数库: TyMath
# 语法
p = poly(r)
p = poly(A)
# 说明
p = poly(r)(其中 r 是向量)返回多项式的系数,其中多项式的根是 r 的元素。示例
p = poly(A)(其中 A 是 n×n 矩阵)返回矩阵
# 示例
来自特征值的特征多项式
计算矩阵 A 的特征值。
using TyMath
A = [1 8 -10; -4 2 4; -5 2 8]
A = 3×3 Matrix{Int64}:
1 8 -10
-4 2 4
-5 2 8
e = eigvals(A)
e = 3-element Vector{ComplexF64}:
-0.3109528850834832 - 2.6704004497568996im
-0.3109528850834832 + 2.6704004497568996im
11.621905770166965 + 0.0im
由于 e 中的特征值是 A 的特征多项式的根,使用 poly 可确定来自 e 中的值的特征多项式。
p = poly(e)
p = 4-element Vector{ComplexF64}:
1.0 + 0.0im
-10.999999999999998 + 0.0im
-3.552713678800501e-15 + 0.0im
-83.99999999999984 + 0.0im
矩阵的特征多项式
使用 poly 来计算矩阵 A 的特征多项式。
using TyMath
A = [1 2 3; 4 5 6; 7 8 0]
A = 3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 0
p = poly(A)
p = 4-element Vector{Float64}:
1.0
-6.000000000000008
-72.00000000000007
-27.00000000000005
使用 roots 计算 p 的根。特征多项式的根是矩阵 A 的特征值。
r = roots(p)
r = 3-element Vector{Float64}:
12.122893784632398
-5.734509942225072
-0.3883838424073203
# 输入参数
r - 多项式根向量
多项式的根,指定为向量。
示例: poly([2,-3])
示例: poly([2,-2,3,-3])
示例: poly(roots(k))
示例: poly(eigvals(A))
数据类型: Int64 | Int32 | Int16 | Int128 | Float64 | Float32 | Float16
复数支持: 是
A - 输入矩阵矩阵
输入矩阵。
示例: poly([0 -1; 1 0])
数据类型: Int64 | Int32 | Int16 | Int128 | Float64 | Float32 | Float16
复数支持: 是
# 输出参数
p - 多项式系数向量
多项式系数,以向量形式返回。
如果输入为 n×n 方阵 A,则 p 包含 A 的特征多项式的系数。
如果输入是根的向量 r,则 p 包含其根在 r 中的多项式的系数。
在每种情况下,p 中的 n+1 个系数都以如下方式描述多项式
# 提示
对于向量,r = roots(p) 和 p = poly(r) 互为反函数,负责舍入误差、排序和缩放。
# 算法
用于 poly 和 roots 的算法阐明了现代特征值计算方法中一个有趣的方面。poly(A) 生成 A 的特征多项式,roots(poly(A)) 计算该多项式的根,而这些根是 A 的特征值。但 poly 和 roots 都使用基于相似变换的 eigvals。传统方法实际上与之相反,它是将特征值定义为特征多项式根。
如果 A 是 n×n 矩阵,poly(A) 生成系数 p[1] 至 p[n+1],对于以下方程,p[1] = 1
算法是:
z = eigvals(A)
p = zeros(n+1)
p[1] = 1.0
for j in 1:n
p[2:j+1] = p[2:j+1]-z[j]*p[1:j]
end
此递归通过展开乘积来获得:
可以证明 poly(A) 在 A 的舍入误差内生成矩阵特征多项式中的系数。即使 A 的特征值为病态的情况下,这也成立。用于获取特征多项式的传统算法不使用特征值,并且没有此类符合要求的数值属性。