Está en la página 1de 5

Mtodo de Crank-Nicholson para la ecuacin de

calor dependiente del tiempo


Fsica Computacional

Cdigo del programa


#include <math.h>
#include <stdio.h>
//definimos la condicin inicial
#define f(x) exp(x)
//definimos condiciones de frontera
#define g1(t) (exp(t))
#define g2(t) (exp(t)*(1-t*t))
#define Nmax 100;

//subrutina multiplicacin de matrices


void LU(int n, double a[], double e[], double c[], double b[], double x[]) {
double w[n+2],u[n+2],y[n+2]; long i;
w[0]=a[0];
for(i=0;i<=n-2;i++){
u[i]=e[i]/w[i];
w[i+1]=a[i+1]-c[i+1]*u[i];
}
y[0]=b[0]/w[0];
for(i=0;i<=n-2;i++){
y[i+1]=b[i+1]/w[i+1]-c[i+1]*y[i]/w[i+1];
}
x[n-1]=y[n-1];
for(i=n-2;i>=0;i--){
1

x[i]=y[i]-u[i]*x[i+1];
}
}
main(){
FILE *ca = fopen("calorp3c.txt", "w");
//declaramos las variables
double x, t, h = 0.01, g = 1;
double k = g*h*h;
long n = Nmax;
long m = 1/k+1;
int i, j;
double u0[n+1],u1[n+1],a1[n+1],e1[n+1],c1[n+1],b0[n+1],x1[n+1];
//inicializamos los tres arreglos de nuestra matriz diagonal
for(i=0;i<=n-2;i++){
a1[i]=2.0*(1.0+g);
a1[n-1]=0;
a1[n]=0;
}
for(i=0;i<=n-3;i++){
e1[i]=-g;
e1[n-2]=0;
e1[n-1]=0;
}
c1[0]=0;
for(i=1;i<=n-2;i++){
c1[i]=-g;
c1[n-1]=0;
c1[n]=0;
}
2

//aplicamos nuestra condicin inicial


for(t=0.0,i=0;i<=n;i++){
x=i*h; u0[i]=f(x);
}
//imprimimos los valores a un tiempo t = 0
for(i=0;i<=n;i++){
fprintf(ca,"%lf %lf %lf\n",h*i,0.0,u0[i]);
fprintf(ca,"\n");
}
for(j=1;j<=m;j++){
t = j*k;
//nuestras condiciones de frontera las llenamos en el arreglo b
for(i=0;i<n-2;i++){
b0[i]=0.0;
b0[n-2]=g*g2(t);
}
for(i=1;i<n-2;i++){
b0[i]+=g*(u0[i+2]+u0[i])+2*(1-g)*u0[i+1];
}
//resolvemos para cada paso
LU(n-1,a1,e1,c1,b0,u1);
//recorremos los valores
u0[0]=4.0*u1[0]/3.0-u1[1]/3.0;
u0[n]=g2(t);
for(i=1;i<=n-1;i++){
u0[i]=u1[i-1];
}
//imprimimos los resultados
if(j%1==0){
for(i=0;i<=n;i++){
3

fprintf(ca,"%lf %lf %lf\n",h*i,t,u0[i]);


}
fprintf(ca,"\n");
}

}
fclose(ca);
}

Resultados
Las grficas de los resultados obtenidos son las siguientes

Conclusiones
El mtodo de Crank-Nicholson es un mtodo recurrente para resolver
ecuaciones diferenciales parciales de segundo orden, tales como en este caso la
ecuacin de calor, ya que tiene un bajo costo computacional (en tiempo y
memoria).
En nuestro caso, notamos que la barra inicia con una condicin inicial
impuesta la cual va evolucionando, debido a las condiciones de frontera, hasta
alcanzar un estado estacionario, en el cual toda la barra tiene la misma
temperatura que el lado derecho de la misma.