Forward difference method for heat equation

ahmedo047
Messages
5
Reaction score
3
I don't be able to convert the following code(HEAT EQUATION BACKWARD-DIFFERENCE ALGORITHM in the Burden-faires numerical analysis book).I need HEAT EQUATION FORWARD-DIFFERENCE ALGORITHM C like following code.I don't be able to convert FORWARD-DIFFERENCE the following code .Please help me.

Code:
/*
*   HEAT EQUATION BACKWARD-DIFFERENCE ALGORITHM 12.2
*
*   To approximate the solution to the parabolic partial-differential
*   equation subject to the boundary conditions
*                  u(0,t) = u(l,t) = 0, 0 < t < T = max t,
*   and the initial conditions
*                  u(x,0) = F(x), 0 <= x <= l:
*
*   INPUT:   endpoint l; maximum time T; constant ALPHA; integers m, N.
*
*   OUTPUT:  approximations W(I,J) to u(x(I),t(J)) for each
*            I = 1, ..., m-1 and J = 1, ..., N.
*/

#include<stdio.h>
#include<math.h>
#define pi 4*atan(1)
#define true 1
#define false 0

double F(double X);
void INPUT(int *, double *, double *, double *, int *, int *);
void OUTPUT(double, double, int, double *, double);

main()
{
   double W[25], L[25], U[25], Z[25];
   double FT,FX,ALPHA,H,K,VV,T,X;
   int N,M,M1,M2,N1,FLAG,I1,I,J,OK;

   INPUT(&OK, &FX, &FT, &ALPHA, &N, &M);
   if (OK) {
      M1 = M - 1;
      M2 = M - 2;
      N1 = N - 1;
      /* STEP 1 */
      H = FX / M;
      K = FT / N;
      VV = ALPHA * ALPHA * K / ( H * H );
      /* STEP 2 */
      for (I=1; I<=M1; I++) W[I-1] = F( I * H );
      /* STEP 3 */
      /* STEPS 3 through 11 solve a tridiagonal linear system
         using Algorithm 6.7 */
      L[0] = 1.0 + 2.0 * VV;
      U[0] = -VV / L[0];
      /* STEP 4 */
      for (I=2; I<=M2; I++) {
         L[I-1] = 1.0 + 2.0 * VV + VV * U[I-2];
         U[I-1] = -VV / L[I-1];
      } 
      /* STEP 5 */
      L[M1-1] = 1.0 + 2.0 * VV + VV * U[M2-1];
      /* STEP 6 */
      for (J=1; J<=N; J++) {
         /* STEP 7 */
         /* current t(j) */
         T = J * K;
         Z[0] = W[0] / L[0];
         /* STEP 8 */
         for (I=2; I<=M1; I++)
            Z[I-1] = ( W[I-1] + VV * Z[I-2] ) / L[I-1];
         /* STEP 9 */
         W[M1-1] = Z[M1-1];
         /* STEP 10 */
         for (I1=1; I1<=M2; I1++) {
            I = M2 - I1 + 1;
            W[I-1] = Z[I-1] - U[I-1] * W[I];
         } 
      }
      /* STEP 11 */
      OUTPUT(FT, X, M1, W, H);
   }
   /* STEP 12 */
   return 0;
}

/* Change F for a new problem */
double F(double X)
{
   double f;

   f =  sin(pi * X);
   return f;
}

void INPUT(int *OK, double *FX, double *FT, double *ALPHA, int *N, int *M)
{
   int FLAG;
   char AA;

   printf("This is the Backward-Difference Method for Heat Equation.\n");
   printf("Has the function F been created immediately\n");
   printf("preceding the INPUT procedure? Answer Y or N.\n");
   scanf("\n%c", &AA);
   if ((AA == 'Y') || (AA == 'y')) {
      printf("The lefthand endpoint on the X-axis is 0.\n");
      *OK =false;
      while (!(*OK)) {
         printf("Input the righthand endpoint on the X-axis.\n");
         scanf("%lf", FX);
         if (*FX <= 0.0)
            printf("Must be positive number.\n");
         else *OK = true;
      } 
      *OK = false;
      while (!(*OK)) {
         printf("Input the maximum value of the time variable T.\n");
         scanf("%lf", FT);
         if (*FT <= 0.0)
            printf("Must be positive number.\n");
         else *OK = true;
      } 
      printf("Input the constant alpha.\n");
      scanf("%lf", ALPHA);
      *OK = false;
      while (!(*OK)) {
         printf("Input integer m = number of intervals on X-axis\n");
         printf("and N = number of time intervals - separated by a blank.\n");
         printf("Note that m must be 3 or larger.\n");
         scanf("%d %d", M, N);
         if ((*M <= 2) || (*N <= 0))
            printf("Numbers are not within correct range.\n");
         else *OK = true;
      } 
   }  
   else {
      printf("The program will end so that the function F can be created.\n");
      *OK = false;
   }  
}

void OUTPUT(double FT, double X, int M1, double *W, double H)
{
   int I, J, FLAG;
   char NAME[30];
   FILE *OUP;

   printf("Choice of output method:\n");
   printf("1. Output to screen\n");
   printf("2. Output to text file\n");
   printf("Please enter 1 or 2.\n");
   scanf("%d", &FLAG);
   if (FLAG == 2) {
      printf("Input the file name in the form - drive:name.ext\n");
      printf("for example:   A:OUTPUT.DTA\n");
      scanf("%s", NAME);
      OUP = fopen(NAME, "w");
   }
   else OUP = stdout;
   fprintf(OUP, "THIS IS THE BACKWARD-DIFFERENCE METHOD\n\n");
   fprintf(OUP, "  I        X(I)    W(X(I),%12.6e)\n", FT);
   for (I=1; I<=M1; I++) {
      X = I * H;
      fprintf(OUP, "%3d %11.8f    %14.8f\n", I, X, W[I-1]);
   }
   fclose(OUP);
}
 
Physics news on Phys.org
Isn't there anyone to help me.

if I write VV = - [ALPHA * ALPHA * K / ( H * H )]; instead of VV = ALPHA * ALPHA * K / ( H * H );in the HEAT EQUATION BACKWARD-DIFFERENCE ALGORITHM then have I obtained HEAT EQUATION FORWARD-DIFFERENCE ALGORITHM?
 
problem is solved:
finally code
Code:
#include<stdio.h>
#include<math.h>
#define pi 4*atan(1)
#define true 1
#define false 0

double F(double X);
void INPUT(int *, double *, double *, double *, int *, int *);
void OUTPUT(double, double, int, double *, double);

main()
{
  double W[25], U[25], Z[25];
  double FT,FX,ALPHA,H,K,VV,T,X;
  int N,M,M1,M2,N1,FLAG,I1,I,J,JJ,OK;

  INPUT(&OK, &FX, &FT, &ALPHA, &N, &M);
  if (OK) {
     M1 = M - 1;
     M2 = M - 2;
     N1 = N - 1;
     /* STEP 1 */
     H = FX / M;
     K = FT / N;
     VV = ALPHA * ALPHA * K / ( H * H );
     /* STEP 2 */
W[M]=0;
W[0]=0;
     for (I=1; I<=M1; I++) W[I] = F( I * H );
     /* STEP 3 */
for(J=1;J<=N;J++)
{ T=J*K;
    for (I=1;I<=M1;I++)
U[I]=VV*W[I+1]+(1-2*VV)*W[I]+VV*W[I-1];
for(JJ=1;JJ<=M1;JJ++)
W[JJ]=U[JJ];
}
     /* STEP 11 */
     OUTPUT(FT, X, M1, U, H);
  }
  /* STEP 12 */
  return 0;
}

/* Change F for a new problem */
double F(double X)
{
  double f;

  f =  sin(pi * X);
  return f;
}

void INPUT(int *OK, double *FX, double *FT, double *ALPHA, int *N, int *M)
{
  int FLAG;
  char AA;

  printf("This is the Backward-Difference Method for Heat Equation.\n");
  printf("Has the function F been created immediately\n");
  printf("preceding the INPUT procedure? Answer Y or N.\n");
  scanf("\n%c", &AA);
  if ((AA == 'Y') || (AA == 'y')) {
     printf("The lefthand endpoint on the X-axis is 0.\n");
     *OK =false;
     while (!(*OK)) {
	printf("Input the righthand endpoint on the X-axis.\n");
	scanf("%lf", FX);
	if (*FX <= 0.0)
	   printf("Must be positive number.\n");
	else *OK = true;
     }
     *OK = false;
     while (!(*OK)) {
	printf("Input the maximum value of the time variable T.\n");
	scanf("%lf", FT);
	if (*FT <= 0.0)
	   printf("Must be positive number.\n");
	else *OK = true;
     }
     printf("Input the constant alpha.\n");
     scanf("%lf", ALPHA);
     *OK = false;
     while (!(*OK)) {
	printf("Input integer m = number of intervals on X-axis\n");
	printf("and N = number of time intervals - separated by a.\n");
	printf("Note that m must be 3 or larger.\n");
	scanf("%d %d", M, N);
	if ((*M <= 2) || (*N <= 0))
	   printf("Numbers are not within correct range.\n");
	else *OK = true;
     }
  }
  else {
     printf("The program will end so that the function F can be\n");
     *OK = false;
  }
}

void OUTPUT(double FT, double X, int M1, double *W, double H)
{
  int I, J, FLAG;
  char NAME[30];
  FILE *OUP;

  printf("Choice of output method:\n");
  printf("1. Output to screen\n");
  printf("2. Output to text file\n");
  printf("Please enter 1 or 2.\n");
  scanf("%d", &FLAG);
  if (FLAG == 2) {
     printf("Input the file name in the form - drive:name.ext\n");
     printf("for example:   A:OUTPUT.DTA\n");
     scanf("%s", NAME);
     OUP = fopen(NAME, "w");
  }
  else OUP = stdout;
  fprintf(OUP, "THIS IS THE BACKWARD-DIFFERENCE METHOD\n\n");
  fprintf(OUP, "  I        X(I)    W(X(I),%12.6e)\n", FT);
  for (I=1; I<=M1; I++) {
     X = I * H;
     fprintf(OUP, "%3d %11.8f    %14.8f\n", I, X, W[I]);
  }
  fclose(OUP);
}
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
4K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 19 ·
Replies
19
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 11 ·
Replies
11
Views
2K