Function Resource

Function Repository Resource:

MatrixConditionNumber

Source Notebook

Calculate the condition number of a matrix

Contributed by: Naman T.

ResourceFunction["MatrixConditionNumber"][matrix,]

calculates the condition number of matrix with respect to the specified norm.

Details and Options

The condition number of a matrix A with respect to the specified p-norm, denoted by κ(A), is given by ||A||p||A-1||p.
By convention, if |A|=0, we write κp(A)=0 for any p-norm.

Examples

Basic Examples (4) 

Calculate the κ of a matrix w.r.t. 2-norm:

In[1]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][{{2, 1}, {4, 3}}]
Out[1]=

For a 3⨯3 matrix:

In[2]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][{{2, -1, 1}, {1, 0, 1}, {3, -1, 4}}]
Out[2]=

Condition number computed with machine precision:

In[3]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][{{2., -1., 1.}, {1., 0., 1.}, {3., -1., 4.}}]
Out[3]=

Symbolic calculation:

In[4]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][{{a, 0}, {0, d}}]
Out[4]=

Condition number of a complex matrix:

In[5]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][{{\[Pi], 1/3}, {I, 5}}]
Out[5]=

Scope (5) 

Calculate the condition number corresponding to other norms:

In[6]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][mat = {{.913 I, .659}, {.457, -.33}}]
Out[6]=
In[7]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][mat, Norm -> 1]
Out[7]=
In[8]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][mat, Norm -> "Frobenius"]
Out[8]=
In[9]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][mat, Norm -> Infinity]
Out[9]=

For any matrix A, κ(λ A)=κ(A)

In[10]:=
Simplify[
 ResourceFunction[
CloudObject[
    "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][\[Lambda] {{3, 4}, {-2, 5}}] == ResourceFunction[
CloudObject[
    "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][{{3, 4}, {-2, 5}}],
 Assumptions -> \[Lambda] \[Element] Reals
 ]
Out[10]=

or for any complex constant as well:

In[11]:=
ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][(2 + 3 I) {{3, 4}, {-2, 5}}] == ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][{{3, 4}, {-2, 5}}]
Out[11]=

For a diagonal matrix D=diag(di), :

In[12]:=
ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][
  DiagonalMatrix[diag = {4 + I, 2, -I, -3}]] == Max[Abs /@ diag]/
 Min[Abs /@ diag]
Out[12]=

Efficient of large computations depend on the efficiency of very efficient Norm:

In[13]:=
m = RandomReal[{1, 9}, {100, 100}];
In[14]:=
ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][m] // Timing
Out[14]=

Condition number of sparse matrices:

In[15]:=
SparseArray[{{1, 1} -> 2, {1, 3} -> 1, {2, 2} -> 3, {3, 3} -> 4, {4, 4} -> 5}, {4, 4}]
Out[15]=
In[16]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]]@%
Out[16]=

Condition number of structured matrices:

In[17]:=
SymmetrizedArray[{{1, 1} -> 2, {1, 2} -> 1}, {2, 2}, Symmetric[All]]
Out[17]=
In[18]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]]@%
Out[18]=

IdentityMatrix[n] always has condition number 1:

In[19]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]] /@ Table[IdentityMatrix[n], {n, 1, 10}]
Out[19]=

Condition number of HilbertMatrix grows exponentially:

In[20]:=
N@*ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]] /@ Table[HilbertMatrix[n], {n, 1, 10}]
Out[20]=

Properties and Relations (1) 

MatrixConditionNumber requires the first argument to be a square matrix:

In[21]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/MatrixConditionNumber"]][{{1, 2}}]
Out[21]=