18.4 矩阵的函数

 
r = expm (A)

返回矩阵的指数。

矩阵指数定义为无穷级数泰勒展开

expm (A) = I + A + A^2/2! + A^3/3! + ...

然而,泰勒级数并非计算矩阵指数的可行方法;请参阅 Moler 和 Van Loan 的 "Nineteen Dubious Ways to Compute the Exponential of a Matrix", SIAM Review, 1978。 该例程使用了 Ward 的对角 Padé 近似方法,并采用三步预处理( SIAM Journal on Numerical Analysis, 1977)。对角 Padé 近似是矩阵的有理多项式

     -1
D (A)   N (A)

其泰勒级数与上述泰勒级数的前 2q+1 项相匹配;当 Dq(A) 是病态时,直接计算泰勒级数(使用相同的预处理步骤)可能比 Padé 近似更可取。

另请参阅: logm, sqrtm.

 
s = logm (A)
s = logm (A, opt_iters)
[s, iters] = logm (…)

计算平方矩阵 A 的矩阵对数。

该实现利用了 Padé 近似和恒等式

logm (A) = 2^k * logm (A^(1 / 2^k))

可选输入 opt_iters 是要计算的最大平方根数,默认为 100。

可选输出 iters 是实际计算的平方根数。

另请参阅: expm, sqrtm.

 
s = sqrtm (A)
[s, error_estimate] = sqrtm (A)

计算平方矩阵 A 的矩阵平方根。

参考: N.J. Higham, A New sqrtm for MATLAB, Numerical Analysis Report No. 336, Manchester Centre for Computational Mathematics, Manchester, England, January 1999.

另请参阅: expm, logm.

 
F = funm (A, fun)
F = funm (A, fun, options)
F = funm (A, fun, options, p1, …)
[F, exitflag] = funm (…)
[F, exitflag, output] = funm (…)

计算一般的矩阵函数。

funm (A, fun) 在方阵 A 上计算函数 fun 的值。输入 fun (xk) 必须返回函数 fun 在向量 x 处求值的 k 阶导数。 函数 fun 必须具有泰勒级数表示,且收敛半径为无穷大。

特殊函数 explogsincossinhcosh 可以通过函数句柄传递;例如 funm (A, @cos).

对于矩阵开方,使用sqrtm代替。对于矩阵指数,根据A的不同, expmfunm (A, @exp)可能更快或更准确。

可选的第三个输入以选项结构体 options 的形式使用, 可以用来指定函数详细输出并影响某些算法。有关后者的更多详细信息,请参阅下面的参考文献。

options 可以有字段如下:

Display

指定在计算过程中有哪些信息会打印到屏幕上。可以是一个字符串值:"off"(无信息,默认值), "on"(一些信息), "verbose"(最多信息); 或者是一个 0(无信息,默认值)到 5(最多信息)之间的标量值。 当 Display"verbose" 或标量值 ≥ 3 时,还会显示特征值和群的图。

TolBlk

用于确定阻塞的容差(正标量,默认值:0.1)。

TolTay

用于确定泰勒级数收敛的容差(正标量,默认值:eps)。

MaxTerms

泰勒级数的最大项数(正整数,默认值:250)。

MaxSqrt

在逆缩放和平方过程中执行的最大的平方根数(正整数,默认值:100)。此选项仅用于计算对数,且其函数类似于 MaxTerms

Ord

定义一个自定义的排序模式,用向量方式定义,其长度等于矩阵A的阶数。

Octave 支持这些字段的任何大小写。

所有在 options 之后的输入都将作为位置参数传递给函数 fun.

标量,描述退出条件:

  • 0 — 算法成功完成。
  • 1 — 一个或多个泰勒展开没有收敛,计算的F值可能不准确。
output

包含以下字段的结构体:

terms

向量,其中output.terms(i)是评估第i个块时使用的泰勒级数项数,或者在对数的情况下,是维数大于2的矩阵的平方根的数量。

ind

元胞数组,其中第(i,j)块在重新排序的舒尔因子T中是 T(output.ind{i}, output.ind{j}).

ord

舒尔型的顺序,传递给 ordschur.

T

重新排序的舒尔型.

如果舒尔型是对角的,则 output = struct ("terms", ones (n, 1), "ind", {1:n}, "ord", [], "T", T).

示例代码:

F = funm (magic (3), @sin);
⇒ F =
   -0.3850    1.0191    0.0162
    0.6179    0.2168   -0.1844
    0.4173   -0.5856    0.8185

下面的代码

S = funm (X, @sin);
C = funm (X, @cos);

将(在可能的舍入误差范围内)和下面的代码产生相同的结果

E = expm (i*X);
C = real (E);
S = imag (E);

引用:

Philip I. Davies and Nicholas J. Higham, "A Schur-Parlett algorithm for computing matrix functions", SIAM Journal on Matrix Analysis and Applications, Vol. 25(2), pp. 464–485, 2003.

Nicholas J. Higham, Functions of Matrices: Theory and Computation, SIAM, pp. 425, 2008, ISBN 978-0-898716-46-7.

另请参阅: expm, logm, sqrtm.

 
C = kron (A, B)
C = kron (A1, A2, …)

形成两个或多个矩阵的克罗内克乘积。

这被按块定义为

c = [ a(i,j)*b ]

例如

kron (1:4, ones (3, 1))
     ⇒   1  2  3  4
         1  2  3  4
         1  2  3  4

如果有两个以上的输入参数 A1, A2, …, An,克罗内克乘积计算为

kron (kron (A1, A2), ..., An)

因为克罗内克积是关联的,所以这是定义明确的。

另请参阅: tensorprod.

 
C = tensorprod (A, B, dimA, dimB)
C = tensorprod (A, B, dim)
C = tensorprod (A, B)
C = tensorprod (A, B, "all")
C = tensorprod (A, B, …, "NumDimensionsA", value)

计算数值张量 AB 之间的张量积。

AB 中要缩并的维度分别由 dimAdimB 定义。dimAdimB 是标量或等长向量,定义要匹配的维度。AB 的匹配维度必须具有相同数量的元素。

仅当使用 dim 时,它相当于 dimA = dimB = dim

当没有指定维度时,dimA = dimB = []。这计算 AB 之间的外积。

使用 "all" 参数会导致 AB 之间的内积。这要求 size (A) == size (B)

使用属性值对,属性名称为 "NumDimensionsA",当 A 具有应转移到 C 的尾随单例维度时使用。指定的 value 应为 A 的总维度数。

MATLAB 兼容性:Octave 当前不支持 "property_name=value" 语法用于 "NumDimensionsA" 参数。

另请参阅: kron, dot, mtimes.

 
C = blkmm (A, B)

计算矩阵块的乘积。

块作为数组的二维子数组给出 ABA 的大小必须具有形式 [m,k,…]B 的大小必须是 [k,n,…]。结果的大小为 [m,n,…],计算如下:

for i = 1:prod (size (A)(3:end))
  C(:,:,i) = A(:,:,i) * B(:,:,i)
endfor
 
X = sylvester (A, B, C)

求解 Sylvester 方程。

Sylvester 方程定义为:

A X + X B = C

该解使用标准 LAPACK 子程序计算。

例如:

sylvester ([1, 2; 3, 4], [5, 6; 7, 8], [9, 10; 11, 12])
   ⇒    [ 0.50000, 0.66667; 0.66667, 0.50000 ]

版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4