Dev - C++ - Ayuda con eliminacion gaussiana con pivoteo escalado

 
Vista:
Imágen de perfil de Enrique
Val: 4
Ha disminuido su posición en 5 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con eliminacion gaussiana con pivoteo escalado

Publicado por Enrique (2 intervenciones) el 29/03/2019 03:27:14
Compañeros, necesito de su ayuda URGENTE!!!

Llevo 1 semana tratando de modificar uno de mis programas para que me simule un programa de eliminacion gaussiana con pivoteo escalado. Logre realizar el programa que me hace el pivoteo maximo y quiero hacer el escalado pero no hallo la manera. Alguno podria modificar mi codigo de modo que realize el metodo de escalado?

Les agradeceria su ayuda. Mi codigo es el siguiente (tambien dejo una imagen del algoritmo de pivoteo escalado):

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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main(){
	int n, n1, i, j, k, l;
	float t, ma[10][10], x[10];
 
	printf("Numero de incognitas: ");
	scanf("%d", &n);
	printf("\nNumero de ecuaciones: ");
	scanf("%d", &n1);
	if(n!=n1){
		printf("No se puede ejecutar el programa. La matriz debe ser cuadratica.\n");
	}
	else{
		printf("\n");
 
		for(i=1;i<=n;i++){//RENGLON
			for(j=1;j<=n+1;j++){//COLUMNA
				printf("Elemento [%d][%d] de la matriz: ",i,j);
				scanf("%f", &ma[i][j]);
			}
		}
 
		printf("\n\nMatriz ordenada:\n\n");
		for(i=1;i<=n;i++){//IMPRIMIR MATRIZ
			for(j=1;j<=n+1;j++){
				printf("%f ", ma[i][j]);
			}
			printf("\n");
		}
 
		for(k=1;k<=n-1;k++){
		    int mayor=0;
                    int fmayor=k;
		    for(l=k;l<=n;l++){
                        if(fabs(ma[l][k])>mayor){
                            mayor = fabs(ma[l][k]);
                            fmayor = l;
                        }
                    }
 
			if(mayor == 0){
				printf("El sistema no tiene solucion.\n");
			}
			else{
            	        if(fmayor != 0){//INTERCAMBIO
                	     for(j=1;j<=n+1;j++){
                    	         t = ma[k][j];
                    	        ma[k][j] = ma[fmayor][j];
                    	        ma[fmayor][j] = t;
                	     }
            	        }
			}
 
                       for(i=k+1;i<=n;i++){//HACER CEROS COLUMNAS
                            t = ma[i][k] / ma[k][k];
                           for (j=k;j<=n+1;j++){
                                    ma[i][j] = ma[i][j] - t * ma[k][j];
                            }
		       }
                 }
 
		printf("\n\nMatriz final:\n\n");
		for(i=1;i<=n;i++){//IMPRIMIR MATRIZ FINAL
			for(j=1;j<=n+1;j++){
				printf("%f ", ma[i][j]);
			}
			printf("\n");
		}
 
		//ENCONTRAR RAICES
		x[n]=ma[n][n+1]/ma[n][n];
 
		for(i=n-1;i>=1;i--){
			float sum=0;
        	for(j=n+1;j>i;j--){
            	sum += ma[i][j] * x[j];
        	}
        	x[i] = (ma[i][n+1] - sum) / ma[i][i];
    	}
 
    	printf("\n\nRaices:\n\n");
		for(i=n;i>=1;i--){//IMPRIMIR RAICES
			printf("X[%d]: %f\n", i, x[i]);
		}
 
		printf("\n");
	}
 
	return 0;
}


algoritmo_escalado
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++

Ayuda con eliminacion gaussiana con pivoteo escalado

Publicado por Alfil (1444 intervenciones) el 01/04/2019 12:05:23
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <cmath>
#include <iomanip>
 
using namespace std;
 
void leerDatos( double **M, int fil, int col, double B[] );
void gaussEliminacion( double **M, int fil, int col, double v[] );
void intercambiarFilas( double **M, int col, int k, int max );
void imprimirMatriz( double **M, int fil, int col, double v[] );
void imprimirSolucion( double v[], int fil );
 
int main()
{
    int fil, col;
 
    cout << "\Numero de variables: ";
    cin >> fil;
    col = fil;
 
    double** A = new double*[fil];
    for( int i = 0; i < fil; i++ )
        A[i] = new double[col];
 
    double B[fil];
 
    leerDatos( A, fil, col, B );
    imprimirMatriz( A, fil, col, B );
    gaussEliminacion( A, fil, col, B );
 
    return 0;
}
 
void leerDatos( double **A, int fil, int col, double B[] )
{
    cout << "\nIntroduzca coeficientes de la ecuacion:\n";
    for( int i = 0; i < fil; i++ ){
        cout << "\nFila " << i + 1 << ":\n";
        for( int j = 0; j < col; j++ ) {
            cout << "Columna " << j + 1 << ": ";
            cin >> A[i][j];
        }
    }
    cout << "\nIntroduzca igualdad de la ecuacion:\n";
    for(int i = 0; i < fil; i++ ){
        cout << "\nFila " << i + 1 << ": ";
        cin >> B[i];
    }
 
}
 
void gaussEliminacion( double **A, int fil, int col, double B[] )
{
    int max;
    int N = fil;
    double factor, temp;
 
    for( int k = 0; k < N; k++ ){
        max = k;
        for( int i = k + 1; i < N; i++ )
            if( abs( A[i][k] ) > abs( A[max][k] ) )
                max = i;
 
        intercambiarFilas( A, col, k, max );
        temp = B[k];
        B[k] = B[max];
        B[max] = temp;
 
        for( int i = k + 1; i < N; i++ ) {
            factor = A[i][k] / A[k][k];
            B[i] -= factor * B[k];
 
            for( int j = k; j < N; j++ )
                A[i][j] -= factor * A[k][j];
 
        }
    }
    imprimirMatriz( A, fil, col, B );
 
    double solucion[fil] = { 0.0 };
    double suma;
 
    for (int i = N - 1; i >= 0; i-- ){
 
        suma = 0.0;
 
        for( int j = i + 1; j < N; j++ )
            suma += A[i][j] * solucion[j];
 
        solucion[i] = (B[i] - suma) / A[i][i];
 
    }
    imprimirSolucion( solucion, fil );
}
 
void intercambiarFilas( double **M, int col, int k, int max )
{
    double temp[col];
 
    for( int i = k; i < col; i++ ) {
            temp[i] = M[k][i];
            M[k][i] = M[max][i];
            M[max][i] = temp[i];
    }
}
 
void imprimirMatriz( double **M, int fil, int col, double v[] )
{
    cout << setprecision(3) << fixed;
    cout << "\nMatriz:\n";
    for( int i = 0; i < fil; i++){
        for( int j = 0; j < col; j++){
            cout << M[i][j] << " ";
        }
        cout << "| " << v[i] << "\n";
    }
    cout << "\n";
}
 
void imprimirSolucion( double v[], int fil )
{
    cout << "\nSolucion: ";
    for( int i = 0; i < fil; i++ )
        cout << "\nX" << i + 1 << ": " << v[i];
 
    cout << endl;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Enrique
Val: 4
Ha disminuido su posición en 5 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con eliminacion gaussiana con pivoteo escalado

Publicado por Enrique (2 intervenciones) el 02/04/2019 02:19:28
Gracias por la ayuda. Una pregunta, como lo cambio a lenguaje C?
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
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++

Ayuda con eliminacion gaussiana con pivoteo escalado

Publicado por Alfil (1444 intervenciones) el 02/04/2019 23:49:50
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void allocMatrix(double ***matrix, int fil, int col);
void deallocMatrix(double **matrix, int fil );
void leerDatos( double **A, int fil, int col, double B[] );
void gaussEliminacion( double **A, int fil, int col, double v[] );
void intercambiarFilas( double **A, int col, int k, int max );
void imprimirMatriz( double **A, int fil, int col, double v[] );
void imprimirSolucion( double v[], int fil );
 
int main()
{
    int fil, col;
 
    printf( "\nNumero de variables: " );
    scanf( "%d", &fil );
 
    col = fil;
 
    double** A = NULL;
    allocMatrix(&A, fil, col);
 
    double B[fil];
 
    leerDatos( A, fil, col, B );
    imprimirMatriz( A, fil, col, B );
    gaussEliminacion( A, fil, col, B );
 
    deallocMatrix( A, fil );
 
    return 0;
}
 
void allocMatrix(double ***matrix, int fil, int col )
{
    *matrix = (double **)malloc(sizeof(double *) * fil);
    for( int i = 0; i < col; i++){
        *(*matrix + i) = (double *)malloc(sizeof(double) * col);
    }
}
 
void deallocMatrix(double **matrix, int fil )
{
    int i = 0;
    for(i = 0; i < fil; i++){
        free(matrix[i]);
    }
    free(matrix);
}
 
void leerDatos( double **A, int fil, int col, double B[] )
{
    printf( "\nIntroduzca coeficientes de la ecuacion:\n" );
 
    for( int i = 0; i < fil; i++ ){
        printf( "\nFila %d:\n", i + 1 );
        for( int j = 0; j < col; j++ ) {
            printf( "Columna %d: ", j + 1 );
            scanf( "%lf", &A[i][j] );
        }
    }
 
    printf( "\nIntroduzca igualdad de la ecuacion:\n" );
    for( int i = 0; i < fil; i++ ){
        printf( "Fila %d: ", i + 1 );
        scanf( "%lf", &B[i] );
    }
}
 
void gaussEliminacion( double **A, int fil, int col, double B[] )
{
    int max;
    int N = fil;
    double factor, temp;
 
    for( int k = 0; k < N; k++ ){
        max = k;
        for( int i = k + 1; i < N; i++ )
            if( abs( A[i][k] ) > abs( A[max][k] ) )
                max = i;
 
        intercambiarFilas( A, col, k, max );
        temp = B[k];
        B[k] = B[max];
        B[max] = temp;
 
        for( int i = k + 1; i < N; i++ ) {
            factor = A[i][k] / A[k][k];
            B[i] -= factor * B[k];
 
            for( int j = k; j < N; j++ )
                A[i][j] -= factor * A[k][j];
 
        }
    }
    imprimirMatriz( A, fil, col, B );
 
    double solucion[fil];
    double suma;
 
    for( int i = 0; i < fil; i++ )
        solucion[i] = 0.00;
 
    for( int i = N - 1; i >= 0; i-- ){
 
        suma = 0.0;
 
        for( int j = i + 1; j < N; j++ )
            suma += A[i][j] * solucion[j];
 
        solucion[i] = (B[i] - suma) / A[i][i];
    }
    imprimirSolucion( solucion, fil );
 
}
 
void intercambiarFilas( double **M, int col, int k, int max )
{
    double temp[col];
 
    for( int i = k; i < col; i++ ) {
        temp[i] = M[k][i];
        M[k][i] = M[max][i];
        M[max][i] = temp[i];
    }
}
 
void imprimirMatriz( double **M, int fil, int col, double v[] )
{
    printf( "\nMatriz:\n" );
 
    for( int i = 0; i < fil; i++ ){
        for( int j = 0; j < col; j++ ){
            printf( "%.3lf ", M[i][j] );
        }
        printf( "| %.3lf\n", v[i] );
    }
    printf( "\n" );
}
 
void imprimirSolucion( double v[], int fil )
{
    printf( "\nSolucion: " );
 
    for( int i = 0; i < fil; i++ )
        printf( "\nX%d: %.3lf", i + 1, v[i] );
 
    printf( "\n" );
}
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

Ayuda con eliminacion gaussiana con pivoteo escalado

Publicado por Guillem S (1 intervención) el 13/05/2022 17:55:42
Muchas gracias jefe/jefa por el codigo :)
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