Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jesus++ en 25 Diciembre 2013, 18:12 pm



Título: matriz escalonada (metodo de gauss)
Publicado por: jesus++ en 25 Diciembre 2013, 18:12 pm

un problema q me dejaron, pense hacerlo de esta manera:
primero escalonar la matriz inferior y superiormente, luego pasarla a la matriz identidad y tomar una matriz q empiece en la identidad y realizar las mismas operaciones q a la matriz q ingrese por teclado... el problema esta en escalonarlo, si bien lo he probado manualmente, la computadora solo atina a escalonar, pero los terminos centrales no cambian de valor... el primer paso (y en el q busco ayuda seria escalonar la matriz superiormente) el resto ya lo tengo pensado

#include<stdio.h>
#include<conio.h>
int main(){
   int i,j,k,n;
   float  x[80][80];

   
   printf("ingresar el orden de la matriz\n");
   scanf("%d",&n);
   
   for(i=1; i<=n;i++){
   for(j=1; j<=n;j++){
   printf("ingresar x[%d][%d]: ",i,j);
   scanf("%f",&x[j]);}}
   
   for(k=1; k<n;k++){
   for(i=k+1; i<=n;i++){
   for(j=1; j<=n;j++)
   x[j]=x[j]-(x[k][j]*x[k])/x[k][k];
   
   }}
   
   printf("la matriz escalonada es");
   for(i=1; i<=n;i++){
                     printf("\n");
            for(j=1; j<=n;j++)
                     printf("%f  ",x[j]);}
   
   for(k=n; k>1;k--){
   for(i=k-1; i>=1;i--){
   for(j=n; j>=1;j--)
   x[j]=x[j]-(x[k][j]*x[k])/x[k][k];
   }}

printf("la matriz escalonada es");
   for(i=1; i<=n;i++){
                     printf("\n");
            for(j=1; j<=n;j++)
                     printf("%f  ",x[j]);}

   getch();
}


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 25 Diciembre 2013, 18:21 pm
Antes que nada cuando postees código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: jesus++ en 25 Diciembre 2013, 20:49 pm
Tienes razon, lo tomare en cuenta
Al programa solo deben agregarle "i"a cada x[j], quedara como x(i)[j]
Y la "i" a x[k], quedando x(i)(k)


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 25 Diciembre 2013, 22:45 pm

Aprende a hacerlo, es más fácil:

Código
  1. #include<stdio.h>
  2. #include<conio.h>
  3. int main(){
  4.   int i,j,k,n;
  5.   float  x[80][80];
  6.  
  7.  
  8.   printf("ingresar el orden de la matriz\n");
  9.   scanf("%d",&n);
  10.  
  11.   for(i=1; i<=n;i++){
  12.   for(j=1; j<=n;j++){
  13.   printf("ingresar x[%d][%d]: ",i,j);
  14.   scanf("%f",&x[i][j]);}}
  15.  
  16.   for(k=1; k<n;k++){
  17.   for(i=k+1; i<=n;i++){
  18.   for(j=1; j<=n;j++)
  19.   x[i][j]=x[i][j]-(x[k][j]*x[i][k])/x[k][k];
  20.  
  21.   }}
  22.  
  23.   printf("la matriz escalonada es");
  24.   for(i=1; i<=n;i++){
  25.                     printf("\n");
  26.            for(j=1; j<=n;j++)
  27.                     printf("%f  ",x[i][j]);}
  28.  
  29.   for(k=n; k>1;k--){
  30.   for(i=k-1; i>=1;i--){
  31.   for(j=n; j>=1;j--)
  32.   x[i][j]=x[i][j]-(x[k][j]*x[i][k])/x[k][k];
  33.   }}
  34.  
  35. printf("la matriz escalonada es");
  36.   for(i=1; i<=n;i++){
  37.                     printf("\n");
  38.            for(j=1; j<=n;j++)
  39.                     printf("%f  ",x[i][j]);}
  40.  
  41.   getch();
  42. }
  43.  


De entrada, no deberías hacer uso de la de la libreria conio y su función getch.

Leete Lo que no hay que hacer en C/C++. Nivel basico] (http://[url=http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: jesus++ en 25 Diciembre 2013, 23:26 pm
Ok, sucede q en mi pc por algun motivo no compila cuando uso system("pause")
Alguna sugerencia en el problema ?


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 26 Diciembre 2013, 09:48 am
Ok, sucede q en mi pc por algun motivo no compila cuando uso system("pause")
Alguna sugerencia en el problema ?

Incluir la librería <stdlib.h>

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: amchacon en 26 Diciembre 2013, 13:01 pm
Indexar el código es muy importante para que se entienda mejor:

Código
  1. #include<stdio.h>
  2. #include<conio.h>
  3. int main()
  4. {
  5.    int i,j,k,n;
  6.    float x[80][80];
  7.  
  8.    printf("ingresar el orden de la matriz\n");
  9.    scanf("%d",&n);
  10.  
  11.    for(i=1; i<=n; i++)
  12.    {
  13.        for(j=1; j<=n; j++)
  14.        {
  15.            printf("ingresar x[%d][%d]: ",i,j);
  16.            scanf("%f",&x[i][j]);
  17.        }
  18.    }
  19.  
  20.    for(k=1; k<n; k++)
  21.    {
  22.        for(i=k+1; i<=n; i++)
  23.        {
  24.            for(j=1; j<=n; j++)
  25.                x[i][j] = x[i][j] - (x[k][j] * x[i][k]) / x[k][k];
  26.  
  27.        }
  28.    }
  29.  
  30.    printf("la matriz escalonada es");
  31.    for(i=1; i<=n; i++)
  32.    {
  33.        printf("\n");
  34.        for(j=1; j<=n; j++)
  35.            printf("%f  ",x[i][j]);
  36.    }
  37.  
  38.    for(k=n; k>1; k--)
  39.    {
  40.        for(i=k-1; i>=1; i--)
  41.        {
  42.            for(j=n; j>=1; j--)
  43.                x[i][j] = x[i][j] - (x[k][j] * x[i][k]) / x[k][k];
  44.        }
  45.    }
  46.  
  47.    printf("la matriz escalonada es");
  48.    for(i=1; i<=n; i++)
  49.    {
  50.        printf("\n");
  51.        for(j=1; j<=n; j++)
  52.            printf("%f  ",x[i][j]);
  53.    }
  54.  
  55.    getch();
  56. }


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 26 Diciembre 2013, 16:29 pm

Indexar el código es muy importante para que se entienda mejor:


Efectivamente, indentar el código es un habito que se debe adquirir desde los inicios.

Pero ya que nos ponemos tiquismiquis, habría que hacer otras observaciones:

* la función main por ser de tipo int necesita al final un return tipo int.

* los bucles con una sola instrucción o función no necesitan de llaves.

* puestos a imprimir float me gusta más el formato %g ya que no llena la pantalla de decimales innecesarios.

Y ya que nos ponemos tontitos,y  lo digo por mí, por lo menos corregir le el código, y antes una muestra:

Citar
Ingresar el orden de la matriz:
3
 x[1][1]= 1
 x[1][2]= 0
 x[1][3]= 1
 x[2][1]= 1
 x[2][2]= 2
 x[2][3]= 1
 x[3][1]= 2
 x[3][2]= 1
 x[3][3]= 3

La matriz inicial es

1  0  1
1  2  1
2  1  3
La matriz triangular inferior es:

1  0  1
0  2  0
0  0  1
la matriz escalonada es

1  0  0
0  2  0
0  0  1

Código
  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5.    int i,j,k,n;
  6.    float x[80][80],fac;
  7.  
  8.    printf("Ingresar el orden de la matriz:\n");
  9.    scanf("%d",&n);
  10.    for(i=0; i<n; i++){
  11.        for(j=0; j<n; j++){
  12.            printf(" x[%d][%d]= ",i+1,j+1);
  13.            fflush (stdout);
  14.            scanf("%f",&x[i][j]);
  15.        }
  16.    }
  17.    printf("\nLa matriz inicial es\n");
  18.    for(i=0; i<n; i++){
  19.        printf("\n");
  20.        for(j=0; j<n; j++)
  21.            printf("%g  ",x[i][j]);
  22.    }
  23.    for(k=0; k<n-1; k++){
  24.        for(i=k+1; i<n; i++){
  25.            fac =-x[i][k]/x[k][k];
  26.            for(j=k; j<n; j++)
  27.                x[i][j]+=x[k][j]*fac;
  28.        }
  29.    }
  30.    printf("\nLa matriz triangular superior es:\n");
  31.    for(i=0; i<n; i++) {
  32.        printf("\n");
  33.        for(j=0; j<n; j++){
  34.            printf("%g  ",x[i][j]);
  35.            fflush (stdout);
  36.        }
  37.    }
  38.    for(k=n-1; k>=0; k--){
  39.        for(i=k-1; i>=0; i--){
  40.            fac =-x[i][k]/x[k][k];
  41.            for(j=n-1; j>=0; j--)
  42.                x[i][j] += x[k][j]*fac;
  43.        }
  44.    }
  45.    printf("\nla matriz diagonal es\n");
  46.    for(i=0; i<n; i++){
  47.        printf("\n");
  48.        for(j=0; j<n; j++){
  49.            printf("%g  ",x[i][j]);
  50.            fflush (stdout);
  51.        }
  52.    }
  53.    return 0;
  54. }
  55.  

Eso sí, es un tanto chapucero ya que ni usa pivote ni intercambia filas, caso necesario si en medio de la transformación sale un cero en la diagonal. Pero es lo que el autor proponía.

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


REEDITADO: corregida la observación inferior/superior. Thanks!


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: amchacon en 26 Diciembre 2013, 16:35 pm
* los bucles con una sola instrucción o función no necesitan de llaves.
Cierto pero, en ocasiones las llaves dan más legibilidad (sobre todo cuando empiezas a anidar cosas)

* puestos a imprimir float me gusta más el formato %g ya que no llena la pantalla de decimales innecesarios.
Otra opción es poner %.4f

De esa forma muestra solo hasta 4 decimales, si quieres 8 solo tienes que cambiar el 4 por un 8 ;)


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: csp en 26 Diciembre 2013, 16:37 pm
Buenos días,

Citar
La matriz triangular inferior es:

1  0  1
0  2  0
0  0  1

Es al revés. En la matriz triangular inferior, son nulos todos los elementos sobre la diagonal principal.

Un saludo.


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 26 Diciembre 2013, 16:45 pm
Cierto pero, en ocasiones las llaves dan más legibilidad (sobre todo cuando empiezas a anidar cosas)

Supongo que es la costumbre adquirida antaño del Python, donde haces la vista a la indexación.


Otra opción es poner %.4f
De esa forma muestra solo hasta 4 decimales, si quieres 8 solo tienes que cambiar el 4 por un 8 ;)

¡¡¡Quita, quita!!!,me resulta horrible a la vista esta visión:

Citar

La matriz inicial es

1.0000  0.0000  1.0000
1.0000  2.0000  1.0000
2.0000  1.0000  3.0000


Mejor %g y que el decida los decimales distintos de cero al final, Pero para gustos colores  ;) ;)

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: amchacon en 26 Diciembre 2013, 16:54 pm
Supongo que es la costumbre adquirida antaño del Python, donde haces la vista a la indexación.
Puede ser, yo cuando veo:

Código
  1. int valor = 0;
  2. int matriz[100][100];
  3.  
  4. for (int i = 0; i < 100;i++)
  5.    for (int j = 0; j < 100;j++)
  6.        if (matriz[i][j] > 0)
  7.           while (matriz[i][j] > 0)
  8.                valor += matriz[i][j]*pow(matriz[i][j],valor+matriz[i][j]--);      
  9.        else if (matriz[i][j]) < 0) matriz[i][j] = 0;
  10.               else matriz[i][j] += valor;

Lo entiendo pero me resulta muy confuso. Y si me va una indentación ya la lío parda porque el compilador no me va a avisar de eso.


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 26 Diciembre 2013, 17:07 pm
Puede ser, yo cuando veo:

Código
  1. int valor = 0;
  2. int matriz[100][100];
  3.  
  4. for (int i = 0; i < 100;i++)
  5.    for (int j = 0; j < 100;j++)
  6.        if (matriz[i][j] > 0)
  7.           while (matriz[i][j] > 0)
  8.                valor += matriz[i][j]*pow(matriz[i][j],valor+matriz[i][j]--);      
  9.        else if (matriz[i][j]) < 0) matriz[i][j] = 0;
  10.               else matriz[i][j] += valor;

Lo entiendo pero me resulta muy confuso. Y si me va una indentación ya la lío parda porque el compilador no me va a avisar de eso.

Código
  1. for (int i = 0; i < 100;i++)
  2.    {
  3.        for (int j = 0; j < 100;j++)
  4.            {
  5.                if (matriz[i][j] > 0)
  6.                while (matriz[i][j] > 0)
  7.                    {
  8.                        valor += matriz[i][j]*pow(matriz[i][j],valor+matriz[i][j]--);      
  9.                    }
  10.  
  11.            else if (matriz[i][j]) < 0) matriz[i][j] = 0;
  12.                   {
  13.                       else matriz[i][j] += valor;
  14.                   }
  15.  
  16.            }
  17.    }
  18. }


Perdona que te cite entero pero es que el código que expones está clarísimo. Repito, supongo que es la costumbre o hábito adquirido. Pero para mayor claridad reconozco que el uso de las llaves va mejor en general. ¿O.K?

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: amchacon en 26 Diciembre 2013, 17:12 pm
Perdona que te cite entero pero es que el código que expones está clarísimo. Repito, supongo que es la costumbre o hábito adquirido. Pero para mayor claridad reconozco que el uso de las llaves va mejor en general. ¿O.K?
Pues entonces será la costumbre, yo el python lo usé un par de veces y a correr. Sin las llaves no soy nada :xD

Además hay un problema que le veo (no en Python, sino en los lenguajes de libre indentación):
Y si me va una indentación ya la lío parda porque el compilador no me va a avisar de eso.


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 26 Diciembre 2013, 17:22 pm
Y si me va una indentación ya la lío parda porque el compilador no me va a avisar de eso.

Es la pequeña ventaja de haber usado Python, el compilador te "canta" si no indexas bien, una y otra vez, lo cual te lleva a ser metódico en ese aspecto.. Al final desarrollas ese hábito y resulta sencillo de leer el código.

¡¡¡¡ Saluditos! ..... !!!!


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: SoyelRobert en 27 Diciembre 2013, 12:52 pm
un problema q me dejaron, pense hacerlo de esta manera:
primero escalonar la matriz inferior y superiormente, luego pasarla a la matriz identidad y tomar una matriz q empiece en la identidad y realizar las mismas operaciones q a la matriz q ingrese por teclado... el problema esta en escalonarlo, si bien lo he probado manualmente, la computadora solo atina a escalonar, pero los terminos centrales no cambian de valor... el primer paso (y en el q busco ayuda seria escalonar la matriz superiormente) el resto ya lo tengo pensado


Mmm a ver, esto solo a nivel de matematicas y concepto:

Para escalonar una matriz has de seguir el algoritmo de gauss, ahora bien si lo que quieres es obtener la matriz identidad entonces has de usar el algoritmo de gauss yordan sin embargo ten en cuenta que no te vale cualquier matriz, hay matrices que al utilizar gauss yordan no te van a dar la identidad, te dara una escalonada reducida si pero no la identidad


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 27 Diciembre 2013, 13:39 pm

... el primer paso (y en el q busco ayuda seria escalonar la matriz superiormente) el resto ya lo tengo pensado


A eso es a lo que respondí y tanto superiormente como inferiormente bajo el supuesto que se pueda hacer, que ya es harina de otro costal.

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: amchacon en 27 Diciembre 2013, 13:44 pm
Para escalonar una matriz has de seguir el algoritmo de gauss, ahora bien si lo que quieres es obtener la matriz identidad entonces has de usar el algoritmo de gauss yordan sin embargo ten en cuenta que no te vale cualquier matriz, hay matrices que al utilizar gauss yordan no te van a dar la identidad, te dara una escalonada reducida si pero no la identidad
Cualquier matriz con determinante no-nulo se podrá convertir en identidad.

Si tiene un determinante nulo, significa que no es resoluble (o tiene infinitas soluciones).


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 27 Diciembre 2013, 14:03 pm
Cualquier matriz con determinante no-nulo se podrá convertir en identidad.

Si tiene un determinante nulo, significa que no es resoluble (o tiene infinitas soluciones).

El problema radica que el cálculo de un determinante de una matriz seria, de 100x100 por ejemplo, pasa por buscar previamente su forma diagonal con alguna de las múltiples variantes de Gauss, Jordan,Cholesky y compañía. ¿Supongo que no estarás pensando en la ineficiente regla de Lapace, por cuanto al número de operaciones que implica en comparación con la diagonalización previa  para una matriz del tamaño indicado?.

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: amchacon en 27 Diciembre 2013, 14:41 pm
Cierto.

Quizás sería mejor hacer solo la triangulación y resolverla recursivamente. Si te encuentras con alguna paridad (0x = 4) entonces ya paras.


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: SoyelRobert en 27 Diciembre 2013, 17:18 pm
Cierto.

Quizás sería mejor hacer solo la triangulación y resolverla recursivamente. Si te encuentras con alguna paridad (0x = 4) entonces ya paras.

pero las matrices no tienen porque representar un sistema de ecuaciones a menos que se indique lo contrario, ademas si se llegase a esa prioridad ( 0x = 4) seria conveniente seguir aplicando el algoritmo para obtener unas ecuaciones parametricas facilmente.

Se podria hacer con una funcion recursiva hasta que unicamente queden unos y por arriba y por debajo de estos, ceros...

que al acabar te da la identidad? pues ok, que no? se concluye que el determinante de la matriz debia ser cero o no cuadrada, etc

salu2!


Título: Re: matriz escalonada (metodo de gauss)
Publicado por: leosansan en 27 Diciembre 2013, 20:51 pm
pero las matrices no tienen porque representar un sistema de ecuaciones a menos que se indique lo contrario, ademas si se llegase a esa prioridad ( 0x = 4) seria conveniente seguir aplicando el algoritmo para obtener unas ecuaciones parametricas facilmente.

Se podria hacer con una funcion recursiva hasta que unicamente queden unos y por arriba y por debajo de estos, ceros...
...........................................

Lo primero parece casi evidente. Pero .....

Las matrices no caen del cielo, tienen su propia génesis. Nacen en la vida real de tratar de simular lo real con modelos matemáticos y ello conlleva al planteamiento, en general de sistemas de ecuaciones, bien en el cálculo  matricial, aplicaciones lineales, cálculo tensorial,etc que a su vez surgen de la necesidad de estudiar "algo" concreto, sea un modelo poblacional, el cálculo de un tensor de inercia para una estructura, resolución de circuitos eléctricos y/ o electrónicos, desarrollo de las ecuaciones de una torre de destilación de una petroquímica, un modelo matemático del comportamiento y predicción atmosférico ..... . Y ese último ejemplo que planteo, si bien lo que digo también es aplicable a los casos anteriores y multitud de casos más, resulta que la cantidad de variables inmersas en el problema puede ser ingente así como las relaciones entre ellas, que originan los sistemas ecuaciones  no siempre representables linealmente tal como estamos acostumbrados.

Y a lo anterior se suma que de una matriz puede interesarnos algo concreto, bien sea el determinante, o norma, o los autovalores u autovectores o ........

Y para todo ello lo mejor es tener previamente su forma triangular, aunque no sea necesariamente cuadrada, o mejor aún su forma diagonal. Y ello cuando es posible dicha actuación, por no hablar de la descomposición LD y de ......etc,etc.

Y es que trabajar con matrices de 100x100 o 1000x1000, por poner un par de ejemplos de matrices "indigestivas" por su tamaño y llenas de números de la vida real, que no suelen ser los bonitos números enteros sino los muy desagradables decimales que tienen a su vez la desagradable costumbre de ser o muy grandes o muy pequeños (pensemos en los problemas que surgen en química y que conllevan el uso de concentraciones) en la vida real es duro.

Nuestros códigos están bien para andar por casa pero cuando las cosas se ponen serias, entiéndase a nivel profesional, nada como los paquetes matemáticos comerciales, tipo el Mathematica o el Matlab, por mencionar los más conocidos. O acaso a alguno de nosotros se nos ocurre meternos a desarrollar un programa de dibujo que nos permita plasmar en un dibujo un edificio. ¡Venga hombre!, que para eso ya están el Autocad con toda su familia de subproductos, o el Cypecad y análogos para calcular su estructura.

Y volviendo al tema de la triangularización/diagonalizaciçon claro que se puede resolver de diferentes maneras , directa como yo plantee, según lo que pedía el autor del tema- no hay que olvidar que es una respuesta a un código planteado -, o por una cadena de funciones que troceen el problema o mediante una función recursiva o que sé yo. Soy demasiado nuevo aún es este mundillo.

Sorry, creo que se me ha ido la olla un poco.
;) ;) ;)

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)