Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 4
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;
}
Esempio n. 5
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;
}
Esempio n. 8
0
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++;
}