C Program that implements Simpson’s Method

Simpson’s Rule:

Simpson's rule is a method for numerical integration, the numerical approximation of definite integrals. Specifically, it is the following approximation:

simpsons rule

 




/* Write C program to implement  Simpson method. */


 


#include<stdio.h>


#include<conio.h>


#include<math.h>


 


char postfix[80];


float stack[80];


char stack1[80];


int top=-1,top1=-1;


float eval(char postfix[], float x1);


void infix_postfix(char infix[]);


 


main()


{


 float x0, xn, h, s,e1,e2, e3;


 char exp[80], arr[80];


 int i,n,l=0;


 clrscr();


 printf("\nEnter an expression: ");


 gets(exp);


 puts("Enter x0, xn and number of sub-intervals: ");


 scanf("%f%f%d", &x0, &xn, &n);


 h=(xn-x0)/n;


 if(exp[0]=='l'&& exp[1]=='o'&& exp[2]=='g')


{


   l=strlen(exp);


   for(i=0;i<l-3; i++)


   arr[0]=exp[i+3];


   arr[i]='\0';


   infix_postfix(arr);


   e1=eval(postfix,x0);


   e2=eval(postfix,xn);


   e3=4*eval(postfix, x0+h);


   s=log(e1)+log(e2)+log(e3);


   for (i=3;i<=n-1;i+=2)


      s+=4*eval(postfix,x0+i*h)+2*eval(postfix, x0+(i-1)*h);


}


 else


{


   infix_postfix(exp);


   s=eval(postfix,x0)+eval(postfix,xn)+4*eval(postfix, x0+h);


   for (i=3;i<=n-1;i+=2)


   s+=4*eval(postfix,x0+i*h)+2*eval(postfix, x0+(i-1)*h);


}


 printf("The value of integral is %6.3f\n",(h/3)*s);


return(0);


}


/*Inserting the operands in a stack. */


void push(float item)


{


if(top==99)


 {


   printf("\n\tThe stack is full");


   getch();


   exit(0);


}


else


{


  top++;


  stack[top]=item;


}


return;


}


/*Removing the operands from a stack. */


float pop()


{


  float item;


  if(top==-1)


{


 printf("\n\tThe stack is empty\n\t");


 getch();


}


 item=stack[top];


 top--;


 return (item);


}


void push1(char item)


{


 if(top1==79)


{


  printf("\n\tThe stack is full");


  getch();


  exit(0);


}


 else


{


  top1++;


  stack1[top1]=item;


}


return;


}


/*Removing the operands from a stack. */


char pop1()


{


 char item;


 if(top1==-1)


{


  printf("\n\tThe stack1 is empty\n\t");


  getch();


}


 item=stack1[top1];


 top1--;


 return (item);


}


/*Converting an infix expression to a postfix expression. */


void infix_postfix(char infix[])


{


 int i=0,j=0,k;


 char ch;


 char token;


 for(i=0;i<79;i++)


 postfix[i]=' ';


 push1('?');


 i=0;


 token=infix[i];


 while(token!='\0')


 {


   if(isalnum(token))


    {


      postfix[j]=token;


      j++;


    }


   else if(token=='(')


    {


     push1('(');


    }


   else if(token==')')


   {


    while(stack1[top1]!='(')


    {


     ch=pop1();


     postfix[j]=ch;


     j++;


    }


   ch=pop1();


  }


 else


 {


  while(ISPriority(stack1[top1])>=ICP(token))


  {


   ch=pop1();


   postfix[j]=ch;


   j++;


  }


push1(token);


}


i++;


token=infix[i];


}


while(top1!=0)


{


 ch=pop1();


 postfix[j]=ch;


 j++;


}


postfix[j]='\0';


}


 


/*Determining the priority of elements that are placed inside the stack. */


int ISPriority(char token)


{


 switch(token)


 {


  case '(':return (0);


  case ')':return (9);


  case '+':return (7);


  case '-':return (7);


  case '*':return (8);


  case '/':return (8);


  case '?':return (0);


  default: printf("Invalid expression");


 }


return 0;


}


 


/*Determining the priority of elements that are approaching towards the stack. */


int ICP(char token)


{


 switch(token)


 {


  case '(':return (10);


  case ')':return (9);


  case '+':return (7);


  case '-':return (7);


  case '*':return (8);


  case '/':return (8);


  case '\0':return (0);


  default: printf("Invalid expression");


  }


return 0;


}


/*Calculating the result of expression, which is converted in postfix notation. */


float eval(char p[], float x1)


{


 float t1,t2,k,r;


 int i=0,l;


 l=strlen(p);


 while(i<l)


 {


  if(p[i]=='x')


  push(x1);


  else


   if(isdigit(p[i]))


    {


     k=p[i]-'0';


     push(k);


    }


 else


 {


  t1=pop();


  t2=pop();


  switch(p[i])


  {


   case '+':k=t2+t1;


   break;


   case '-':k=t2-t1;


   break;


   case '*':k=t2*t1;


   break;


   case '/':k=t2/t1;


   break;


   default: printf("\n\tInvalid expression");


  }


 push(k);


}


i++;


}


if(top>0)


 {


  printf("You have entered the operands more than the operators");


  exit(0);


 }


else


 {


  r=pop();


  return (r);


 }


return 0;


}




Output would be like this:




 



a1

Share this post
  • Share to Facebook
  • Share to Twitter
  • Share to Google+
  • Share to Stumble Upon
  • Share to Evernote
  • Share to Blogger
  • Share to Email
  • Share to Yahoo Messenger
  • More...
 
Posts RSSComments RSSBack to top
© 2013 Updated Tech News Results and Reviews