Título: problemas en el caso 2 Publicado por: fernando27 en 29 Noviembre 2015, 02:58 am 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[10][j]=0.4; t=(j+1)*k; a[10-i][0]=a
fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a
a
a[10][j]=0.4; t=(j+1)*k; zzz=a[10-i][0]; diferencia=fabs(zzz-a
fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a
zzz=a[10-i][0]; diferencia=fabs(zzz-a
fprintf(f1," %d %d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f \n", i,0,x,0.0,a
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 fprintf(f1, "a[%d][%d]= %6.4f \n",l,j+1,a 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); } Título: Re: problemas en el caso 2 Publicado por: class_OpenGL en 29 Noviembre 2015, 03:49 am 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!! Código
La llave tienes que ponerla antes de comentar, no después: Código
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! Título: Re: problemas en el caso 2 Publicado por: class_OpenGL en 29 Noviembre 2015, 03:57 am Por si alguien quiere analizar mejor el código:
Código
|