# include <iostream.h> # include <stdlib.h> # include <string.h> # include <stdio.h> # include <conio.h> # include <math.h> const int max_size=8; int n=0; int top=-1; long double h=0; long double a=0; long double b=0; long double ri[max_size][max_size]={0}; long double xn[max_size]={0}; long double fx[max_size]={0}; char Fx[100]={NULL}; char Stack[30][30]={NULL}; char Postfix_expression[30][30]={NULL}; //------------------------ Funcion Prototypes -------------------------// void push(const char *); void convert_ie_to_pe(const char *); const char* pop( ); const long double evaluate_postfix_expression(const long double); void show_screen( ); void clear_screen( ); void get_input( ); void apply_trapezoidal_rule( ); void apply_romberg_method( ); void show_result( ); //------------------------------ main( ) ------------------------------// int main( ) { clrscr( ); textmode(C4350); show_screen( ); get_input( ); apply_trapezoidal_rule( ); apply_romberg_method( ); show_result( ); getch( ); return 0; } //------------------------ Funcion Definitions ------------------------// //-------------------------- show_screen( ) ---------------------------// void show_screen( ) { cprintf(\"\\n********************************************************************************\"); cprintf(\"****************************- -***************************\"); cprintf(\"*---------------------------- \"); textbackground(1); cprintf(\" Romberg Integration \"); textbackground(8); cprintf(\" ---------------------------*\"); cprintf(\"*-**************************- -*************************-*\"); cprintf(\"*-****************************************************************************-*\"); for(int count=0;count<42;count++) cprintf(\"*-* *-*\"); gotoxy(1,46); cprintf(\"*-****************************************************************************-*\"); cprintf(\"*------------------------------------------------------------------------------*\"); cprintf(\"********************************************************************************\"); gotoxy(1,2); } //------------------------- clear_screen( ) ---------------------------// void clear_screen( ) { for(int count=0;count<37;count++) { gotoxy(5,8+count); cout<<\" \"; } gotoxy(1,2); } //-------------------------- push(const char*) ------------------------// void push(const char* Operand) { if(top==(max_size-1)) { cout<<\"Error : Stack is full.\"<<endl; cout<<\"\\n Press any key to exit.\"; getch( ); exit(0); } else { top++; strcpy(Stack[top],Operand); } } //------------------------------ pop( ) -------------------------------// const char* pop( ) { char Operand[40]={NULL}; if(top==-1) { cout<<\"Error : Stack is empty.\"<<endl; cout<<\"\\n Press any key to exit.\"; getch( ); exit(0); } else { strcpy(Operand,Stack[top]); strset(Stack[top],NULL); top--; } return Operand; } //-------------------- convert_ie_to_pe(const char*) ------------------// void convert_ie_to_pe(const char* Expression) { char Infix_expression[100]={NULL}; char Symbol_scanned[30]={NULL}; push(\"(\"); strcpy(Infix_expression,Expression); strcat(Infix_expression,\"+0)\"); int flag=0; int count_1=0; int count_2=0; int equation_length=strlen(Infix_expression); if(Infix_expression[0]==\'(\') flag=1; do { strset(Symbol_scanned,NULL); if(flag==0) { int count_3=0; do { Symbol_scanned[count_3]=Infix_expression[count_1]; count_1++; count_3++; } while(count_1<=equation_length && Infix_expression[count_1]!=\'(\' && Infix_expression[count_1]!=\'+\' && Infix_expression[count_1]!=\'-\' && Infix_expression[count_1]!=\'*\' && Infix_expression[count_1]!=\'/\' && Infix_expression[count_1]!=\'^\' && Infix_expression[count_1]!=\')\'); flag=1; } else if(flag==1) { Symbol_scanned[0]=Infix_expression[count_1]; count_1++; if(Infix_expression[count_1]!=\'(\' && Infix_expression[count_1]!=\'^\' && Infix_expression[count_1]!=\'*\' && Infix_expression[count_1]!=\'/\' && Infix_expression[count_1]!=\'+\' && Infix_expression[count_1]!=\'-\' && Infix_expression[count_1]!=\')\') flag=0; if(Infix_expression[count_1-1]==\'(\' && (Infix_expression[count_1]==\'-\' || Infix_expression[count_1]==\'+\')) flag=0; } if(strcmp(Symbol_scanned,\"(\")==0) push(\"(\"); else if(strcmp(Symbol_scanned,\")\")==0) { while(strcmp(Stack[top],\"(\")!=0) { strcpy(Postfix_expression[count_2],pop( )); count_2++; } pop( ); } else if(strcmp(Symbol_scanned,\"^\")==0 || strcmp(Symbol_scanned,\"+\")==0 || strcmp(Symbol_scanned,\"-\")==0 || strcmp(Symbol_scanned,\"*\")==0 || strcmp(Symbol_scanned,\"/\")==0) { if(strcmp(Symbol_scanned,\"^\")==0) { } else if(strcmp(Symbol_scanned,\"*\")==0 || strcmp(Symbol_scanned,\"/\")==0) { while(strcmp(Stack[top],\"^\")==0 || strcmp(Stack[top],\"*\")==0 || strcmp(Stack[top],\"/\")==0) { strcpy(Postfix_expression[count_2],pop( )); count_2++; } } else if(strcmp(Symbol_scanned,\"+\")==0 || strcmp(Symbol_scanned,\"-\")==0) { while(strcmp(Stack[top],\"(\")!=0) { strcpy(Postfix_expression[count_2],pop( )); count_2++; } } push(Symbol_scanned); } else { strcat(Postfix_expression[count_2],Symbol_scanned); count_2++; } } while(strcmp(Stack[top],NULL)!=0); strcat(Postfix_expression[count_2],\"=\"); count_2++; } //---------- evaluate_postfix_expression(const long double) -----------// const long double evaluate_postfix_expression(const long double x) { long double function_value=0; int count_1=-1; char Symbol_scanned[30]={NULL}; do { count_1++; strcpy(Symbol_scanned,Postfix_expression[count_1]); if(strcmp(Symbol_scanned,\"^\")==0 || strcmp(Symbol_scanned,\"*\")==0 || strcmp(Symbol_scanned,\"/\")==0 || strcmp(Symbol_scanned,\"+\")==0 || strcmp(Symbol_scanned,\"-\")==0) { char Result[30]={NULL}; char Operand[2][30]={NULL}; strcpy(Operand[0],pop( )); strcpy(Operand[1],pop( )); long double operand[2]={0}; long double result=0; char *endptr; for(int count_2=0;count_2<2;count_2++) { int flag=0; if(Operand[count_2][0]==\'-\') { int length=strlen(Operand[count_2]); for(int count_3=0;count_3<(length-1);count_3++) Operand[count_2][count_3]=Operand[count_2][(count_3+1)]; Operand[count_2][count_3]=NULL; flag=1; } if(strcmp(Operand[count_2],\"x\")==0) operand[count_2]=x; else if(strcmp(Operand[count_2],\"e\")==0) operand[count_2]=2.718282; else if(strcmp(Operand[count_2],\"sinx\")==0) operand[count_2]=sinl(x); else if(strcmp(Operand[count_2],\"cosx\")==0) operand[count_2]=cosl(x); else if(strcmp(Operand[count_2],\"tanx\")==0) operand[count_2]=tanl(x); else if(strcmp(Operand[count_2],\"lnx\")==0) operand[count_2]=logl(x); else if(strcmp(Operand[count_2],\"logx\")==0) operand[count_2]=log10l(x); else operand[count_2]=strtod(Operand[count_2],&endptr); if(flag) operand[count_2]*=-1; } switch(Symbol_scanned[0]) { case \'^\' : result=powl(operand[1],operand[0]); break; case \'*\' : result=operand[1]*operand[0]; break; case \'/\' : result=operand[1]/operand[0]; break; case \'+\' : result=operand[1]+operand[0]; break; case \'-\' : result=operand[1]-operand[0]; break; } gcvt(result,25,Result); push(Result); } else if(strcmp(Symbol_scanned,\"=\")!=0) push(Symbol_scanned); } while(strcmp(Symbol_scanned,\"=\")!=0); char Function_value[30]={NULL}; char *endptr; strcpy(Function_value,pop( )); function_value=strtod(Function_value,&endptr); return function_value; } //----------------------------- get_input( ) --------------------------// void get_input( ) { do { clear_screen( ); gotoxy(6,9); cout<<\"Input :\"; gotoxy(6,10); cout<<\"ÍÍÍÍÍÍÍ\"; gotoxy(37,13); cout<<\"[ n = 2,4,8 ]\"; gotoxy(6,12); cout<<\"Enter the max. number of sub-intervals = n = \"; cin>>n; if(n!=2 && n!=4 && n!=8) { gotoxy(12,25); cout<<\"Error : Wrong Input. Press <Esc> to exit or any other key\"; gotoxy(12,26); cout<<\" to try again.\"; n=int(getche( )); if(n==27) exit(0); } } while(n!=2 && n!=4 && n!=8); gotoxy(6,16); cout<<\"Enter the value of Lower limit = a = \"; cin>>a; gotoxy(6,18); cout<<\"Enter the value of Upper Limit = b = \"; cin>>b; gotoxy(25,43); cout<<\"Press any key to continue...\"; getch( ); clear_screen( ); gotoxy(6,10); cout<<\"Non-Linear Function :\"; gotoxy(6,11); cout<<\"ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\"; gotoxy(6,37); cout<<\"Note : Write the function with proper Braces ( ) e.g; 2x+3 as (2*x)+3\"; gotoxy(6,40); cout<<\"Available Operators : ^ (raised to power) , * , / , + , -\"; gotoxy(6,42); cout<<\"Available Operands : x , e , sinx , cosx , tanx , lnx , logx ,\"; gotoxy(6,44); cout<<\" n = any number\"; gotoxy(6,14); cout<<\"Enter the Function : f(x) = \"; cin>>Fx; convert_ie_to_pe(Fx); } //---------------------- apply_trapezoidal_rule( ) --------------------// void apply_trapezoidal_rule( ) { int count_1=0; for(int count_2=1;count_2<=n;count_2+=count_2) { for(int count_3=0;count_3<max_size;count_3++) { xn[count_3]=0; fx[count_3]=0; } h=((b-a)/count_2); xn[0]=a; for(int count_4=0;count_4<count_2;count_4++) xn[(count_4+1)]=(xn[count_4]+h); for(int count_5=0;count_5<=count_2;count_5++) fx[count_5]=evaluate_postfix_expression(xn[count_5]); for(int count_6=1;count_6<count_2;count_6++) ri[count_1][0]+=fx[count_6]; ri[count_1][0]*=2; ri[count_1][0]+=fx[0]; ri[count_1][0]+=fx[count_2]; ri[count_1][0]*=(h/2); count_1++; } } //---------------------- apply_romberg_method( ) ----------------------// void apply_romberg_method( ) { int counter=0; switch(n) { case 2 : counter=1; break; case 4 : counter=2; break; case 8 : counter=3; break; } for(int count_1=1;count_1<=counter;count_1++) { for(int count_2=count_1;count_2<=counter;count_2++) { long double rjk_1=0; long double rj_1k_1=0; rjk_1=ri[count_2][(count_1-1)]; rj_1k_1=ri[(count_2-1)][(count_1-1)]; ri[count_2][count_1]=(((powl(4,count_1)*rjk_1)-rj_1k_1)/(powl(4,count_1)-1)); } } } //---------------------------- show_result( ) -------------------------// void show_result( ) { clear_screen( ); int counter=0; switch(n) { case 2 : counter=1; break; case 4 : counter=2; break; case 8 : counter=3; break; } gotoxy(6,10); cout<<\"Solution :\"; gotoxy(6,11); cout<<\"ÍÍÍÍÍÍÍÍÍÍ\"; if(n==1) { gotoxy(6,13); cout<<\"ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\"; } else if(n==2) { gotoxy(6,13); cout<<\"ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\"; } else if(n==4) { gotoxy(6,13); cout<<\"ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\"; } else if(n==8) { gotoxy(6,13); cout<<\"ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\"; } if(n==1) { gotoxy(6,14); cout<<\"³ Number of ³ Trapezoidal ³\"; } else if(n==2) { gotoxy(6,14); cout<<\"³ Number of ³ Trapezoidal ³ Romberg Values ³\"; } else if(n==4) { gotoxy(6,14); cout<<\"³ Number of ³ Trapezoidal ³ Romberg Values ³\"; } else if(n==8) { gotoxy(6,14); cout<<\"³ Number of ³ Trapezoidal ³ Romberg Values ³\"; } if(n==1) { gotoxy(6,15); cout<<\"³ ³ ³\"; } else if(n==2) { gotoxy(6,15); cout<<\"³ ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\"; } else if(n==4) { gotoxy(6,15); cout<<\"³ ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ\"; } else if(n==8) { gotoxy(6,15); cout<<\"³ ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ\"; } if(n==1) { gotoxy(6,16); cout<<\"³ Intervals ³ Sums ³\"; } else if(n==2) { gotoxy(6,16); cout<<\"³ Intervals ³ Sums ³ 1ts Order ³\"; } else if(n==4) { gotoxy(6,16); cout<<\"³ Intervals ³ Sums ³ 1ts Order ³ 2nd Order ³\"; } else if(n==8) { gotoxy(6,16); cout<<\"³ Intervals ³ Sums ³ 1ts Order ³ 2nd Order ³ 3rd Order ³\"; } if(n==1) { gotoxy(6,17); cout<<\"ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄ\"; } else if(n==2) { gotoxy(6,17); cout<<\"ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\"; } else if(n==4) { gotoxy(6,17); cout<<\"ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄ\"; } else if(n==8) { gotoxy(6,17); cout<<\"ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄ\"; } if(n==1) { gotoxy(6,18); cout<<\"³ ³ ³\"; } else if(n==2) { gotoxy(6,18); cout<<\"³ ³ ³ ³\"; } else if(n==4) { gotoxy(6,18); cout<<\"³ ³ ³ ³ ³\"; } else if(n==8) { gotoxy(6,18); cout<<\"³ ³ ³ ³ ³ ³\"; } int y_cord=19; int intervals=1; for(int count_1=0;count_1<=counter;count_1++) { if(n==1) { gotoxy(6,y_cord); cout<<\"³ ³ ³\"; gotoxy(6,(y_cord+1)); cout<<\"³ ³ ³\"; } else if(n==2) { gotoxy(6,y_cord); cout<<\"³ ³ ³ ³\"; gotoxy(6,(y_cord+1)); cout<<\"³ ³ ³ ³\"; } else if(n==4) { gotoxy(6,y_cord); cout<<\"³ ³ ³ ³ ³\"; gotoxy(6,(y_cord+1)); cout<<\"³ ³ ³ ³ ³\"; } else if(n==8) { gotoxy(6,y_cord); cout<<\"³ ³ ³ ³ ³ ³\"; gotoxy(6,(y_cord+1)); cout<<\"³ ³ ³ ³ ³ ³\"; } gotoxy(11,(19+(count_1*2))); cout<<intervals; intervals+=intervals; y_cord+=2; } for(int count_2=0;count_2<=counter;count_2++) { for(int count_3=0;count_3<=counter;count_3++) { if(count_2==0) { gotoxy(20,(19+(count_3*2))); cout<<ri[count_3][0]; } else if(count_2==1 && count_3>=count_2) { gotoxy(34,(19+(count_3*2))); cout<<ri[count_3][1]; } else if(count_2==2 && count_3>=count_2) { gotoxy(48,(19+(count_3*2))); cout<<ri[count_3][2]; } else if(count_2==3 && count_3>=count_2) { gotoxy(62,(19+(count_3*2))); cout<<ri[count_3][3]; } } } if(n==1) { gotoxy(6,y_cord); cout<<\"ÀÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\"; } else if(n==2) { gotoxy(6,y_cord); cout<<\"ÀÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\"; } else if(n==4) { gotoxy(6,y_cord); cout<<\"ÀÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\"; } else if(n==8) { gotoxy(6,y_cord); cout<<\"ÀÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\"; } gotoxy(6,32); cout<<\" bô\"; gotoxy(6,34); cout<<\" aõ\"; gotoxy(6,33); cout<<\"Estimation of ³f(x)dx :\"; gotoxy(6,35); cout<<\"ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\"; gotoxy(8,37); cout<<\"Estimated Integral Value = \"; cout<<ri[counter][counter]; gotoxy(1,2); }