matriz escalonada (metodo de gauss)

Iniciado por jesus++, 25 Diciembre 2013, 18:12 PM

0 Miembros y 2 Visitantes están viendo este tema.

jesus++


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();
}

leosansan

#1
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! ..... !!!!



jesus++

#2
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)

leosansan


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

Código (cpp) [Seleccionar]

#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[i][j]);}}
   
   for(k=1; k<n;k++){
   for(i=k+1; i<=n;i++){
   for(j=1; j<=n;j++)
   x[i][j]=x[i][j]-(x[k][j]*x[i][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[i][j]);}
   
   for(k=n; k>1;k--){
   for(i=k-1; i>=1;i--){
   for(j=n; j>=1;j--)
   x[i][j]=x[i][j]-(x[k][j]*x[i][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[i][j]);}

   getch();
}



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]

jesus++

Ok, sucede q en mi pc por algun motivo no compila cuando uso system("pause")
Alguna sugerencia en el problema ?

leosansan

Cita de: 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 ?

Incluir la librería <stdlib.h>

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

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



amchacon

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

Código (cpp) [Seleccionar]
#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[i][j]);
       }
   }

   for(k=1; k<n; k++)
   {
       for(i=k+1; i<=n; i++)
       {
           for(j=1; j<=n; j++)
               x[i][j] = x[i][j] - (x[k][j] * x[i][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[i][j]);
   }

   for(k=n; k>1; k--)
   {
       for(i=k-1; i>=1; i--)
       {
           for(j=n; j>=1; j--)
               x[i][j] = x[i][j] - (x[k][j] * x[i][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[i][j]);
   }

   getch();
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#7
Cita de: amchacon en 26 Diciembre 2013, 13:01 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 (cpp) [Seleccionar]

#include<stdio.h>

int main()
{
   int i,j,k,n;
   float x[80][80],fac;

   printf("Ingresar el orden de la matriz:\n");
   scanf("%d",&n);
   for(i=0; i<n; i++){
       for(j=0; j<n; j++){
           printf(" x[%d][%d]= ",i+1,j+1);
           fflush (stdout);
           scanf("%f",&x[i][j]);
       }
   }
   printf("\nLa matriz inicial es\n");
   for(i=0; i<n; i++){
       printf("\n");
       for(j=0; j<n; j++)
           printf("%g  ",x[i][j]);
   }
   for(k=0; k<n-1; k++){
       for(i=k+1; i<n; i++){
           fac =-x[i][k]/x[k][k];
           for(j=k; j<n; j++)
               x[i][j]+=x[k][j]*fac;
       }
   }
   printf("\nLa matriz triangular superior es:\n");
   for(i=0; i<n; i++) {
       printf("\n");
       for(j=0; j<n; j++){
           printf("%g  ",x[i][j]);
           fflush (stdout);
       }
   }
   for(k=n-1; k>=0; k--){
       for(i=k-1; i>=0; i--){
           fac =-x[i][k]/x[k][k];
           for(j=n-1; j>=0; j--)
               x[i][j] += x[k][j]*fac;
       }
   }
   printf("\nla matriz diagonal es\n");
   for(i=0; i<n; i++){
       printf("\n");
       for(j=0; j<n; j++){
           printf("%g  ",x[i][j]);
           fflush (stdout);
       }
   }
   return 0;
}


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




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

amchacon

Cita de: leosansan en 26 Diciembre 2013, 16:29 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)

Cita de: leosansan en 26 Diciembre 2013, 16:29 PM* 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 ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

csp

Buenos días,

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