Forward difference method for heat equation

In summary, this code implements the Backward-Difference Method for solving the Heat Equation. It approximates the solution to the parabolic partial-differential equation with given boundary and initial conditions. The code takes inputs for the endpoint, maximum time, alpha constant, and number of intervals on the X-axis and time intervals. It then uses a tridiagonal linear system to solve for the approximations of u(x,t). The function F must be created before running the program. The output can either be displayed on the screen or saved to a text file.
  • #1
ahmedo047
5
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.

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?

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
  • #2

Dear student,

I understand that you are having trouble converting the heat equation backward-difference algorithm in the Burden-faires numerical analysis book into a forward-difference algorithm. I will try my best to help you.

Firstly, let's understand the difference between the backward-difference and forward-difference methods for solving the heat equation. In the backward-difference method, the value of the solution at the next time step is calculated using the values at the current time step, while in the forward-difference method, the value at the next time step is calculated using the values at the previous time step. This means that the backward-difference method is an implicit method, while the forward-difference method is an explicit method.

Now, coming to your question, if you want to convert the heat equation backward-difference algorithm into a forward-difference algorithm, you will need to make some changes in the code. The main difference would be in the calculation of the variable VV, which represents the coefficient of the second derivative in the heat equation. In the backward-difference method, it is calculated as VV = ALPHA * ALPHA * K / ( H * H ), while in the forward-difference method, it would be VV = ALPHA * ALPHA * K / ( H * H ) - 1. This is because in the forward-difference method, we are using the value at the previous time step, so we need to subtract 1 from the coefficient.

I see that you have tried to make this change by writing VV = - [ALPHA * ALPHA * K / ( H * H )], but this is not correct. You just need to subtract 1 from the coefficient, not multiply it by -1. So, the correct code for VV in the forward-difference method would be VV = ALPHA * ALPHA * K / ( H * H ) - 1.

I hope this helps you in converting the code. If you still face any difficulties, please let me know and I will be happy to assist you further.
 

Related to Forward difference method for heat equation

1. What is the Forward Difference Method for solving heat equations?

The Forward Difference Method is a numerical technique used to approximate the solution of a heat equation. It involves dividing the domain into a grid and using the values at adjacent grid points to calculate the temperature at the next time step. This method is based on the first-order forward difference approximation of the derivative in the heat equation.

2. How does the Forward Difference Method work?

The Forward Difference Method works by discretizing the domain into a grid and using the values at the current time step to calculate the values at the next time step. This is done using the first-order forward difference approximation of the derivative in the heat equation. The process is repeated until the desired accuracy is achieved.

3. What are the advantages of using the Forward Difference Method?

The Forward Difference Method is relatively easy to implement and is computationally efficient. It also allows for a flexible choice of time step and grid size, making it suitable for a wide range of problems. It also provides a good approximation of the solution for smooth and continuous functions.

4. What are the limitations of the Forward Difference Method?

The Forward Difference Method can only be used for solving heat equations with constant coefficients. It also has a stability condition which restricts the choice of time step. Additionally, it may introduce numerical errors and may not provide accurate solutions for non-smooth or discontinuous functions.

5. How does the Forward Difference Method compare to other numerical methods?

Compared to other numerical methods, the Forward Difference Method is relatively simple and easy to implement. It is also computationally efficient and can be used for a wide range of problems. However, it may not provide the most accurate solutions and may not be suitable for all types of heat equations.

Similar threads

  • Engineering and Comp Sci Homework Help
Replies
3
Views
938
  • Engineering and Comp Sci Homework Help
Replies
19
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
2
Views
1K
  • Engineering and Comp Sci Homework Help
Replies
2
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
8
Views
2K
  • MATLAB, Maple, Mathematica, LaTeX
Replies
2
Views
1K
  • Engineering and Comp Sci Homework Help
Replies
9
Views
4K
  • Engineering and Comp Sci Homework Help
Replies
1
Views
3K
  • Engineering and Comp Sci Homework Help
Replies
6
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
5
Views
1K
Back
Top