int main() { double **M; //Guardar los coeficientes del sistema de ecuaciones int i,n,iter; puts("Programa para resolver un sistema de ecuaciones algebraicas lineales simultaneas"); puts("\t\t\tpor el metodo de Gauss-Seidel"); do { printf("\nNumero de ecuaciones [2-10]: "); scanf("%d",&n); } while (n<2 || n>10); M=(double**)calloc(n,sizeof(double*)); for (i=0;i<n;i++) M[i]=(double*)calloc(n+1,sizeof(double)); ingresarCoeficientes(M,n); mostrarSistemaEcuaciones(M,n); printf("Numero de iteraciones que desea realizar: "); scanf("%d",&iter); gaussSeidel(M,n,iter); return 0; }
int main() { initialize(); boundaries(); gaussSeidel(); printToFile(); }
int main(int argc, char const *argv[]) { int answer; /* enterCoefficients(5); */ /* enterIndTerm(5); */ printf("Resolve with Gauss-Jordan (1) or Gauss-Seidel (2)?\n"); printf("Answer (1/2): \n"); scanf("%d", &answer); if(answer == 1) { /* Primera opción: algoritmo de Gauss-Jordan */ gaussJordan(); } else if(answer == 2){ /* Segunda opción: algoritmo de Gauss-Seidel */ gaussSeidel(); } return 0; }
int main () { int numLinhas, numColunas; printf ("Escolha o tamanho da matriz esparsa (MxN) > "); scanf ("%d %d", &numLinhas, &numColunas); if (numLinhas <= 0 || numColunas <= 0) { fprintf (stderr, "Matriz não pode ter dimensão menor que 1\n"); return -1; } matrizEsparsa *mat = criaMatrizEsparsa (numLinhas, numColunas); int opcao, y, x, ret; double valor; double det; do { menu (); scanf ("%d", &opcao); switch (opcao) { case 1: printf ("Escolha a posição da matriz a ser consultada (MxN) > "); scanf ("%d %d", &y, &x); ret = consultaValor (mat, y, x); if (ret != ERRO) { printf ("Matriz[%d][%d] = %d\n", y, x, ret); } break; case 2: printf ("Escolha o valor a ser inserido > "); scanf ("%lf", &valor); printf ("Escolha em que posição da matriz o valor será inserido (MxN) > "); scanf ("%d %d", &y, &x); if (insereValor (mat, y, x, valor) != ERRO) { printf ("Valor %6.3lf inserido em %dx%d\n", valor, y, x); } break; case 3: printf ("Escolha a linha a ser somada > "); scanf ("%d", &y); ret = somaLinha (mat, y); if (ret != ERRO) { printf ("Soma da linha %d = %d\n", y, ret); } break; case 4: printf ("Escolha a coluna a ser somada > "); scanf ("%d", &x); ret = somaColuna (mat, x); if (ret != ERRO) { printf ("Soma da coluna %d = %d\n", x, ret); } break; case 5: printMatriz (mat); break; case 6: det = determinante (mat); if (det != ERRO) { printf ("Determinante da matriz = %f", det); } break; case 7: gaussSeidel (mat); break; } puts (""); } while (opcao != 0); apagaMatrizEsparsa (mat); return 0; }
void stepSolution(char *stepType,GRID *g,SOLN *s,double dt,double *l2norm) { double coef; static int istep=0; int i,k,l; int nsubiter=20; double CFL; // create temp variable for CFL number CFL = g->CFL; if (strcmp(stepType,"euler")==0) { computeRHS(g,s,l2norm); coef = 1.0; updateSoln(s->q,s->q,s->r,s->sigma,dt,CFL,coef,g->ncells); } else if (strcmp(stepType,"rk3") == 0) { // RK step 1 computeRHS(g,s,l2norm); coef=0.25; updateSoln(s->q,s->qt,s->r,s->sigma,dt,CFL,coef,g->ncells); coef=8.0/15; updateSoln(s->q,s->q,s->r,s->sigma,dt,CFL,coef,g->ncells); // RK step 2 computeRHS(g,s,l2norm); coef=5.0/12; updateSoln(s->qt,s->q,s->r,s->sigma,dt,CFL,coef,g->ncells); // RK step 3 computeRHS(g,s,l2norm); coef=3.0/4.0; updateSoln(s->qt,s->q,s->r,s->sigma,dt,CFL,coef,g->ncells); } else if (strcmp(stepType,"ADI")==0) { computeRHSk(g,s,l2norm); ADI(g,s,s->cflnum,dt); } else if (strcmp(stepType,"DADI")==0) { computeRHSk(g,s,l2norm); DADI(g,s,s->cflnum,dt); } else if (strcmp(stepType,"Gauss-Seidel") == 0) { computeRHSkv(g,s,l2norm); gaussSeidel(g,s,s->cflnum,dt); } else if (strcmp(stepType,"line-Gauss-Seidel") == 0) { if (g->visc) computeRHSkv(g,s,l2norm); else computeRHSk(g,s,l2norm); lineGaussSeidel(g,s,s->cflnum,dt); } istep++; }
// Ajuste cuadrático ponderado a T original ajusteTemperaturaPlano * ajusteCuadraticoPlanoPonderado(distTempPlano * plano, int iteraciones, long double umbral, long double lambda_relax) { // Creación de estructura ajusteTemperaturaPlano *ajustePonderado =(ajusteTemperaturaPlano*)calloc(1,sizeof(ajusteTemperaturaPlano)); // Cálculo de coeficientes int N=plano->N; long double AA,BB,CC,DD,EE,FF,GG,HH,II; // AA=0.0, BB=0.0, CC=0.0, DD=0.0, EE=0.0, FF=0.0, GG=0.0, HH=0.0, II=0.0; int i=0,j=0,conteo=0; for(j=1;j<N-1;j++) { for(i=1;i<N-1;i++) { AA+=plano->T[i*N+j]; BB+=powl(plano->X[i],2)*plano->T[i*N+j]; CC+=powl(plano->Y[j],2)*plano->T[i*N+j]; DD+=plano->T[i*N+j]*plano->T[i*N+j]; EE+=powl(plano->X[i],4)*plano->T[i*N+j]; FF+=powl(plano->X[i],2)*powl(plano->Y[j],2)*plano->T[i*N+j]; GG+=plano->T[i*N+j]*powl(plano->X[i],2)*plano->T[i*N+j]; HH+=powl(plano->Y[j],4)*plano->T[i*N+j]; II+=plano->T[i*N+j]*powl(plano->Y[j],2)*plano->T[i*N+j]; conteo++; } } // Construyendo matriz //int iteraciones=100000; //long double umbral=0.1e-6; // Umbral en porcentaje // Creación de matriz A int orden=3; // Matriz de ajuste long double **A=(long double**)calloc(orden,sizeof(long double *)); for(i=0;i<orden;i++) A[i]=(long double *)calloc(orden,sizeof(long double)); // Llenado de A A[0][0]=AA; A[0][1]=BB; A[0][2]=CC; A[1][0]=BB; A[1][1]=EE; A[1][2]=FF; A[2][0]=CC; A[2][1]=FF; A[2][2]=HH; // Creación de B long double *B=(long double *)calloc(orden,sizeof(long double)); // Llenado de B B[0]=DD; B[1]=GG; B[2]=II; long double *X=gaussSeidel(A,B,orden,iteraciones,umbral,lambda_relax); ajustePonderado->a0=X[0]; ajustePonderado->a1=X[1]; ajustePonderado->a2=X[2]; ajustePonderado->paso=plano->paso; //Limpieza for(int i=orden-1;i>=0;--i) free(A[i]); free(A); free(B); free(X); return ajustePonderado; }
ajusteTemperaturaPlano * ajusteCuadraticoPlano(distTempPlano * plano, int iteraciones, long double umbral, long double lambda_relax) { // Creación de estructura ajusteTemperaturaPlano *ajuste =(ajusteTemperaturaPlano*)calloc(1,sizeof(ajusteTemperaturaPlano)); // Cálculo de coeficientes int N=plano->N; long double AA,BB,CC,DD,EE,FF,GG,HH,II; // AA=0.0, BB=0.0, CC=0.0, DD=0.0, EE=0.0, FF=0.0, GG=0.0, HH=0.0, II=0.0; int i=0,j=0,conteo=0; for(j=1;j<N-1;j++) { for(i=1;i<N-1;i++) { AA++; BB+=powl(plano->X[i],2); CC+=powl(plano->Y[j],2); DD+=plano->T[i*N+j]; EE+=powl(plano->X[i],4); FF+=powl(plano->X[i],2)*powl(plano->Y[j],2); GG+=plano->T[i*N+j]*powl(plano->X[i],2); HH+=powl(plano->Y[j],4); II+=plano->T[i*N+j]*powl(plano->Y[j],2); conteo++; } } // Construyendo matriz //int iteraciones=100000; //long double umbral=0.1e-6; // Umbral en porcentaje // Creación de matriz A int orden=3; // Matriz de ajuste long double **A=(long double**)calloc(orden,sizeof(long double *)); for(i=0;i<orden;i++) A[i]=(long double *)calloc(orden,sizeof(long double)); // Llenado de A A[0][0]=AA; A[0][1]=BB; A[0][2]=CC; A[1][0]=BB; A[1][1]=EE; A[1][2]=FF; A[2][0]=CC; A[2][1]=FF; A[2][2]=HH; // Creación de B long double *B=(long double *)calloc(orden,sizeof(long double)); // Llenado de B B[0]=DD; B[1]=GG; B[2]=II; long double *X=gaussSeidel(A,B,orden,iteraciones,umbral,lambda_relax); /*printf("Soluciones\n"); printf("a0=%Lf\n",X[0]); printf("a1=%Lf\n",X[1]); printf("a2=%Lf\n",X[2]);*/ /*FILE *archivo; archivo = fopen("Ajuste cuadratico.csv","w"); fprintf(archivo, "Coeficiente,Valor,\n"); for(i=0;i<3;i++) { fprintf(archivo, "a %i,%.15Le,\n",i,X[i]); } fclose(archivo);*/ ajuste->a0=X[0]; ajuste->a1=X[1]; ajuste->a2=X[2]; ajuste->paso=plano->paso; //Limpieza for(int i=orden-1;i>=0;--i) free(A[i]); free(A); free(B); free(X); return ajuste; }
void stepSolution(char *stepType,GRID *g,SOLN *s,double dt,double *l2norm, double *linfnorm, int myid) { double coef; static int istep=0; int i,k,l; int nsubiter=20; double CFL; CFL=g->CFL; if (strcmp(stepType,"euler")==0) { communication(g,s,myid); if(g->visc) { computeRHSv(g,s,l2norm,linfnorm,myid); } else { computeRHS(g,s,l2norm,linfnorm,myid); } coef=1.0; updateSoln(s->q,s->q,s->r,s->sigma,dt,CFL,coef,g->ncells); } else if (strcmp(stepType,"rk3") == 0){ /* RK step 1 */ communication(g,s,myid); computeRHS(g,s,l2norm,linfnorm,myid); coef=0.25; updateSoln(s->q,s->qt,s->r,s->sigma,dt,CFL,coef,g->ncells); coef=8.0/15; updateSoln(s->q,s->q,s->r,s->sigma,dt,CFL,coef,g->ncells); /* RK step 2 */ communication(g,s,myid); computeRHS(g,s,l2norm,linfnorm,myid); coef=5.0/12; updateSoln(s->qt,s->q,s->r,s->sigma,dt,CFL,coef,g->ncells); /* RK step 3 */ communication(g,s,myid); computeRHS(g,s,l2norm,linfnorm,myid); coef=3.0/4.0; updateSoln(s->qt,s->q,s->r,s->sigma,dt,CFL,coef,g->ncells); } else if (strcmp(stepType,"ADI")==0){ // communication communication(g,s,myid); computeRHSk(g,s,l2norm,linfnorm,myid); ADI(g,s,s->cflnum,dt,myid); } else if (strcmp(stepType,"DADI")==0){ // communication communication(g,s,myid); computeRHSk(g,s,l2norm,linfnorm,myid); DADI(g,s,s->cflnum,dt,myid); } else if (strcmp(stepType,"Gauss-Seidel") == 0) { // communication communication(g,s,myid); computeRHSkv(g,s,l2norm,myid); gaussSeidel(g,s,s->cflnum,dt,myid); } else if (strcmp(stepType,"line-Gauss-Seidel") == 0) { // communication communication(g,s,myid); if (g->visc) { computeRHSkv(g,s,l2norm,myid); } else { computeRHSk(g,s,l2norm,linfnorm,myid); } lineGaussSeidel(g,s,s->cflnum,dt,myid); } istep++; }