Mostrando entradas con la etiqueta GNU Octave. Mostrar todas las entradas
Mostrando entradas con la etiqueta GNU Octave. Mostrar todas las entradas

miércoles, 2 de agosto de 2023

Cálculos matriciales básicos con GNU Octave

Introduciendo los coeficientes de la matriz $A$ en 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$

-oOo-

Utilidades:

  [1] GNU OCTAVE

mié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$

-oOo-

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$

-oOo-

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.   

-oOo-

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

-oOo-

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.4054

Por 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.

-oOo-

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  -3


Por 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}$$

-oOo-

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.

-oOo-

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  -4 
  
esto 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$

-oOo-

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

-oOo-

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

-oOo-

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

-oOo-

Referencias

[1] Manual de GNU Octave: https://www.gnu.org/software/octave/octave.pdf

$\diamond$

lunes, 26 de abril de 2021

Introducción a la programación con GNU Octave. Primer programa.


Ejemplo de programa sencillo con GNU Octave. Cálculo de las solución de una ecuación de segundo grado.


Averiguando si un cierto año es bisiesto


Máximo común divisor ( por el algoritmo de las restas sucesivas )



Máximo común divisor ( por el algoritmo de las divisiones sucesivas, más conocido como algoritmo de Euclides )

A continuación, podéis ver el código ( incluyendo una línea de comentario con vuestro nombre y apellidos ) del programa que podéis probar en vuestro entorno de OCTAVE.










Cálculo aproximado de raíces de una función. Método de bisección

Se muestra aquí el el código para implementar el programa en vuestro ordenador [puede ayudar a la comprensión


Ejercicio de programación en GNU Octave - Ternas pitagóricas


Programación con GNU Octave. Ejemplo de uso de bucles: suma de un conjunto de números enteros solicitados al usuario


Ejemplo de bucle con 'do ... until' en GNU Octave