Skip to content

MatrixFunction ​

A scalar function f extended to a square matrix m, via its eigendecomposition. Provided by @enumeratio/analytic.

✓ checked against that system · ! checked, with disagreements (hover a chip)Wolfram LanguageMatrixFunction✓
MatrixFunction(f, m)f applied to the square matrix m, via its eigendecomposition.
SymPyMatrix(m).analytic_func(f, Symbol("_mf")).applyfunc(simplify).tolist()
Typed signatures
TypePackageApplies
(function, matrix) -> matrixanalyticalways

Domain: Linear algebra

Details
  • Exact where the structure gives one: a diagonal m (any size, including symbolic entries) reduces to elementwise f down the diagonal; f = Exp reduces to MatrixExp for any m; a 2×2 m otherwise reduces to Lagrange's formula at its two eigenvalues, with the Jordan-block limit f(λ)·I + f′(λ)·(M − λI) (f′ via compute-engine's own D) when they coincide.
  • No general n×n closed form past that: a non-diagonal matrix larger than 2×2 needs a numerical-linear-algebra kernel (Parlett recurrence or a Schur form), which this does not implement -- those calls stay symbolic.

Examples

Basic #

The principal square root of a diagonal matrix

live ↗
InMatrixFunction(Sqrt,[[4,0],[0,9]])\mathrm{MatrixFunction}(\mathrm{Sqrt}, \bigl\lbrack\bigl\lbrack4, 0\bigr\rbrack, \bigl\lbrack0, 9\bigr\rbrack\bigr\rbrack)Out[[2,0],[0,3]]\bigl\lbrack\bigl\lbrack2, 0\bigr\rbrack, \bigl\lbrack0, 3\bigr\rbrack\bigr\rbrack

On a diagonal matrix, f acts on the diagonal

live ↗
InMatrixFunction(f,[[a,0],[0,b]])\mathrm{MatrixFunction}(f, \bigl\lbrack\bigl\lbrack a, 0\bigr\rbrack, \bigl\lbrack0, b\bigr\rbrack\bigr\rbrack)Out[[f(a),0],[0,f(b)]]\bigl\lbrack\bigl\lbrack f(a), 0\bigr\rbrack, \bigl\lbrack0, f(b)\bigr\rbrack\bigr\rbrack
Scope #
live ↗
InMatrixFunction(cos⁡,[[0,0],[0,0]])\mathrm{MatrixFunction}(\cos, \bigl\lbrack\bigl\lbrack0, 0\bigr\rbrack, \bigl\lbrack0, 0\bigr\rbrack\bigr\rbrack)Out[[1,0],[0,1]]\bigl\lbrack\bigl\lbrack1, 0\bigr\rbrack, \bigl\lbrack0, 1\bigr\rbrack\bigr\rbrack

A diagonal matrix applies the function to each diagonal entry

live ↗
InMatrixFunction(sin⁡,[[a,0],[0,b]])\mathrm{MatrixFunction}(\sin, \bigl\lbrack\bigl\lbrack a, 0\bigr\rbrack, \bigl\lbrack0, b\bigr\rbrack\bigr\rbrack)Out[[sin⁡(a),0],[0,sin⁡(b)]]\bigl\lbrack\bigl\lbrack\sin(a), 0\bigr\rbrack, \bigl\lbrack0, \sin(b)\bigr\rbrack\bigr\rbrack

Works for a symbolic diagonal matrix

live ↗
InMatrixFunction(ln⁡,DiagonalMatrix([a,b,c]))\mathrm{MatrixFunction}(\ln, \mathrm{DiagonalMatrix}(\bigl\lbrack a, b, c\bigr\rbrack))Out[[ln⁡(a),0,0],[0,ln⁡(b),0],[0,0,ln⁡(c)]]\bigl\lbrack\bigl\lbrack\ln(a), 0, 0\bigr\rbrack, \bigl\lbrack0, \ln(b), 0\bigr\rbrack, \bigl\lbrack0, 0, \ln(c)\bigr\rbrack\bigr\rbrack

A nondiagonal matrix is handled exactly, with square roots of the eigenvalues

live ↗
InSimplify(MatrixFunction(Sqrt,[[(5π)/18,(2π)/9],[(4π)/9,π/18]]))\mathrm{Simplify}(\mathrm{MatrixFunction}(\mathrm{Sqrt}, \bigl\lbrack\bigl\lbrack(5π)/18, (2π)/9\bigr\rbrack, \bigl\lbrack(4π)/9, π/18\bigr\rbrack\bigr\rbrack))Out[[1186−π+2π3,2π6−1186−π],[2π3−196−π,2π6+196−π]]\bigl\lbrack\bigl\lbrack\frac{1}{18}\sqrt{6}\sqrt{-π}+\frac{\sqrt{2}\sqrt{π}}{3}, \frac{\sqrt{2}\sqrt{π}}{6}-\frac{1}{18}\sqrt{6}\sqrt{-π}\bigr\rbrack, \bigl\lbrack\frac{\sqrt{2}\sqrt{π}}{3}-\frac{1}{9}\sqrt{6}\sqrt{-π}, \frac{\sqrt{2}\sqrt{π}}{6}+\frac{1}{9}\sqrt{6}\sqrt{-π}\bigr\rbrack\bigr\rbrack
live ↗
InSimplify(MatrixFunction(f,[[1,2],[0,1]]))\mathrm{Simplify}(\mathrm{MatrixFunction}(f, \bigl\lbrack\bigl\lbrack1, 2\bigr\rbrack, \bigl\lbrack0, 1\bigr\rbrack\bigr\rbrack))Out[[f(1),2f′(1)],[0,f(1)]]\bigl\lbrack\bigl\lbrack f(1), 2f^{\prime}(1)\bigr\rbrack, \bigl\lbrack0, f(1)\bigr\rbrack\bigr\rbrack
live ↗
InSimplify(MatrixFunction(f,[[0,a],[b,0]]))\mathrm{Simplify}(\mathrm{MatrixFunction}(f, \bigl\lbrack\bigl\lbrack0, a\bigr\rbrack, \bigl\lbrack b, 0\bigr\rbrack\bigr\rbrack))Out[[12f(−(ab)1/2)+f((ab)1/2)2,f((ab)1/2)a1/2−f(−(ab)1/2)a1/22b],[f((ab)1/2)b1/2−f(−(ab)1/2)b1/22a,12f(−(ab)1/2)+f((ab)1/2)2]]\bigl\lbrack\bigl\lbrack\frac{1}{2}f(-(ab)^{1/2})+\frac{f((ab)^{1/2})}{2}, \frac{f((ab)^{1/2})a^{1/2}-f(-(ab)^{1/2})a^{1/2}}{2\sqrt{b}}\bigr\rbrack, \bigl\lbrack\frac{f((ab)^{1/2})b^{1/2}-f(-(ab)^{1/2})b^{1/2}}{2\sqrt{a}}, \frac{1}{2}f(-(ab)^{1/2})+\frac{f((ab)^{1/2})}{2}\bigr\rbrack\bigr\rbrack
Properties #

With Exp it is MatrixExp

live ↗
InMatrixFunction(Exp,[[0,0],[0,0]])\mathrm{MatrixFunction}(\mathrm{Exp}, \bigl\lbrack\bigl\lbrack0, 0\bigr\rbrack, \bigl\lbrack0, 0\bigr\rbrack\bigr\rbrack)Out[[1,0],[0,1]]\bigl\lbrack\bigl\lbrack1, 0\bigr\rbrack, \bigl\lbrack0, 1\bigr\rbrack\bigr\rbrack

A polynomial f agrees with the matrix power

live ↗
InMatrixFunction(_1⁡↦_1⁡2,[[1,1],[0,1]])\mathrm{MatrixFunction}(\operatorname{\_1}↦\operatorname{\_1}^2, \bigl\lbrack\bigl\lbrack1, 1\bigr\rbrack, \bigl\lbrack0, 1\bigr\rbrack\bigr\rbrack)Out[[1,2],[0,1]]\bigl\lbrack\bigl\lbrack1, 2\bigr\rbrack, \bigl\lbrack0, 1\bigr\rbrack\bigr\rbrack

A constant function gives the identity: f(A)=If(A)=I

live ↗
InSimplify(MatrixFunction(()↦1,[[1,2],[3,4]]))\mathrm{Simplify}(\mathrm{MatrixFunction}(()↦1, \bigl\lbrack\bigl\lbrack1, 2\bigr\rbrack, \bigl\lbrack3, 4\bigr\rbrack\bigr\rbrack))Out[[1,0],[0,1]]\bigl\lbrack\bigl\lbrack1, 0\bigr\rbrack, \bigl\lbrack0, 1\bigr\rbrack\bigr\rbrack
live ↗
InMatrixFunction(_1⁡↦1_1⁡,[[1,1],[1,2]])=[[1,1],[1,2]]−1\mathrm{MatrixFunction}(\operatorname{\_1}↦\frac{1}{\operatorname{\_1}}, \bigl\lbrack\bigl\lbrack1, 1\bigr\rbrack, \bigl\lbrack1, 2\bigr\rbrack\bigr\rbrack)=\bigl\lbrack\bigl\lbrack1, 1\bigr\rbrack, \bigl\lbrack1, 2\bigr\rbrack\bigr\rbrack^{-1}OutTrue\mathrm{True}
About
Examples12
Checked againstWolfram Language 11 agree1 unevaluatedSymPy 6 agree3 differ1 error
CrosswalkWolfram LanguageSymPy

Implementation

mappedsympypackages/oracle/src/mappings.ts

SymPy's Matrix.analytic_func(f(x), x) takes f as an expression of one variable, which the emitter builds from a head's name or a Function's body (an undefined name becomes an unknown function). It evaluates through the Jordan form, so it is the same function of the matrix; each entry is then simplified (the Lagrange form it builds for distinct eigenvalues is otherwise unreadable), so Simplify of a MatrixFunction is the call itself. A repeated eigenvalue's derivative comes back as a Subs(Derivative(f(x), x), x, a). A constant f has no variable for it to use and is an error there.

See also: MatrixExp, MatrixPower