Como he mencionado en esta respuesta a un MO pregunta, Nick Higham ha hecho que la nota de un numérica método que él atribuye a Boyd para estimar el $p$-norma de una matriz, la cual es esencialmente un aproximado de maximización esquema similar en sabor a la habitual método de la potencia para calcular el autovalor dominante; Higham el libro tiene un par de detalles, su artículo un poco más, y luego ver esta implementación en MATLAB del algoritmo.
Código? Por qué seguro! He aquí un Mathematica traducción de la rutina de MATLAB pnorm()
:
dualVector[vec_?VectorQ, p_] :=
Module[{q = If[p == 1, Infinity, 1/(1 - 1/p)], n = Length[vec]},
If[Norm[vec, Infinity] == 0, Return[vec]];
Switch[p,
1, 2 UnitStep[vec] - 1,
Infinity, (Sign[Extract[vec, #]] UnitVector[n, #]) &[
First[Flatten[Position[Abs[vec], Max[Abs[vec]]]]]],
_, Normalize[(2 UnitStep[vec] - 1) Abs[
Normalize[vec, Norm[#, Infinity] &]]^(p - 1),
Norm[#, q] &]]] /; p >= 1
Options[pnorm] = {"Samples" -> 9, Tolerance -> Automatic};
pnorm[mat_?MatrixQ, p_, opts___] :=
Module[{q = If[p == 1, Infinity, 1/(1 - 1/p)], m, n, A, tol, sm, x,
y, c, s, W, fo, f, c1, s1, est, eo, z, k, th},
{m, n} = Dimensions[mat];
A = If[Precision[mat] === Infinity, N[mat], mat];
{sm, tol} = {"Samples", Tolerance} /. {opts} /. Options[pnorm];
If[tol === Automatic, tol = 10^(-Precision[A]/3)];
y = Table[0, {m}]; x = Table[0, {n}];
Do[
If[k == 1, {c, s} = {1, 0},
W = Transpose[{A[[All, k]], y}];
fo = 0;
Do[
{c1, s1} = Normalize[Through[{Cos, Sin}[th]], Norm[#, p] &];
f = Norm[W.{c1, s1}, p];
If[f > fo,
fo = f; {c, s} = {c1, s1}];
, {th, 0, Pi, Pi/(sm - 1)}]
];
x[[k]] = c;
y = c A[[All, k]] + s y;
If[k > 1, x = Join[s Take[x, k - 1], Drop[x, k - 1]]];
, {k, n}];
est = Norm[y, p];
For[k = 1, True, k++,
y = A.x;
eo = est; est = Norm[y, p];
z = Transpose[A].dualVector[y, p];
If[(Norm[z, q] < z.x || Abs[est - eo] <= tol est) && k > 1,
Break[]];
x = dualVector[z, q];];
est] /; p >= 1
Ahora, vamos a usar el OP de la matriz como un ejemplo:
mat = N[{{2, 1, 4}, {3, 0, -1}, {1, 1, 2}}];
y ver lo bueno que el estimador es en los casos conocidos:
(pnorm[ma, #] - Norm[ma, #]) & /@ {1, 2, Infinity} // InputForm
{0., -2.2045227554556845*^-6, 0.}
(es decir, la estimación de la 2-norma es bueno ~ 5 dígitos; ajustando Samples
, Tolerance
, o ambos daría mejores resultados).
Vamos a comparar con Robert ejemplo:
pnorm[ma, 4, Tolerance -> 10^-9] // InputForm
5.695759123950937
Muy cerca!
Finalmente, aquí está una parcela de la $p$-norma de la OP matriz con diferentes $p$: