C++

برنامه اي كه عبارت dx/dt , dy/dt , dz/dt رو كه هركدام به صورت تابعي 4 متغيره F(t,x,y,z) هستن رو از ورودي بگيره و با روش هاي اويلر اويلر مرتبه 2 و رانگا كوتا مرتبه 4 , با دقت خوبي حل كنه .


#include
#include
#include
#include
#include
#include
#include
#include
//*************************************************************************************

void end(void);
struct stack {
int top;
char item[100];
}s;
int empty (stack *s) {
if (s->top==-1) return (1);
return (0);
};
void push(stack *s , char x) {
if (s->top==99) {
cout <<"stack over flow";exit(1); }
s->item[++s->top]=x;
};
char pop(stack *s) {
if (empty(s)) {
cout<<"stack under flow";
exit(1); }
return (s->item[s->top--]);
}
//struct stacks {
int top;
double item[100];
}ss;
int emptys (stacks *ss) {
if (ss->top==-1) return (1);
return (0);
};
void pushs(stacks *ss , float x) {
if (ss->top==99) {
cout <<"stack over flow";exit(1); }
ss->item[++ss->top]=x;
};
double pops(stacks *ss) {

if (emptys(ss)) {
cout<<"stack under flow";
exit(1); }
return (ss->item[ss->top--]);
}

//********************
void coment(void){
clrscr();

clrscr();
}
/////////////////////
stack s1;
int oprand(char op2){
char op1;
if (!empty(&s1)){ // akharin amalgare daron estak pop meshavad ta ba
op1 = pop(&s1); // amalgare op2 az lahaze taghadom moghayese shavad
s1.top++;} // sepass be top 1 vahed ezafe mishavad ta amalgare op1 dar stack az beyn naravad
else return 1; // agar stack khali bashad 1 bar migardad
if ((op1=='(')||(op2=='(')) return 1 ; // olaviyate parantez dar har sharayeti.

else if (isalpha(op1)&&isalpha(op2))return 1; // in ghesmat marbot be tavabeye
else if (isalpha(op2))return 1; // sin cos ... ast
else if (isalpha(op1)&&!isalpha(op2))return 0;

else if((op1=='^')&&(op2=='^')) return 1; //olaviyat hale marbot be tavan
else if((op1!='^')&&(op2=='^')) return 1;
else if ((op1=='^')&&(op2!='^'))return 0;

else if ((op1=='-')&&(op2!='-')&&(op2!='+')) return 1; // olaviyat haye digar
else if (op1=='/')return 0;
else if ((op1!='*')&&(op2=='*'))return 1;
else if ((op1=='+')&&(op2!='-')&&(op2!='+')) return 1;
else if ((op1=='/')&&(op2!='-')&&(op2!='+')&&(op2!='/')) return 1;
else return 0; }
////////////////
// tabdile infix be postfix
void intopost (char postfix[],int *arraysize){
char infix[100];
s1.top=-1;

cin>>infix; // vorode infix
int i=0; // shomarandeye ebarate infix
int j=0; // shomarandeye ebarate postfix . dar nahayat tol ebarate postfix ra moshakhas khahad kard
char op2='0';
do{ // baraye tavabeye sin cos... az horofe s c .. estefade shodeh ais
// if (i>=1) // in if az baghiye ye horof migozarad
// if (isalpha(infix[i-1])&&(infix[i-1]!='x'))
// i=i+2;
if (isdigit(infix[i])) // adad ba har raghami tavasote in shart vared mishavand
postfix[j++]=infix[i++];
else if ((infix[i]=='x')||(infix[i]=='t')||(infix[i]=='y')||(infix[i]=='z')) // x niz manand 1 adad vared mishavad
postfix[j++]=infix[i++];
// agar shorote bala bar gharar nabashand momken ast ma be amalgar resideh im
else {
postfix[j++]=' '; // inja adad tavasote yek fasele joda mishavand va adade 1 va chand
op2=infix[i++]; // chand raghami ghabele shenasaye baraye ghesmate arzyabi mishavand

// in shart baresi mikonad ke aya - marbot be adad ast ya yek amalgar ast
if ((op2=='-') && (!isalpha(infix[i-2]))&&(!isdigit(infix[i-2]))&&(infix[i-2]!=')')) {
postfix[j++]=op2; } //agar amalgar nabashad varede ebarate postfix mishavad
else {
int z;
do{ // in halghe ta zamani ejra mishavad ke amalgare hazer varede stack shavad
// ke agar nashavad amalgar haye daron stack dar sorate haghe
//taghadome bala pop meshavand
z=1;
if (op2==')') // badan residegi mishavad
break;
if (oprand(op2)) { // agar 1 bargardad yani amalgar hazer sharayete
// vorod be stack ra darad
push(&s1,op2);
z=0; }
else { // agar 0 bargashte bashad amalgare daron stack pop meshavad
// va dar postfix gharar migirad

postfix[j++]=' ';
postfix[j++]=pop(&s1);
postfix[j++]=' '; }
}
while (z!=0); // hamantor ke gofte shod vaghti az halghe kharej mishavad
// ke amalgare op2 hatman push shode bashad
int s;
if (op2==')') { // in dastor dar bala niz amade bod ke break shod .
// aknon be on residegi meshavad
do {
s=pop(&s1); //motmaen hastim ke stack khali nist
if (s!='(') {postfix[j++]=' '; // ta residan be akharin'(' hameye amalgar
//ha pop meshavand
postfix[j++]=s;}
postfix[j++]= ' ';
}
while(s!='('); } // agar '(' angah kharej meshavad

}

}
}
while((infix[i]!=61)&&(infix[i]!=0)); //0='nul' 61 = '=' moshakhas konandeye payane ebarat infix
int a=1; // aknon ebarate infix be payan residee . hal
// darsorate vojode amalgar dar stack ,pop va dar postfix jay migirad
do {
if (!empty(&s1)) {
postfix[j++]=' ';
postfix[j++]=pop(&s1);
postfix[j++]=' ';}
else a=0;
}
while (a!=0);

// printf("\n\n\n This is your postfix expresstion :\n\n ");



// printf("\n\n ");

*arraysize=j; // chon be j niyaz darim an ra barmigardanim be main()
// clrscr();
// ghesmate arzyabiye ebarate postfix
stacks s2;
// ebarate postfix ,tole an va meghdari ke bayad be jaye moteghayere barname bashad ,
//be tabe ersal mishavand
float arzyabi (char post[],int arraysize,double x,double y,double z, double t){
s2.top=-1; //inja be stack az jense adad niyaz mandim

int k=1,sign=1; // badan mifahmin ina chi an
float s=0;


for(int i=0;i
if ((post[i]=='-')&&isdigit(post[i+1]))
// dar in sorat '-' amalgar nist chon ma dar bala beyne hameye amalgar ha
//white spase vared kardim
sign=-1; // pas ma ba yek adade manfi robe ro hastim
else if (isalpha(post[i])&&(post[i]!='x')&&(post[i]!='y')&&(post[i]!='z')&&(post[i]!='t'));
// dar in sorat ma hatman ba sin cos tan... robe ro hastim
// in tavabe amalgarhaye hastand ke 1 amalvand darand
/* float a;
a=pops(&s2); // lazem be tozih nist
switch (post[i]) {
case 's'://pushs(&s2,sin(a));
break;
case 'c'://pushs(&s2,cos(a));
break;
case 't'://pushs(&s2,tan(a));
break;
case 'k'://pushs(&s2,1/tan(a));
break;
case 'l':{ if (a>0) // log dar a<=0 tarif nashode
pushs(&s2,log(a));}
break;
}
} */
else if (!isalpha(post[i])&&!isdigit(post[i])&&!(post[i]==' ')) {
// dar in sorat ma ba amalgar haye + - *... robe royim
float a,b;
a=pops(&s2); // ke do amalvand darand
b=pops(&s2);
switch (post[i]) {

case '+': pushs(&s2,a+b) ;
break;
case '-': pushs(&s2,b-a) ;
break;
case '*': pushs(&s2,a*b) ;
break;
case '/': pushs(&s2,b/a) ;
break;
case '^': pushs(&s2,pow(b,a)) ;
break;
}
}
else if (post[i]=='x') // agar sahrayete bala nabashand shayad ma be
//machhol moadele reside bashim
{ pushs(&s2,x*sign);// sign har meghdari ke dashte, digar estefade shodee
sign=1; }

else if (post[i]=='y') // agar sahrayete bala nabashand shayad ma be
//machhol moadele reside bashim
{ pushs(&s2,y*sign);// sign har meghdari ke dashte, digar estefade shodee
sign=1; }
else if (post[i]=='z') // agar sahrayete bala nabashand shayad ma be
//machhol moadele reside bashim
{ pushs(&s2,z*sign);// sign har meghdari ke dashte, digar estefade shodee
sign=1; }

else if (post[i]=='t') // agar sahrayete bala nabashand shayad ma be
//machhol moadele reside bashim
{ pushs(&s2,t*sign);// sign har meghdari ke dashte, digar estefade shodee
sign=1; }// pas an ra baraye meghdare badi amade mikonim
else if (post[i]==' ') {
// beyne tamame ajzaye postfix ma hade aghal 1 white space vojod darad
// hal agar sharayete bala etefagh nayouftade bashad, tanha yek halate digar mojod ast
// ehtemalan ma az yek adade n raghami ke dar s zakhire mishavad obor karde em
// pas alamti ham ke khande shode 'sign' marbot be in bode .
// an ra dar alamatash zarb kardee va push mikonim sepas sign s va k ra
// amadeye adade badi mikonim

if (k!=1) // in shart be ma etminan midahad ke az yek adad gozashteim
// chon momken ast chand white space poshte ham bashand .
pushs(&s2,s*sign) ;
sign=1;
s=0;
k=1; }// k faghat 1 flag ast agar 0 bashad yani white space hazer
//dorost bad az yek adad amade ast

else { // aknon digar hatman be yek adad resideh im pas k=0.
k=0; // hamon tor ke i be tartib khande mishavad ,dar s zakhire shodeh
// va * 10 arghame an ra misazad
s=s*10+(post[i]-'0');
}
}

//dar inja stack faghat dar yek sorat emkane khali bodan darad va an
//hengami ast ke yek add manfidar log khande shode bashad
if (emptys(&s2)) return 1000; //1000 az mahdodeye screen kharej ast va asari dar namayesh nadarad
return pops(&s2) ; } //1000 faghat bekhatere tabeye log ke adade manfi
//nemigirad estefade shode ast
//******************
double oiler (char X[],char Y[], char Z[], int Xsize,int Ysize,int Zsize ,float a,float b)
{ float h=(a+b)/100;
double x=0,y=0,z=0,xtemp=0,ytemp=0,ztemp=0,t=a;

while (t<=b)
{
ytemp=y+h*arzyabi(Y,Ysize,x,y,z,t);
xtemp=x+h*arzyabi(X,Xsize,x,y,z,t);
ztemp=z+h*arzyabi(Z,Zsize,x,y,z,t);
y=ytemp;
x=xtemp;
z=ztemp;
t=t+h;
if (t<=b) cout<<"Oiler t="<<<" x= " <<<" y= " <<<" z= " <<



}


return a; }
void oiler2 (char X[],char Y[], char Z[], int Xsize,int Ysize,int Zsize ,float a,float b)
{ float h=(a+b)/100;
double x=0,y=0,z=0,xtemp=0,ytemp=0,ztemp=0,xstar,ystar,zstar,t=a;

while (t<=b)

{if(t>b) break;
ystar=y+h*arzyabi(Y,Ysize,x,y,z,t);
xstar=x+h*arzyabi(X,Xsize,x,y,z,t);
zstar=z+h*arzyabi(Z,Zsize,x,y,z,t);
ytemp=y+(h/2)*(arzyabi(Y,Ysize,x,y,z,t)+arzyabi(Y,Ysize,xstar,ystar,zstar,t+h));
xtemp=x+(h/2)*(arzyabi(X,Xsize,x,y,z,t)+arzyabi(X,Xsize,xstar,ystar,zstar,t+h));
ztemp=z+(h/2)*(arzyabi(Z,Zsize,x,y,z,t)+arzyabi(Z,Zsize,xstar,ystar,zstar,t+h));
y=ytemp;
x=xtemp;
z=ztemp;
t=t+h;
if (t<=b) cout<<"Oiler2 t="<<<" x= " <<<" y= " <<<" z= " <<



}

}
void RK4(char X[],char Y[], char Z[], int Xsize,int Ysize,int Zsize ,float a,float b)
{ float h=(a+b)/100;
double x=0,y=0,z=0,xtemp=0,ytemp=0,ztemp=0,k1,k2,k3,k4,l1,l2,l3,l4,m1,m2,m3,m4,ystar,zstar,t=a;

while(t<=b){

l1=h*arzyabi(Y,Ysize,x,y,z,t);
k1=h*arzyabi(X,Xsize,x,y,z,t);
m1=h*arzyabi(Z,Zsize,x,y,z,t);

l2=h*arzyabi(Y,Ysize,x+k1/2,y+l1/2,z+m1/2,t+h/2);
k2=h*arzyabi(X,Xsize,x+k1/2,y+l1/2,z+m1/2,t+h/2);
m2=h*arzyabi(Z,Zsize,x+k1/2,y+l1/2,z+m1/2,t+h/2);

l3=h*arzyabi(Y,Ysize,x+k2/2,y+l2/2,z+m2/2,t+h/2);
k3=h*arzyabi(X,Xsize,x+k2/2,y+l2/2,z+m2/2,t+h/2);
m3=h*arzyabi(Z,Zsize,x+k2/2,y+l2/2,z+m2/2,t+h/2);

l4=h*arzyabi(Y,Ysize,x+k2,y+l2,z+m2,t+h);
k4=h*arzyabi(X,Xsize,x+k2,y+l2,z+m2,t+h);
m4=h*arzyabi(Z,Zsize,x+k2,y+l2,z+m2,t+h);

ytemp=y+(l1+2*l2+2*l3+l4)/6;
xtemp=x+(k1+2*k2+2*k3+k4)/6;
ztemp=z+(m1+2*m2+2*m3+m4)/6;

y=ytemp;
x=xtemp;
z=ztemp;
t=t+h;
if(t<=b) cout<<"RK4 t="<<<" x= " <<<" y= " <<<" z= " <<
}

}
int main () {
// cout<<<145.341<

char postfixX[100],postfixY[100],postfixZ[100],flag='0';
int a,b,arraysizeX,arraysizeY,arraysizeZ;
double y,z,t,x;
coment();
do { //be khatere halgheye tekrare (Y,N) estefade shode ast
cout<<"\n\n\n Enter dX/dt : ";
intopost(postfixX,&arraysizeX);
cout<<"\n\n Enter dY/dt : ";
intopost(postfixY,&arraysizeY);
cout<<"\n\n Enter dZ/dt : ";
intopost(postfixZ,&arraysizeZ); // inja faghat meghdari ke dar arraysize barmigardad mohem ast
int i;
for (i=0;i
cout <
cout<
for (i=0;i
cout <
cout<
for (i=0;i
cout <
cout<
cout<<" \n\n\n\n enter [a,b] you must enter a<=0 & b>=0 . ";
cout <<"\n for example if you enter ' -3 6 ' , then a=-3 and b=6 .\n enter (a,b): ";
cin >>a>>b;

oiler(postfixX,postfixY,postfixZ,arraysizeX,arraysizeY,arraysizeZ,a,b);
cout<<"\n\n edame..." ;
getch();
oiler2(postfixX,postfixY,postfixZ,arraysizeX,arraysizeY,arraysizeZ,a,b);
cout<<"\n\n edame..." ;
getch();
RK4(postfixX,postfixY,postfixZ,arraysizeX,arraysizeY,arraysizeZ,a,b);
//be ezaye har meghdare x ,y mohasebe mishavad
cout<<"\n\n edame..." ;



// ama dar rasm faghat i va y ;


getch();

do{ // in halghe be komake DO WHILE ghabli meayad ta karbar
// hatman kalameye Y ya N ra vared konad

cout<<"\n \n tekrar(Y/N)? ";
cin >>flag;
if(flag=='n')break;
// be ezaye har karakter gheyr az N,Y in halghe hey tekrar meshavad
// agar N vared shod ,break va az halgheye avali khareg mishavad
// agar Y vared shod ,az halgheye dovom kharej shode va halgheye aval ra tekrar mekonad
}
while(flag!='y');
}
while(flag!='n');

end(); // akhtetamiyee seda zade mishavad

return 0; }

void end(void){

getch();
} // THE END.
// khoda azashon nagzaree harki ke az code in barnamee soe estefade konee