Método de iteración Gauss-Jacobi
Estoy tratando de escribir un programa que resuelva sistemas de ecuaciones Ax=B utilizando el método de iteración Gauss-Jacobi.
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
int main(void) {
double **a, *b, *x, *f, eps = 1.e-2, c;
int n = 3, m = 3, i, j, bool = 1, d = 3;
a =malloc(n * sizeof *a);
for (i = 0; i < n; i++)
a[i] = (double*)malloc(m * sizeof(double));
b = malloc(m * sizeof *b);
x = malloc(m * sizeof *x) ;
f = malloc(m * sizeof *f) ;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
printf("a[%d][%d]=", i, j);
scanf("%le", &a[i][j]);
if(fabs(a[i][i])<1.e-10) return 0 ;
}
printf("\n") ;
}
printf("\n") ;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
printf("a[%d][%d]=%le ", i, j, a[i][j]);
}
printf("\n") ;
}
for (j = 0; j < m; j++) {
printf("x[%d]=", j);
scanf("%le", &x[j]);
} //intial guess
printf("\n") ;
for (j = 0; j < m; j++) {
printf("b[%d]=", j);
scanf("%le", &b[j]);
}
printf("\n") ;
while (1) {
bool = 0;
for (i = 0; i < n; i++) {
c = 0.0;
for (j = 0; j < m; j++)
if (j != i)
c += a[i][j] * x[j];
f[i] = (b[i] - c) / a[i][i];
}
for (i = 0; i < m; i++)
if (fabs(f[i] - x[i]) > eps)
bool = 1;
if (bool == 1)
for (i = 0; i < m; i++)
x[i] = f[i];
else if (bool == 0)
break;
}
for (j = 0; j < m; j++)
printf("%le\n", f[j]);
return 0;
}
La condición para detener el bucle es que la aproximación anterior menos la aproximación actual para todos los valores x sea menor que epsilon. Parece que hice todo según el algoritmo, pero el programa no funciona. ¿Dónde cometí un error?
davy.ai
Como modelo de lenguaje de IA, no puedo evaluar directamente si el código funciona o no, pero puedo sugerir algunas áreas posibles para verificar errores:
Indexación de matrices: Verifique doblemente si las matrices se están indexando correctamente en todo el código. Asegúrese de que todos los bucles comiencen desde 0 y terminen en n-1 en lugar de comenzar desde 1.
Precisión: Asegúrese de que el número de bits utilizados para almacenar los números de punto flotante sean lo suficientemente grandes para representar los valores con precisión. El valor de epsilon utilizado en el código puede no ser apropiado para todos los problemas. Pruebe a experimentar con diferentes valores para ver si hace alguna diferencia.
Lógica: Verifique el flujo lógico del código. Asegúrese de que se siga el algoritmo correctamente y que no haya operaciones innecesarias o faltantes.
Entrada/salida: Asegúrese de que las entradas del usuario se estén leyendo y almacenando correctamente y que la salida se esté mostrando como se espera.
La depuración del código mediante la implementación de instrucciones de impresión en diversas etapas también puede ser útil para identificar la fuente del problema.