[ Foro de C ]

Ayuda con matrices

20-Apr-2021 06:13
Invitado (Mario)
0 Respuestas

Hola, en este programa se usa la inversa de gauss-jordan y se resuelven dos sistemas de ecuaciones iguales, solo cambian los coeficientes independientes, el problema es que cuando se reordena la matriz, cambia el orden del sistema y al querer ingresar los nuevos coeficientes independientes debes fijarte de que fila es, la intención es que aparezca como es originalmente para escribir los coeficientes de la misma forma, espero puedan ayudarme, gracias
Estos son los sistemas de ecuaciones:
Sistema 1:
3 x1 + 7 x2 - 3 x3 = 20
-2x1 +3 x2 + 5x3 = -8
4x1 - 3 x2 + 5 x3 = 4

Sistema 2.
3 x1 + 7 x2 - 3 x3 = 14
-2x1 +3 x2 + 5x3 = 2
4x1 - 3 x2 + 5 x3 = -3

Y el código:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX1 51 //Maximo de ecuaciones
#define MAX2 101 //Maximo de columnas

int main() {
int n; //numero de ecuaciones
float a[MAX1][MAX2]; //matriz aumentada
float c[MAX1]; //vector terminos independientes
float x[MAX1]; //vector de soluciones
float sum;
float piv; //coeficiente del pivote
float mult; //multiplicador de terminos
float mayor;
int fila;
int i,j,k; //variables de filas y columnas
float temp,temp2;
char ec;

printf("\n Ingrese el numero de ec:");
scanf("%d",&n);

for(i=1;i<=n;i++) {
printf("\n Ec %d\n",i);

//Se digitan los coeficientes
for(j=1;j<=n;j++) {
printf(" Fila %d columna %d (x%d): ",i,j,j);
scanf("%f", &a[i][j]);
}
printf(" Fila %d columna %d (CI): ",i,j);
scanf("%f", &c[i]);
}

//Se imprime el sistema de ecuaciones
printf("\n SE\n\n");

for(i=1;i<=n;i++) {

for(j=1;j<=n;j++) {
printf(" %8.4f",a[i][j]);
}

printf(" %8.4f \n",c[i]);
}

//Matriz original con la matriz identidad
for(i=1;i<=n;i++) {

for(j=n+1;j<=(2*n);j++) {
if (i==j-n) {
a[i][j]=1;
}

else if(i !=j-n){
a[i][j]=0;
}
}
}

//Se imprime la matriz aumentada
printf("\n Matriz aumentada \n\n");

for(i=1;i<=n;i++) {

for(j=1;j<=(2*n);j++) {
printf(" %8.4f",a[i][j]);
}

printf(" %8.4f \n",c[i]);
}

//Pivoteo parcial
for(j=1;j<=n-1;j++){
mayor=fabs(a[j][j]);
fila = j;

for(i=j+1;i<=n;i++){
if (fabs(a[i][j])> mayor){
mayor=fabs(a[i][j]);
fila=i;
}
}

       for(i=1;i<=n;i++){
if (fila != j){
temp= a[j][i];
a[j][i]=a[fila][i];
a[fila][i]=temp;
}
}
if (fila != j) {
temp= c[j];
c[j]=c[fila];
c[fila]=temp;
}
}

//Se imprime la matriz reordenada
printf("\n SE reordenado\n\n");

for(i=1;i<=n;i++) {

for(j=1;j<=(2*n);j++) {
printf(" %8.4f",a[i][j]);
}
printf(" %8.4f \n",c[i]);
}

//Se eliminan terminos en la primera mitad y se calcula la inversa en la segunda
for(i=1;i<=n;i++) {

piv = a[i][i];

for(j=1;j<=(2*n);j++) {
a[i][j] = (a[i][j] / piv);
}

for(k=1;k<=n;k++) {

if(i != k) {
mult = a[k][i];

for(j=1;j<=(2*n);j++) {
a[k][j] = a[k][j] - (mult*a[i][j]);
}
}
}
}

//Se imprime la matriz aumentada con la inversa en la segunda mitad
printf("\n Matriz aumentada\n\n");

for(i=1;i<=n;i++) {

for(j=1;j<=(2*n);j++) {
printf(" %8.4f",a[i][j]);
}
printf(" %8.4f \n",c[i]);
}

do{
if(ec=='s'||ec=='S'){

for(i=1;i<=n;i++) {
printf("\n Ingrese el coeficiente independiente (fila %d columna %d): ",i, j );
scanf("%f", &c[i]);
}
}

//Se encuentra la solucion
for(i=1;i<=n;i++) {
sum = 0;

for (j=n+1; j<=(2*n); j++) {
sum = sum + (a[i][j] * c[j-n]);
}
x[i]= sum;
}

//Se imprime la solucion del sistema
printf("\n Solucion\n");

for(i=1;i<=n;i++) {
printf(" x%d =  %.4f  \n",i,x[i]);
}

//Se pregunta por mas sistemas
printf("\n Resolver otro SE (s|n)?");
fflush(stdin);
scanf("%c",&ec);

}while(ec=='s'||ec=='S');

return 0;
}




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)