miércoles, 2 de agosto de 2023
Cálculos matriciales básicos con GNU Octave
-->A=[2,1;5,4]
eco
A =
2. 1.
5. 4.
a) Norma matricial subordinada a la norma vectorial $\left\|\;\right\|_1 \rightarrow \left\|A\right\|_1$=máximo de las sumas de los valores absolutos de los elementos de las columnas de la matriz $A$
-->max(sum(abs(A),'r'))
ans =
7.
o también
-->norm(A,1)
ans =
7.
b) Norma matricial subordinada a la norma vectorial $\left\|\;\right\|_2 \rightarrow \left\|A\right\|_2=\rho(A^t\,A)^{1/2}$
-->norm(A,2)
ans =
6.7678289
Observación:
Los autovalores de $A$ son:
-->spec(A)
ans =
0.5505103
5.4494897
y el máximo de éstos ( el radio espectral, $\rho(A)$ ) es $5,4494897 \neq \left\|A\right\|_2=6.7678289 $
c) Norma matricial subordinada a la norma vectorial $\left\|\;\right\|_2 \rightarrow \left\|A\right\|_{\infty}$=máximo de las sumas de los valores absolutos de los elementos de las filas de la matriz $A$
-->max(sum(abs(A),'c'))
ans =
9.
o también
-->norm(A,'inf')
ans =
9.
d) Norma de Fröbenius es la norma asociada al producto escalar matricial $A:B\overset{def}{=}\text{tr}\,(A^t\,B)$ ), esto es, $\left\|A\right\|_{F}=(A:A)^{1/2}=\left(\text{tr}\,(A^t\,A)\right)^{1/2}$
-->trace(A'*A)^(1/2)
ans =
6.78233
viernes, 7 de julio de 2023
Ejemplo de diagonalización de matrices con GNU OCTAVE
>> A=[1,2,3;4,5,6;7,8,9] A = 1 2 3 4 5 6 7 8 9 % A es la matriz del endomorfismo % expresado con respecto de la base canónica % e_1=(1,0,0), e_2=(0,1,0) y e_3=(0,0,1) >> [C,A]=eig(A) % Aquí se calculan los autovalores y % la matriz, C, del cambio de base. % % Sus columnas corresponden % a las coordenadas de los vectores % de la nueva base C = -0.231971 -0.785830 0.408248 -0.525322 -0.086751 -0.816497 -0.818673 0.612328 0.408248 % Los vectores de la nueva base son: % u_1= (-0.231971, -0.525322, -0.818673) % u_2= (-0.785830, -0.086751, 0.612328) % u_3=(0.408248,-0.816497,0.408248) A = Diagonal Matrix 1.6117e+01 0 0 0 -1.1168e+00 0 0 0 -1.3037e-15 % Como se puede comprobar en el resultado, % con respecto a la nueva base % la matriz del endomorfismo % es una matriz diagonal.
Compruebo ahora que con la matriz diagonal hallada, $D=CAC^{-1}$, ha de cumplirse que $A=C^{-1}DC$ , ya que partiendo de $D=CAC^{-1}$, se tiene que $DC=CAC^{-1}\,C \Rightarrow DC=CAI=CA \Rightarrow C^{-1}DC=C^{-1}CA=IA=A $ En efecto,
>> C*A*C^-1 ans = 1 2 3 4 5 6 7 8 9
$\diamond$
Utilidades:
  [1] GNU OCTAVEmiércoles, 21 de diciembre de 2022
Resolución de un sistema de ecuaciones lineales compatible determinado por el método de la matriz inversa (realizando los cálculos con GNU Octave)
Consideremos el siguiente sistema de ecuaciones lineales con tres incóngitas $$\left.\begin{matrix}x&+&y&+&z&=&1 \\ x&-&2y&+&3z&=&2 \\ x&+&3y&-&z&=&3\end{matrix}\right\}$$ que en forma matricial puede escribirse de la forma $$\begin{pmatrix} 1 & 1 & 1 \\ 1 & -2 & 3 \\ 1 & 3 & -1 \end{pmatrix}\,\begin{pmatrix} x \\ y \\ z\end{pmatrix}=\begin{pmatrix} 1 \\ 2 \\ 3\end{pmatrix}$$ Entendiendo por $A$ la matriz de los coeficientes del sistema, por $X$ el vector columna de las incóngnitas y por $B$ el vector columna de los términos independientes, podemos escribir la ecuación matricial $$AX=B$$ Multiplicando ambos miembros por $A^{-1}$, se tiene que $A^{-1}AX=A^{-1}B$, y como $A^{-1}A=I$ (matriz identidad), teniendo en cuenta que $IX=X$, llegamos a $$X=A^{-1}B$$ Esto constituye el método de la matriz inversa para resolver el sistema de ecuaciones, obteniendo éstas, esto es, el vector columna de las incógnitas, que, claro está, para poder aplicarlo es necesario que $\text{det}(A)\neq 0$ (el sistema tiene que ser compatible).
Voy ahora a resolverlo, con la ayuda del GNU Octave:
>> A=[1,1,1;1,-2,3;1,3,-1] A = 1 1 1 1 -2 3 1 3 -1 >> det(A) ans = 2 % Como el determinante de la matriz de los coeficientes es % distinto de cero, la matriz es regular (inversible) y su % rango es 3; en efecto, >> rank(A) ans = 3 % luego el sistema es compatible. % Además, es compatible, habida cuenta de que % el rango de la matriz ampliada es también 3, % (en efecto, el rango de la matriz ampliada es 3) >> A_a=[1,1,1,1;1,-2,3,2;1,3,-1,3] A_a = 1 1 1 1 1 -2 3 2 1 3 -1 3 >> rank(A_a) ans = 3 % Por otra parte, el rango, que es 3, % es igual al número de incóngitas % por lo que el sistema es (compatible) determinado % Procedo a resolverlo, % calculando la matriz inversa de A: >> A_i=inv(A) A_i = -3.5000 2.0000 2.5000 2.0000 -1.0000 -1.0000 2.5000 -1.0000 -1.5000 % Compruebo que está bien calculada: % el producto de la matriz A por su inversa % (y el de la inversa de A por A) % ha de ser igual a la matriz identidad >> I=[1,0,0;0,1,0;0,0,1] I = 1 0 0 0 1 0 0 0 1 >> A_i*A ans = 1.0000 0.0000 0 0 1.0000 0 0 0.0000 1.0000 >> A*A_i ans = 1.0000 0 0 0.0000 1.0000 0.0000 0 0 1.0000 % Finalmente, calculo el vector de las incóngitas X: % (defino antes el vector de los términos independientes) >> B=[1;2;3] B = 1 2 3 % Y he aquí la solución del sistema >> X=A_i*B X = 8 -3 -4 % Compruebo la solución, sustituyendo en las ecuaciones % los valores de las incóngitas que acabamos de calcular % Substituyo en la primera ecuación >> X(1)+X(2)+X(3) ans = 1 que, en efecto, es el valor del término independiente de la misma % Substituyo en la segunda ecuación >> X(1)-2*X(2)+3*X(3) ans = 2 que, en efecto, es el valor del término independiente de la misma % Substituyo en la tercera ecuación >> X(1)+3*X(2)-X(3) ans = 3 que, en efecto, es el valor del término independiente de la misma
$\diamond$
Referencias
[1] J.F. Fernando; J.M. Gamboa; J.M. Ruiz, Álgebra lineal (vol. 1), Sanz y Torres, Madrid, 2011
[2] John W. Eaton; David Bateman; Søren Hauberg; Rik Wehbring, Free Your Numbers (Manual de GNU Octave), https://www.gnu.org/software/octave/octave.pdf
martes, 20 de diciembre de 2022
Cálculo rápido del determinante de una matriz cuadrada $A$, dada ésta factorizada como $A=LU$
Es sabido que dadas dos matrices cuadradas y del mismo orden, $A$ y $B$, se tiene que $\text{det}(AB)=\text{det}(A)\cdot \text{det}(B)$; por tanto, si una matriz $M$ viene ya expresada como el producto de una matriz triangular inferior por una matriz triangular superior (factorización $M=LU$) —ya se trate de la factorización de Crout o bien de la de Doolittle—, el cálculo del determinante de $M$ es muy rápido.
Teniendo en cuenta que el determinante de una matriz cuadrada triangular es igual al producto de los elementos de su diagonal principal, entonces el cálculo del determinante de $\text{det}(M)=\text{det}(L)\cdot \text{det}(U)$ requiere únicamente $n-1$ multiplicaciones (el producto de los elementos de la diagonal principal del factor que no tenga unos en la misma), ya que la otra matriz factor tiene determinante igual a $1$, habida cuenta de que los elementos de su diagonal principal son todos ellos unos.
Ejemplo con una matriz $M=LU$ (factorizada por el m. de Doolittle: matriz $L$ con unos en la diagonal principal)
Con $2$ multiplicaciones podemos calcular el determinante de una matriz cuadrada de orden $3$, siempre que conozcamos la factorización $LU$ de la misma. Hago los cálculos de comprobación con GNU Octave:
% Sea la matriz A=[1,-1,2;1,2,2;1,1,-1] A = 1 -1 2 1 2 2 1 1 -1 >> [L,U]=lu(A) L = 1.0000 0 0 1.0000 1.0000 0 1.0000 0.6667 1.0000 U = 1 -1 2 0 3 0 0 0 -3 % det(L)=1 (no hace falta hacer ningún cálculo, pues % de antemano conocemos este resultado, puesto que % L es una matriz diagonal con unos en la diagonal % principal, y, por tanto, su determinante es igual a 1) % A continuación vemos las dos multiplicaciones que % he comentado arriba: % det(U)=1·3·(-3)=(1\cdot 3)\cdot (-3)=-9 % En efecto, por el algoritmo por defecto: >> det(U) ans = -9 % Así pues det(L)·det(U)=1·(-9)=-9 % en efecto, por el algoritmo por defecto: >> det(L)*det(U) ans = -9 % y nótese que, por el algoritmo por defecto, >> det(A) ans = -9
$\diamond$
Referencias
[1] J.F. Fernando; J.M. Gamboa; J.M. Ruiz, Álgebra lineal (vol. 1), Sanz y Torres, Madrid, 2011
[2] F. García; A. Nevot, Análisis numérico, Paraninfo, Madrid, 1992
[3] John W. Eaton; David Bateman; Søren Hauberg; Rik Wehbring, Free Your Numbers (Manual de GNU Octave), https://www.gnu.org/software/octave/octave.pdf
lunes, 19 de diciembre de 2022
Operaciones sencillas con matrices empleando GNU Octave
En este artículo expongo un sencillo divertimento del uso del programa GNU Octave con el cálculo con matrices, que, si bien no tiene una utilidad práctica evidente, puede ser de utilidad para juagar y familiarizarnos con el uso de este software.
Podemos descomponer una matriz, $A$, como la suma de la matriz formada por los elementos que quedan por debajo de la diagonal principal (incluidos éstos) —siendo los restantes (los de la parte superior a la misma nulos)— y la matriz formada por los elementos que quedan por por encima de la diagonal principal (incluidos éstos) —siendo los restantes (los de la parte inferior a la misma nulos)—, restando al resultado de esta suma la matriz diagonal formada por los elementos de la diagonal principal de la matriz $A$ (puesto que con la suma de la primera y segunda matriz sumamos dos veces los elementos de la diagonal principal). Veamos un ejemplo:
>> A=[1,2,3;4,5,6;7,8,9] A = 1 2 3 4 5 6 7 8 9 >> tril(A) ans = 1 0 0 4 5 0 7 8 9 >> triu(A) ans = 1 2 3 0 5 6 0 0 9 >> triu(A)+tril(A) ans = 2 2 3 4 10 6 7 8 18 >> diag=[1,0,0;0,5,0;0,0,9] diag = 1 0 0 0 5 0 0 0 9 Comprobémoslo: >> tril(A)+triu(A)-diag ans = 1 2 3 4 5 6 7 8 9 que es la matriz A de partida.
Referencias
[1] John W. Eaton; David Bateman; Søren Hauberg; Rik Wehbring, Free Your Numbers (Manual de GNU Octave), https://www.gnu.org/software/octave/octave.pdf
$\diamond$
domingo, 18 de diciembre de 2022
Diagonalización de matrices con GNU Octave. Valores y vectores propios
Para obtener los valores propios y los vectores propios de una matriz $A$ existe también una instrucción en GNU Octave. A modo de ejemplo, voy encontrar los valores y vectores propios de la matriz de orden $3$ $$A=\begin{pmatrix}1&2&3\\ 4&5&6 \\ 7&1&9 \end{pmatrix}$$ utilizando GNU Octave (de manera automática). La instrucción nos da la matriz del cambio de base $C$, siendo por tanto los coeficiente de la misma, por columnas, las coordenadas de los vectores propios; además, $D$ representa la matriz diagonal: en cuya diagonal principal tendremos los valores propios correspondientes.
>> A=[1,2,3;4,5,6;7,1,9] A = 1 2 3 4 5 6 7 1 9 >> [C,D]=eig(A) C = -0.285862 -0.818536 -0.227349 -0.667939 -0.027924 -0.877584 -0.687125 0.573776 0.422088 D = Diagonal Matrix 12.8843 0 0 0 -1.0347 0 0 0 3.1505 >> eig(A) ans = 12.8843 -1.0347 3.1505
Referencias
[1] John W. Eaton; David Bateman; Søren Hauberg; Rik Wehbring, Free Your Numbers (Manual de GNU Octave), https://www.gnu.org/software/octave/octave.pdf
$\diamond$
Factorización $QR$ de una matriz con GNU Octave
Una matriz $A$ no singular puede descomponerse (factorizarse) de la forma $A=QR$, donde $Q$ es una matriz ortogonal y $R$ es una matriz triangular superior. En partircular, si los elementos de la diagonal de $L$ son unos, denominamos a dicha factorización $LU$ de Crout. A modo de ejemplo, voy a resolver la factorización $LU$ de Crout de la siguiente matriz de orden $3$ $$A=\begin{pmatrix}1&-1&2\\ 1&2&2 \\ 1&1&-1 \end{pmatrix}$$ utilizando GNU Octave (de manera automática)-
Mediante el uso de la herramienta GNU Octave voy a resolver el sistema escalonando por Gauss la matriz ampliada, con pivotamiento por columnas, obteniendo así una matriz equivalente (en cuanto a la solución del sistema) de tipo triangular superior:
>> A=[1,-1,2;1,2,2;1,1,-1] A = 1 -1 2 1 2 2 1 1 -1 >> [Q,R]=qr(A) Q = -0.5774 0.7715 -0.2673 -0.5774 -0.6172 -0.5345 -0.5774 -0.1543 0.8018 R = -1.7321 -1.1547 -1.7321 0 -2.1602 0.4629 0 0 -2.4054Por tanto, podemos escribir $$\begin{pmatrix}1&-1&2\\ 1&2&2 \\ 1&1&-1 \end{pmatrix}=\begin{pmatrix}-0.5774 & 0.7715 & -0.2673 \\ -0.5774 & -0.6172 & -0.5345 \\ -0.5774 & -0.1543 & 0.8018 \end{pmatrix}\,\begin{pmatrix} -1.7321 & -1.1547 & -1.7321\\ 0 & -2.1602 & 0.4629 \\ 0 & 0 & -2.4054 \end{pmatrix}$$ Comprobémoslo, empleando también Octave. En efecto,
>> Q*R ans = 1 -1 2 1 2 2 1 1 -1
Observación
La descomposición $QR$ es la base del algoritmo QR que se utiliza para el cálculo de los vectores y valores propios de una matriz.Referencias
[1] John W. Eaton; David Bateman; Søren Hauberg; Rik Wehbring, Free Your Numbers (Manual de GNU Octave), https://www.gnu.org/software/octave/octave.pdf
$\diamond$
Factorización $LU$ de Doolittle empleando GNU Octave
Una matriz $A$ no singular puede descomponerse (factorizarse) de la forma $A=LU$, donde $L$ es una matriz triangular inferior y $U$ es una matriz triangular superior. En partircular, si los elementos de la diagonal de $L$ son unos, denominamos a dicha factorización $LU$ de Doolittle. A modo de ejemplo, voy a resolver la factorización $LU$ de Doolittle de la siguiente matriz de orden $3$ $$A=\begin{pmatrix}1&-1&2\\ 1&2&2 \\ 1&1&-1 \end{pmatrix}$$ utilizando GNU Octave (de manera automática)-
Mediante el uso de la herramienta GNU Octave voy a resolver el sistema escalonando por Gauss la matriz ampliada, con pivotamiento por columnas, obteniendo así una matriz equivalente (en cuanto a la solución del sistema) de tipo triangular superior:
>> A=[1,-1,2;1,2,2;1,1,-1] A = 1 -1 2 1 2 2 1 1 -1 >> [L,U]=lu(A) L = 1.0000 0 0 1.0000 1.0000 0 1.0000 0.6667 1.0000 U = 1 -1 2 0 3 0 0 0 -3Por tanto, podemos escribir $$\begin{pmatrix}1&-1&2\\ 1&2&2 \\ 1&1&-1 \end{pmatrix}=\begin{pmatrix}1&0&0\\ 1&1&0 \\ 1&0.6667&1 \end{pmatrix}\,\begin{pmatrix}1&-1&2\\ 0&3&0 \\ 0&0&-3 \end{pmatrix}$$ Comprobémoslo, empleando también Octave. En efecto,
>> L*U ans = 1 -1 2 1 2 2 1 1 -1
Nota
Habida cuenta de que el coficiente $0.6667$ es la aproximación de $\dfrac{2}{3}$ podemos escribir también de la forma $$\begin{pmatrix}1&-1&2\\ 1&2&2 \\ 1&1&-1 \end{pmatrix}=\begin{pmatrix}1&0&0\\ 1&1&0 \\ 1&2/3&1 \end{pmatrix}\,\begin{pmatrix}1&-1&2\\ 0&3&0 \\ 0&0&-3 \end{pmatrix}$$Observación
Para hacer frente a posibles inestabilidades del método conviene tener en cuenta algunos casos especiales; así, por ejemplo, en el caso de que uno o varios elementos de la diagonal principal de la matriz a factorizar sea cero, será necesario premultiplicar la matriz por una o varias matrices elementales de permutación. Existe un segundo método llamado factorización $P A = L U $ (o $L U$ con pivote), que se usa en el análisis numérico para resolver sistemas de ecuaciones con más eficiencia y también para encontrar las matrices inversas.
Referencias
[1] John W. Eaton; David Bateman; Søren Hauberg; Rik Wehbring, Free Your Numbers (Manual de GNU Octave), https://www.gnu.org/software/octave/octave.pdf
$\diamond$
Uso de GNU Octave en la resolución (automática) de sistemas de ecuaciones lineales
Consideremos el siguiente sistema de ecuaciones lineales con tres incóngitas $$\left.\begin{matrix}x&+&y&+&z&=&1 \\ x&-&2y&+&3z&=&2 \\ x&+&3y&-&z&=&3\end{matrix}\right\}$$ que en forma matricial puede escribirse de la forma $$\begin{pmatrix} 1 & 1 & 1 \\ 1 & -2 & 3 \\ 1 & 3 & -1 \end{pmatrix}\,\begin{pmatrix} x \\ y \\ z\end{pmatrix}=\begin{pmatrix} 1 \\ 2 \\ 3\end{pmatrix}$$ La matriz (ampliada) de los coeficientes del sistema es $$A=\left(\begin{array}{ccc|c} 1&1&1&1 \\ 1&-2&3&2 \\ 1&3&-1&3 \end{array}\right) $$
Mediante el uso de la herramienta GNU Octave voy a resolver el sistema escalonando por Gauss la matriz ampliada, con pivotamiento por columnas, obteniendo así una matriz equivalente (en cuanto a la solución del sistema) de tipo triangular superior $U$ tal que $U^{\top}U=A$. Con Octave es tan cómodo como hacer los siguiente:
>> A=([1,1,1,1;1,-2,3,2;1,3,-1,3]) >> U=rref(A) U = 1 0 0 8 0 1 0 -3 0 0 1 -4esto es, la matriz $$\left(\begin{array}{ccc|c} 1&0&0&8 \\ 0&1&0&-3 \\ 0&0&1&-4 \end{array}\right) $$ Así, un sistema equivalente en solución es $$\left.\begin{matrix}x&&&&&=&8 \\ &&y&&&=&-3 \\ &&&&z&=&-4\end{matrix}\right\}$$ que nos da directamente la solución.
$\diamond$
Referencias
[1] John W. Eaton; David Bateman; Søren Hauberg; Rik Wehbring, Free Your Numbers (Manual de GNU Octave), https://www.gnu.org/software/octave/octave.pdf
viernes, 16 de diciembre de 2022
Salidas de los resultados decimales de un cálculo en GNU OCTAVE
¿Cómo establecer el número de cifras decimales significativas de una cantidad que se mostrarán en la salida?
Podemos mostrar 4 o bien 14 cifras decimales significativas estableciendo un formato largo o un formato corto, los cuales están preestablecidos
Ejemplos
Aproximación de pi con 4 cifras decimales significativas (5 cifras significativas, las de la parte decimal más la de la parte entera) >> format short;pi ans = 3.1416 Aproximación de pi con 14 cifras decimales significativas (15 cifras significativas, las de la parte decimal más la parte entera) >> format long;pi ans = 3.141592653589793
Es posible precisar el número de cifras decimales significativas que nos interese
Ejemplos
>> printf("pi con tres cifras decimales significativas=%0.3f\n",pi) pi con tres cifras decimales significativas (4 c. significativas)=3.142 También podemos establecer la longitud del espaciado delante de la primera cifra entera >> printf("aproximacion de pi con cuatro cifras significativas=%10.3f\n",pi) aproximacion de pi con cuatro cifras significativas= 3.142 >> printf("aproximacion de pi con cuatro cifras significativas=%20.3f\n",pi) aproximacion de pi con cuatro cifras significativas= 3.142
Resultado de un cálculo empleando una variable y una constante, estableciendo el número de cifras decimales significativas que corresponda en cada caso
Ejemplo
Cálculo del área de un círculo de radio dado Ejemplo: >> r=2.1 Notemos que el radio, como dato (medido en unidades arbitrarias de longitud), tiene una precisión de 2 cifras significativas (c.s.) Como el dato (el radio) tiene 2 cifras significativas (c.s.), el resultado del cálculo, que involucra productos (la potencia), no puede darse con una precisión mayor que la del dato, esto es, con 2 c.s., y por tanto sin parte decimal, que son, en este caso, las dos cifras de la parte entera del mismo >> printf("area del circulo= %2.0f\n",pi*r^2) area del circulo= 14
Referencias
[1] Manual de GNU Octave: https://www.gnu.org/software/octave/octave.pdf
$\diamond$