Autor
|
Tema: problemas en el caso 2 (Leído 1,684 veces)
|
fernando27
Desconectado
Mensajes: 1
|
buenas, alguien podria ayudarme a solucionar un inconveniente que tengo al momento de querer obtener los valores del caso 2(los del caso 1 si se obtienen). el problema se puede ejecutar... gracias... #include <stdio.h> #include <math.h> #include <stdlib.h> #include <iostream.h> #include <conio.h> #define Pi 3.141592653589 using namespace std; ///funcion u(x,t) aproximada long double U(double x, double t) { long double z; int i; z=0; for (i=1;i<20;i++) z = z+2/(Pi*Pi)*1/(i*i)*(4*sin(Pi*i/2)+i*Pi*(1-cos(i*Pi)))*sin(i*Pi*x)*exp(-Pi*Pi*t*i*i); return(z);} ///////fin funcion aproximada int main () { int opc; float y,q; do { system("cls"); cout<<"menu\n"; cout<<"1. Metodo Explicito\n"; cout<<"2. MEtodo Implicito\n"; cout<<"\t\t elija su opcion:"; cin>> opc; switch(opc) {case 1:{system("cls"); cout<<"Metodo Explicito\n"; cout<<"\t\t digite un valor para r :"; cin>>y; FILE *f; f=fopen ("explicito020.txt","w+"); int i,j,N,T,l,c; float s1,s2,s3,r,h,k,x,t,error,diferencia; float zz; float u[11][101]; r=y; h=0.1; k=r*h*h; N=10; T=50; fprintf(f,"r=%4.2f,h=%4.2f,k=%6.4f \n ",r,h,k); fprintf(f,"i j x t U[xi,yj] U[x,y] diferencia error \n "); printf("i j x t U[xi,yj] U[x,y] diferencia error \n "); for (l=0;l<=N+1;l++) //valores de U con las condiciones iniciales{ x=l*h; if ((x>=0 ) & (x<= 0.5)){ u[l][0]=2*x+1; fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n ",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); }//fin del if if ((x>0.5 ) & (x<=1)){ u[l][0]=3-2*x; fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n ",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); } //fin del if } //fin del for fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); for(j=0;j<=100;j++){ u[0][j]=0.2; u[10][j]=0.4; t=(j+1)*k; for (i=0;i<N+1;i++){ if ((i==0) || (i==10)) {x=i*h; fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",i,j+1,x,t,u [j],u[j],0.0,0.0); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",i,j+1,x,t,u[j],u[j],0.0,0.0);} else{ x=i*h; t=(j+1)*k; s1=u[i-1][j]; s2=u[j]; s3=u[i+1][j]; u[j+1]=r*s1+(1-2*r)*s2+r*s3; zz=U(x,t); diferencia=fabs(zz-u[j+1]); error=fabs((u[j+1]-zz)/zz)*100; fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",i,j+1,x,t,u[j+1],zz,diferencia,error); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",i,j+1,x,t,u[j+1],zz,diferencia,error);}} // fin del for i}//fin del for j fclose(f); printf("fin del programa"); while((c = getchar()) != '\n' && c != EOF); putchar( c ); break; }case 2:{system("cls"); cout<<"Metodo Implicito\n"; cout<<"\t\t digite un valor para r :"; cin>>q; int i,j,c,l,s; FILE *f1,*f; int N=5; float r=q; float h=0.1; float k=r*h*h; float a[20][20],b[20][20],A[20],B[20],x,xx,diferencia,error,t,zzz; f=fopen("implicito070.txt","w+"); fprintf(f1,"PARA EL CASO IMPLICITO CRANCK NICHOLSON BVP \n"); fprintf(f1,"r=%3.2f, h=%3.2f,k=%5.3f \n",r,h,k); fprintf(f1," i j x t U[i,j] Uanalitica diferencia error \n"); printf("PARA EL CASO IMPLICITO CRANCK NICHOLSON BVP r=%3.2f, h=%3.2f\n",r,h); printf(" i j x t U[i,j] Uanalitica diferencia error \n"); for (i=0;i<=2*N+1;i++) { x=i*h; if ((x>=0 ) & (x<=0.5)) { a a[0][j]=0.2; a[10][j]=0.4; t=(j+1)*k; a[10-i][0]=azzz=adiferencia=fabs(zzz-aerror=0; fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,aprintf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a- ,zzz,diferencia,error);}//fin del if
if ((x>0.5 ) & (x<1)){ a a[0][j]=0.2; a[10][j]=0.4; t=(j+1)*k; zzz=a[10-i][0]; diferencia=fabs(zzz-aerror=diferencia/zzz*100; fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,aprintf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a- ,zzz,diferencia,error);}//fin del if
if (x==1){ zzz=a[10-i][0]; diferencia=fabs(zzz-aerror=0; fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,aprintf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a- ,zzz,diferencia,error);}}///fin del for i para llenarlos valores iniciales
for (j=0; j<20;j++) { for (i=1;i<N+1;i++) { if (i==1) { b=4.0; b[i+1]=-1; ///rellena de ceros el lado derecho for (l=i+2;l<N+1;l++){ b[l]=0.0;} b[N+1]= (2-2*r)*a[j]+r*a[i+1][j]; printf("\n"); fprintf(f,"\n"); } if ((i>1) && (i!=N)) { if(i>2) { ///rellena de ceros el lado izquierdo for (l=1;l<i-1;l++){ b[l]=0.0;}} b[i-1]=-1; b=4.0; b[i+1]=-1; for (l=i+2;l<N+1;l++){ b[l]=0.0;} b[N+1]= r*a[i-1][j]+(2-2*r)*a[j]+r*a[i+1][j]; }//fin del if i>1 if (i==N){ for (l=1;l<i-1;l++){ b[l]=0.0;} b[N-1]=-2.0*r; b[N]=(2+2*r); b[N+1]= r*a[i-1][j]+(2-2*r)*a[j]+r*a[i+1][j]; //a[i-1][j]+a[i+1][j]; printf("\n"); } }///fin del for I=1,N printf("\n"); ////METODO GAUSS SIN PIVOTEO-METOD PROGONKA//// ///apli-camos progonka directa/// A[1]=-b[1][2]/b[1][1]; B[1]=b[1][N+1]/b[1][1]; for (i=2;i<N+1;i++){ if (i!= N){ A=-b[i+1]/(b+b[i-1]*A[i-1]);} B=(b[N+1]-b[i-1]*B[i-1])/(b+b[i-1]*A[i-1]);} //ahora hallamos las soluciones //printf(”\n”); xx=B[N]; //las soluciones son los elementos del vector a[j] a[N][j+1]=xx; printf( "a[%d][%d]= %6.4f \n",N,j+1,a[N][j+1]); l=N; while (l>0) { s=10-l; xx=A[l]*xx+B[l]; a[l][j+1]=xx; a[j+1]=xx; fprintf(f1, "a[%d][%d]= %6.4f \n",l,j+1,a[j+1]); printf( "a[%d][%d]= %6.4f \n",l,j+1,a[l][j+1]); l=l-1;} printf("\n"); t=k*(j+1); for (i=0;i<2*N+1;i++) //ahora escribe las soluciones en el archivo de texto{ x=i*h; if ((i==0) || (i==2*N)){ printf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,j+1,x,t,0.0,0.0,0.0,0.0); fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,j+1,x,t,0.0,0.0,0.0,0.0);} else { zzz=U(x,t); diferencia=fabs(zzz-a[j+1]); error=diferencia/zzz*100; fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,j+1,x,t,a[j+1],zzz,diferencia,error); printf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,j+1,x,t,a[j+1],zzz,diferencia,error);}}}//fin del j principal fclose(f); fclose(f1); while((c = getchar()) != '\n' && c != EOF); break;}}; }while(opc<=2); }
|
|
« Última modificación: 29 Noviembre 2015, 03:09 am por fernando27 »
|
En línea
|
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
0º Utiliza las etiquetas GeSHI para que tu código sea más legible! 1º Error que he encontrado (en el caso 1): El ciclo for lo cierras, pero no lo abres!! for (l=0;l<=N+1;l++) //valores de U con las condiciones iniciales{ // Codigo del for } //fin del for
La llave tienes que ponerla antes de comentar, no después: for (l=0;l<=N+1;l++) { //valores de U con las condiciones iniciales // Codigo del for } //fin del for
2º Error que he encontrado (en el caso 2): Es similar al primer error que te he comentado No te puedo especificar en que línea es porque no usas las etiquetas GeSHI. Después de haber corregido estos errores, tienes muchos erres de conversión (fundamentalmente de array bidimensional a flotante) Además, no existe el archivo <iostream.h> Los archivos nativos de C++ no tienen extensión (sería <iostream> Para incluir archivos de C, se recomienda usar las versiones de C++ (por ejemplo, para incluir "stdlib.h" incluirías "cstdlib") No puedo analizar mucho tu código porque está muy enrevesado (las variables no tienen nombres descriptivos, usas "fórmulas" muy largas, sentencias muy largas...) En resumen: ¡Ten cuidado con las llaves y con la asignación!
|
|
« Última modificación: 29 Noviembre 2015, 03:59 am por class_OpenGL »
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
Por si alguien quiere analizar mejor el código: #include <stdio.h> #include <math.h> #include <stdlib.h> #include <iostream> #include <conio.h> using namespace std; #define Pi 3.141592653589 long double U(double x, double t) { long double z; int i; z=0; for (i=1;i<20;i++) z = z+2/(Pi*Pi)*1/(i*i)*(4*sin(Pi*i/2)+i*Pi*(1-cos(i*Pi)))*sin(i*Pi*x)*exp(-Pi*Pi*t*i*i); return(z); } int main() { int opc; float y,q; do { system("cls"); cout<<"menu\n"; cout<<"1. Metodo Explicito\n"; cout<<"2. MEtodo Implicito\n"; cout<<"\t\t elija su opcion:"; cin>> opc; switch(opc) { case 1: { FILE *f; int i,j,N,T,l,c; float s1,s2,s3,r,h,k,x,t,error,diferencia; float zz; float u[11][101]; system("cls"); cout<<"Metodo Explicito\n"; cout<<"\t\t digite un valor para r :"; cin>>y; f=fopen("explicito020.txt","w+"); r=y; h=0.1; k=r*h*h; N=10; T=50; fprintf(f,"r=%4.2f,h=%4.2f,k=%6.4f \n ",r,h,k); fprintf(f,"i j x t U[xi,yj] U[x,y] diferencia error \n "); printf("i j x t U[xi,yj] U[x,y] diferencia error \n "); for(l=0;l<=N+1;l++) //valores de U con las condiciones iniciales{ x=l*h; if ((x>=0 ) & (x<= 0.5)) { u[l][0]=2*x+1; fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n ",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); }//fin del if if ((x>0.5 ) & (x<=1)){ u[l][0]=3-2*x; fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n ",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); } //fin del if } //fin del for fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",l,0,x,0.0,u[l][0],u[l][0],0.0,0.0); for(j=0;j<=100;j++) { u[0][j]=0.2; u[10][j]=0.4; t=(j+1)*k; for (i=0;i<N+1;i++) { if ((i==0) || (i==10)) { x=i*h; fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",i,j+1,x,t,u[j],u[j],0.0,0.0); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",i,j+1,x,t,u[j],u[j],0.0,0.0); } else { x=i*h; t=(j+1)*k; s1=u[i-1][j]; s2=u[j]; s3=u[i+1][j]; u[j+1]=r*s1+(1-2*r)*s2+r*s3; zz=U(x,t); diferencia=fabs(zz-u[j+1]); error=fabs((u[j+1]-zz)/zz)*100; fprintf(f,"%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",i,j+1,x,t,u[j+1],zz,diferencia,error); printf("%d %d %5.3f %5.3f %6.4f %6.4f %6.4f %6.4f \n",i,j+1,x,t,u[j+1],zz,diferencia,error); } } } // fin del for i}//fin del for j fclose(f); printf("fin del programa"); while((c = getchar()) != '\n' && c != EOF); putchar(c); break; } case 2: { int i,j,c,l,s; FILE *f1,*f; int N=5; float r=q; float h=0.1; float k=r*h*h; float a[20][20],b[20][20],A[20],B[20],x,xx,diferencia,error,t,zzz; system("cls"); cout<<"Metodo Implicito\n"; cout<<"\t\t digite un valor para r :"; cin>>q; f=fopen("implicito070.txt","w+"); fprintf(f1,"PARA EL CASO IMPLICITO CRANCK NICHOLSON BVP \n"); fprintf(f1,"r=%3.2f, h=%3.2f,k=%5.3f \n",r,h,k); fprintf(f1," i j x t U[i,j] Uanalitica diferencia error \n"); printf("PARA EL CASO IMPLICITO CRANCK NICHOLSON BVP r=%3.2f, h=%3.2f\n",r,h); printf(" i j x t U[i,j] Uanalitica diferencia error \n"); for (i=0;i<=2*N+1;i++) { x=i*h; if((x>=0 ) & (x<=0.5)) { a=2*x+1; a[0][j]=0.2; a[10][j]=0.4; t=(j+1)*k; a[10-i][0]=a; zzz=a; diferencia=fabs(zzz-a); error=0; fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a ,zzz,diferencia,error); printf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a ,zzz,diferencia,error); } //fin del if if ((x>0.5 ) & (x<1)){ a=3-2*x; a[0][j]=0.2; a[10][j]=0.4; t=(j+1)*k; zzz=a[10-i][0]; diferencia=fabs(zzz-a); error=diferencia/zzz*100; fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a ,zzz,diferencia,error); printf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a ,zzz,diferencia,error); }//fin del if if (x==1){ zzz=a[10-i][0]; diferencia=fabs(zzz-a); error=0; fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a ,zzz,diferencia,error); printf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a ,zzz,diferencia,error); } } // fin del for i para llenarlos valores iniciales for (j=0; j<20;j++) { for (i=1;i<N+1;i++) { if (i==1) { b=4.0; b[i+1]=-1; //rellena de ceros el lado derecho for (l=i+2;l<N+1;l++) { b[l]=0.0; } b[N+1]= (2-2*r)*a[j]+r*a[i+1][j]; printf("\n"); fprintf(f,"\n"); } if ((i>1) && (i!=N)) { if(i>2) { //rellena de ceros el lado izquierdo for (l=1;l<i-1;l++) { b[l]=0.0; } } b[i-1]=-1; b=4.0; b[i+1]=-1; for (l=i+2;l<N+1;l++){ b[l]=0.0; } b[N+1]= r*a[i-1][j]+(2-2*r)*a[j]+r*a[i+1][j]; }//fin del if i>1 if (i==N) { for (l=1;l<i-1;l++) { b[l]=0.0; } b[N-1]=-2.0*r; b[N]=(2+2*r); b[N+1]= r*a[i-1][j]+(2-2*r)*a[j]+r*a[i+1][j]; //a[i-1][j]+a[i+1][j]; printf("\n"); } }///fin del for I=1,N printf("\n"); //METODO GAUSS SIN PIVOTEO-METOD PROGONKA//// //apli-camos progonka directa/// A[1]=-b[1][2]/b[1][1]; B[1]=b[1][N+1]/b[1][1]; for (i=2;i<N+1;i++) { if (i!= N) { A=-b[i+1]/(b+b[i-1]*A[i-1]); } B=(b[N+1]-b[i-1]*B[i-1])/(b+b[i-1]*A[i-1]); } //ahora hallamos las soluciones //printf(ΓÇ¥\nΓÇ¥); xx=B[N]; //las soluciones son los elementos del vector a[j] a[N][j+1]=xx; printf( "a[%d][%d]= %6.4f \n",N,j+1,a[N][j+1]); l=N; while (l>0) { s=10-l; xx=A[l]*xx+B[l]; a[l][j+1]=xx; a[j+1]=xx; fprintf(f1, "a[%d][%d]= %6.4f \n",l,j+1,a[j+1]); printf( "a[%d][%d]= %6.4f \n",l,j+1,a[l][j+1]); l=l-1; } printf("\n"); t=k*(j+1); for (i=0;i<2*N+1;i++) //ahora escribe las soluciones en el archivo de texto{ x=i*h; if ((i==0) || (i==2*N)) { printf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,j+1,x,t,0.0,0.0,0.0,0.0); fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,j+1,x,t,0.0,0.0,0.0,0.0); } else { zzz=U(x,t); diferencia=fabs(zzz-a[j+1]); error=diferencia/zzz*100; fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,j+1,x,t,a[j+1],zzz,diferencia,error); printf(" %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,j+1,x,t,a[j+1],zzz,diferencia,error); } } }//fin del j principal fclose(f); fclose(f1); while((c = getchar()) != '\n' && c != EOF); break; } }; } while(opc<=2); return 0; }
|
|
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
|
|