Main Content

funm

计算常规矩阵函数

语法

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

说明

F = funm(A,fun) 计算在方阵参数为 A 时用户定义的函数 funF = fun(x,k) 必须接受向量 x 和整数 k,返回大小相同的 x 的向量 f,其中 f(i) 是在 x(i) 条件下计算的函数 fun 的第 k 个导数。fun 表示的函数必须包含具有无限收敛半径的泰勒级数,被视为特殊情况的 fun = @log 除外。

您也可以使用 funm 计算下表中列出的特殊函数在 A 处的值。

函数

计算矩阵 A 处的函数的语法

exp

funm(A, @exp)

log

funm(A, @log)

sin

funm(A, @sin)

cos

funm(A, @cos)

sinh

funm(A, @sinh)

cosh

funm(A, @cosh)

对于方阵根,请改用 sqrtm(A)。对于矩阵指数,expm(A)funm(A, @exp) 哪一个更准确取决于矩阵 A

fun 表示的函数必须包含具有无限收敛半径的泰勒级数。例外是被视为特殊情况的 @log参数化函数 解释如何在必要情况下向函数 fun 提供其他参数。

F = funm(A,fun,options) 将算法的参数设置为结构体 options 中的值。

下表列出了 options 的字段。

字段

描述

options.Display

显示级别

'off'(默认值)、'on''verbose'

options.TolBlk

阻止 Schur 表的容差

正标量。默认值为 0.1

options.TolTay

计算对角线块的泰勒级数的终止容差

正标量。默认值为 eps

options.MaxTerms

泰勒级数项的最大数目

正整数。默认值为 250

options.MaxSqrt

计算对数时,逆缩放和二乘法中计算的最大平方根数。

正整数。默认值为 100

options.Ord

指定 Schur 表 T 的排序方式。

长度为 length(A) 的向量。options.Ord(i)T(i,i) 所放置到的块的索引。默认值为 []

F = funm(A,fun,options,p1,p2,...) 向函数传递额外的输入 p1,p2,...

[F,exitflag] = funm(...) 返回用于描述 funm 的退出条件的 exitflagexitflag 可以具有下列值:

  • 0 - 算法成功。

  • 1 - 一次或多次泰勒级数计算未收敛,在使用对数的情况下,需要的平方根太多。但是,F 的计算值可能仍然正确。

[F,exitflag,output] = funm(...) 返回包含以下字段的结构体 output

字段

描述

output.terms

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

output.ind

重新排序的 Schur 因子 T(i,j) 块为 T(output.ind{i}, output.ind{j}) 的元胞数组。

output.ord

传递到 ordschur 时对 Schur 表排序

output.T

重新排序的 Schur 表

如果 Schur 表为对角线,则 output = struct('terms',ones(n,1),'ind',{1:n})

示例

示例 1

以下命令计算 3×3 幻方矩阵的矩阵正弦值。

F=funm(magic(3), @sin)

F =

   -0.3850    1.0191    0.0162
    0.6179    0.2168   -0.1844
    0.4173   -0.5856    0.8185

示例 2

以下语句

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

在舍入误差内生成与下面相同的结果

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

在任一情况下,结果都满足 S*S+C*C = I,其中 I = eye(size(X))

示例 3

要使用一个对 funm 的调用计算函数 exp(x) + cos(x)A 处的值,请使用

F = funm(A,@fun_expcos)

其中 fun_expcos 是以下函数。

function f = fun_expcos(x, k)
% Return kth derivative of exp + cos at X.
        g = mod(ceil(k/2),2);
        if mod(k,2)
           f = exp(x) + sin(x)*(-1)^g;
        else
           f = exp(x) + cos(x)*(-1)^g;
        end	

算法

funm 使用的算法如 [1] 中所述。

参考

[1] Davies, P. I. and N. J. Higham, “A Schur-Parlett algorithm for computing matrix functions,” SIAM J. Matrix Anal. Appl., Vol. 25, Number 2, pp. 464-485, 2003.

[2] Golub, G. H. and C. F. Van Loan, Matrix Computation, Third Edition, Johns Hopkins University Press, 1996, p. 384.

[3] Moler, C. B. and C. F. Van Loan, “Nineteen Dubious Ways to Compute the Exponential of a Matrix, Twenty-Five Years Later” SIAM Review 20, Vol. 45, Number 1, pp. 1-47, 2003.

扩展功能

版本历史记录

在 R2006a 之前推出

另请参阅

| |