Dev - C++ - Problema basico con Gauss simple

 
Vista:

Problema basico con Gauss simple

Publicado por Hector (1 intervención) el 21/02/2019 07:31:13
Me dejaron hacer un programa que resuelva matrices de orden n con gauss simple, tengo la parte de convertir la matriz en diagonal superior, pero para la respuesta quieren una funcion recursiva, la cual se me ocurre, pero no puedo hacerlo ya que para la funcion me pide declarar el numero de columnas y eso depende del orden :( alguna idea ? el codigo es este

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
float ext, aux=0;
 
 
int m,n,i,j,k,l,q,r;
 
int main(){
 
	cout<<"Vamos a resolver una matriz nxn con metodo de Gauss, inserte el orden de su matriz ";
 
	cin>>n;
 
	m=n;
	float mat1[m-1][n+1];
 
	cout<<"Su matriz quedara de "<<n<<"x"<<n+1<<" como una matriz aumentada"<<endl;
 
	for(i=0;i<m;i++){
		for(j=0;j<=n;j++){
			cout<<endl;
			cout<<"Inserte el valor "<<i+1<<" "<<j+1<<" de su matriz"<<endl;
			cin>>mat1[i][j];
		}
	}
		//A partir de aqui comienza el procedimiento para volverla triangular superior 
	for(i=0;i<(n-1);i++){
		for(j=i+1;j<(m);j++){
			ext=(-1*(mat1[j][i]/mat1[i][i]));
			for(k=0;k<=n;k++){
				mat1[j][k]+=ext*mat1[i][k];
			}
		//Imprime todas las matrices conforme se les van haciendo los cambios
		for(q=0;q<m;q++){
		cout<<endl;
		for(r=0;r<=n;r++){
 
			cout<<mat1[q][r]<<"  ";
		}
	    }
	    cout<<endl;
	    cout<<"------------------------------------------------------------------------------------"<<endl;
 
		}
	}
 
 
 
 
	system ("Pause");
	return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema basico con Gauss simple

Publicado por Alfil (1444 intervenciones) el 22/02/2019 10:57:23
Explico un poco la introducción de datos:

Ecuación de ejemplo :

2x +3y + z = 1
3x -2y -4z = -3
5x -y -z = 4

Entrada:

# filas de la matriz: 3
# columnas de la matriz: 4

Datos de la matriz:
Fila: 1
Columna 1: 2
Columna 2: 3
Columna 3: 1
Columna 4: 1
Fila: 2
Columna 1: 3
Columna 2: -2
Columna 3: -4
Columna 4: -3
Fila: 3
Columna 1: 5
Columna 2: -1
Columna 3: -1
Columna 4: 4

Resultado:

x = 1
y = -1
z = 2

El programa no verifica ni la validez de los datos ni si la ecuación es irresoluble.

La conversión de la función Gauss en recursiva te la dejo pendiente para que la realices como ejercicio.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>
#include <iomanip>
 
using namespace std;
 
void LeerMatriz( float **M, int fil, int col ){
 
    cout << "\nDatos de la matriz:\n";
    for( int i = 0; i < fil; i++ ){
        cout << "Fila: " << i + 1 << "\n";
        for( int j = 0; j < col; j++ ){
            cout << "Columna " << j + 1 << ": ";
            cin >> M[i][j];
        }
    }
}
 
const void ImprimirFase( float **M, int fil, int col ){
 
    cout << "\n\n";
    for( int i = 0; i < fil; i++ ){
        for( int j = 0; j < col; j++ ){
            cout << setprecision(2) << fixed << setw(6)
                 << M[i][j] << " ";
        }
        cout << "\n";
    }
}
 
void Gauss( float **M, int fil, int col ){
 
    int k = 0;
    float temp;
 
    while( k < col - 1 ){
        for( int i = k; i < fil; i++ ){
            for( int j = col - 1; j >= k; j-- ){
                if( i == k ){
                    temp = 1 / M[k][k];
                    M[i][j] = temp * M[i][j];
                }
                if( i > k ){
                    temp = (-M[i][k]);
                    M[i][j] = ( temp * (M[k][j])) + M[i][j];
                }
            }
        }
        k++;
    }
    cout << "\nFase 1:";
    ImprimirFase( M, fil, col);
 
    for( int i = 0; i < fil - 1; i++ ){
        for( int j = col - 1; j >= col - 2; j-- ){
            temp = (-M[i][col - 2]);
            M[i][j] = (temp * M[fil - 1][j])+ M[i][j];
        }
    }
    cout << "\nFase 2:";
    ImprimirFase( M, fil, col);
 
    k = 0;
    int c = 1;
    while( k < col - 1 ){
        for( int i = k; i < fil - 2; i++ ){
            for( int j = col - 1; j >= k + c; j-- ){
                temp = (-M[i][k + c]);
                M[i][j] = temp * M[i + 1][j] + M[i][j];
            }
        }
        k++;
        c++;
    }
    cout << "\nFase 3:";
    ImprimirFase( M, fil, col );
 
}
 
const void ImprimirResultado( float **M, int fil, int col ){
 
    cout << "\nImprimir resultado:\n\n";
    for( int i = 0; i < fil; i++ ){
        cout << setprecision(0) << fixed << setw(3)
             << char(120 + i) << " = "
             << setw(3) << setiosflags( ios::right )
             << M[i][col - 1] << endl;
    }
}
 
int main(){
 
    int col, fil;
 
    cout << "# filas de la matriz: ";
    cin >> fil;
    cout << "# columnas de la matriz: ";
    cin >> col;
 
    float** M = new float*[fil];
    for( int i = 0; i < fil; i++ )
        M[i] = new float[col];
 
    LeerMatriz( M, fil, col );
 
    cout << "\nMatriz inicial:";
    ImprimirFase( M, fil, col );
 
    Gauss( M, fil, col );
    ImprimirResultado( M, fil, col );
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar