lucr9

8
8/20/2019 Lucr9 http://slidepdf.com/reader/full/lucr9 1/8 L9-1 L9. Lucrarea 9: Integrarea ecua!iilor diferen!iale. Aplica!ie de integrare a ecua!iilor diferen!iale prin metode Euler sub EXCEL În figura 5.15 este prezentat! o aplica"ie care ilustreaz! principiul de lucru cu metodele de integrare Euler direct! (simpl!) #i Euler perfec"ionat (Euler predictor corector). Pentru simplitate a fost aleas! func"ia  y x = 2  a c!rei derivat! este ( ) ′ = =  y f x y x , 2 . Lucrarea decurge astfel:  Se creaz !  tabelul din domeniul C3:J7 ;  Se completeaz! domeniul D3:J3 cu valorile abscisei x;  Se completeaz! domeniul D4:J4 cu valorile func"iei f(x,y), astfel: în celula D4 se introduce formula =2*D3, apoi se copiaz! aceast! formul! pe restul domeniului, pâna la J4;  Pentru compara"ie, se completeaz! domeniul D5:J5 cu formula analitic! a lui y, astfel: în celula D5 se introduce formula =D3^2, apoi se extinde formula pe restul domeniului;  Se completeaz! celula D6 cu valoarea ini"ial! y 0 , adic! 0;  Se completeaz! domeniul E6:J6 cu formula de integrare Euler direct !, ( ) ( )  y i  y i  x i  x i  f x i  y i +  = + +  − 1 1 , , astfel: în celula E6 se introduce formula =D6+D4*(E3-D3), apoi se extinde aceast! formul! pe restul domeniului;  Se completeaz! celula D7 cu valoarea ini"ial! y 0 , adic! 0;  ( ) ( ) ( )  ( ) ( )  y y i  x i  x i  f x i  y i  f x i  y i i + + = + +  − + +   1 1 1 0 05 1 1 . , , , astfel: în celula E6 se introduce formula =D7+0,5*(E3-D3)*(D4+E4) apoi se extinde aceast! formul! pe restul domeniului; Se observ! c!, deoarece f(x,y) nu depinde de y, condi "ia lui Lipschitz este automat îndeplinit ! #i formula  predictor corector a lui Euler d!, în acest caz, rezultate exacte, spre deosebire de cea direct!, a#a cum se vede din diagrama din figur ! ca #i din tabel. Fig.5.15. Aplica!ie de integrare a ecua!iilor diferen!iale prin metode Runge-Kutta IV sub EXCEL Se consider ! ecua"ia  y x = 2 2 , cu derivata ′ =  y x . Pentru a integra ecua"ia ′ =  y x  se va folosi mai întâi formula Runge-Kutta de ordinul IV - varianta formulei de treime, #i apoi varianta formulei de optime, construind tabelele din figura 5.16. Formulele dup! care se rezolv! o ecua"ie diferen"ial! de forma ( ) ′ =  y f x y ,  cu condi"ia ini"ial! ( )  y x y 0 0 = , folosind metoda Runge-Kutta de ordinul 4, sunt:  Pentru formula de treime: ( )  y y k k k i i +  = + + + + 1 0 1 2 3 2 2 6 / La cuprins

Upload: cornelgg474469

Post on 07-Aug-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lucr9

8/20/2019 Lucr9

http://slidepdf.com/reader/full/lucr9 1/8

L9-1

L9. Lucrarea 9: Integrarea ecua!iilor diferen!iale.Aplica!ie de integrare a ecua!iilor diferen!iale prin metode Euler sub EXCEL

În figura 5.15 este prezentat! o aplica"ie care ilustreaz! principiul de lucru cu metodele de integrare Euler direct! (simpl!) #i Euler perfec"ionat (Euler predictor corector).

Pentru simplitate a fost aleas! func"ia  y x= 2 a c!rei derivat! este ( )′ = = y f x y x, 2 .

Lucrarea decurge astfel:

• 

Se creaz! tabelul din domeniul C3:J7;•  Se completeaz! domeniul D3:J3 cu valorile abscisei x;•  Se completeaz!  domeniul D4:J4  cu valorile func"iei f(x,y), astfel: în celula D4  se introduce formula

=2*D3, apoi se copiaz! aceast! formul! pe restul domeniului, pâna la J4;•  Pentru compara"ie, se completeaz! domeniul D5:J5 cu formula analitic! a lui y, astfel: în celula D5  se

introduce formula =D3^2, apoi se extinde formula pe restul domeniului;•  Se completeaz! celula D6 cu valoarea ini"ial! y0, adic! 0;•  Se completeaz!  domeniul E6:J6  cu formula de integrare Euler direct!,

( ) ( ) yi

  yi

  xi

  xi

  f xi

  yi+

  = ++

  − ⋅1 1

, , astfel: în celula E6 se introduce formula =D6+D4*(E3-D3), apoi

se extinde aceast! formul! pe restul domeniului;•  Se completeaz! celula D7 cu valoarea ini"ial! y0, adic! 0;

• 

( )

( ) ( )  ( )

( ) y yi

  xi

  xi

  f xi

  yi

  f xi

  yi i+ += + ⋅ +   − ⋅ + +   11

100 5 1 1. , , , astfel: în celula E6  se introduce

formula =D7+0,5*(E3-D3)*(D4+E4) apoi se extinde aceast! formul! pe restul domeniului;Se observ!  c!, deoarece f(x,y) nu depinde de y, condi"ia lui Lipschitz este automat îndeplinit!  #i formula

 predictor corector a lui Euler d!, în acest caz, rezultate exacte, spre deosebire de cea direct!, a#a cum se vede dindiagrama din figur ! ca #i din tabel.

Fig.5.15.

Aplica!ie de integrare a ecua!iilor diferen!iale prin metode Runge-Kutta IV sub EXCEL

Se consider ! ecua"ia  y x= 2 2 , cu derivata ′ = y x . Pentru a integra ecua"ia ′ = y x  se va folosi mai întâi

formula Runge-Kutta de ordinul IV - varianta formulei de treime, #i apoi varianta formulei de optime, construindtabelele din figura 5.16.

Formulele dup!  care se rezolv!  o ecua"ie diferen"ial!  de forma ( )′ = y f x y,   cu condi"ia ini"ial!

( ) y x y0 0= , folosind metoda Runge-Kutta de ordinul 4, sunt:•  Pentru formula de treime:

( ) y y k k k k i i+   = + + + +1 0 1 2 32 2 6/

La cuprins

Page 2: Lucr9

8/20/2019 Lucr9

http://slidepdf.com/reader/full/lucr9 2/8

L9-2

( )k h f x yi i0  = ⋅ ,  ; ( )k h f x h y k  i i1 02 2= ⋅ + +/ , /

( )k h f x h y k  i i2 12 2= ⋅ + +/ , /  ; ( )k h f x h y k  i i1 2= ⋅ + +,•  Pentru formula de optime:

( ) y y k k k k i i+   = + + + +1 0 1 2 33 3 8/

( )k h f x y

i i0

 = ⋅ ,  ; ( )k h f x h y k  i i1 0

3 3= ⋅ + +/ , /

( )k h f x h y k k  i i2 1 02 3 3= ⋅ + + −/ , /  ; ( )k h f x h y k k k  i i1 2 1 0= ⋅ + + − +,

Pentru varianta formulei de treime se procedeaz! astfel:•  Se selecteaz! celula D3;

•  Din meniul Insert > Name > Define, se atribuie celulei D3 numele h;•  În celula D4 se introduce valoarea 0 pentru x0;•  În celula E4 se introduce formula =D4+h

•  Se extinde formula din celula E4 peste restul domeniului E4:J4

•  În celula D5 se introduce formula =D4 #i se extinde aceast! formul! peste restul domeniului D5:J5

•  În celula D6 se introduce formula =D4^2/2 #i se extinde aceast! formul! peste restul domeniului D6:J6

•  În celula E7 se introduce formula =h*D5 #i se extinde aceast! formul! peste restul domeniului E7:J7

• 

În celula E8 se introduce formula =D4+h/2 #i se extinde aceast! formul! peste restul domeniului E8:J8•  În celula E9 se introduce formula =h*E8 #i se extinde aceast! formul! peste restul domeniului E9:J9

•  În celula E10  se introduce formula =D4+h/2 #i se extinde aceast!  formul!  peste restul domeniuluiE10:J10

Fig.5.16.

•  În celula E11  se introduce formula =h*E10  #i se extinde aceast!  formul!  peste restul domeniuluiE11:J11

•  În celula E12 se introduce formula =D4+h #i se extinde aceast! formul! peste restul domeniului E12:J12

•  În celula E13  se introduce formula =h*E12  #i se extinde aceast!  formul!  peste restul domeniului

E13:J13

•  În celula D14 se completeaz! valoarea ini"ial! 0 pentru y•  În celula E14 se introduce formula =D14+(E7+2*E9+2*E11+E13)/6 #i se extinde aceast! formul! peste

restul domeniului E14:J14

Cu aceasta, tabelul de calcul pentru rezolvarea ecua"iei diferen"iale ′ = y x   prin metoda Runge-Kutta de

ordinul IV cu formula de treime, este terminat.

Page 3: Lucr9

8/20/2019 Lucr9

http://slidepdf.com/reader/full/lucr9 3/8

L9-3

Dac! se dore#te un alt pas, se modific! numai valoarea pasului de la celula D3.Pentru alt" valoare ini!ial" a lui y se modific! numai valoarea din celula D14.Pentru a extinde domeniul de integrare se procedeaz! astfel:•  Se selecteaz! domeniul J4:J14

•  Se extinde domeniul selectat spre dreapta cu num!rul de coloane dorite.

Pentru varianta formulei de optime se procedeaz! astfel:•  În celula D17 se introduce valoarea 0 pentru x0;

• 

În celula E17 se introduce formula =D17+h

•  Se extinde formula din celula E17 peste restul domeniului E17:J17

•  În celula D18 se introduce formula =D17 #i se extinde aceast! formul! peste restul domeniului D18:J18

•  În celula D19 se introduce formula =D17^2/2 #i se extinde aceast! formul! peste domeniul D19:J19

•  În celula E20 se introduce formula =h*D18 #i se extinde aceast! formul! peste domeniul E20:J20

•  În celula E21 se introduce formula =D17+h/3 #i se extinde aceast! formul! peste domeniul E21:J21

•  În celula E22 se introduce formula =h*E21 #i se extinde aceast! formul! peste domeniul E22:J22

•  În celula E23 se introduce formula =D17+2*h/3 #i se extinde aceast! formul! peste domeniul E23:J23

•  În celula E24 se introduce formula =h*E23 #i se extinde aceast! formul! peste domeniul E24:J24

•  În celula E25 se introduce formula =D17+h #i se extinde aceast! formul! peste domeniul E25:J25

•  În celula E26 se introduce formula =h*E25 #i se extinde aceast! formul! peste domeniul E26:J26

•  În celula D27 se completeaz! valoarea ini"ial! 0 pentru y

• 

În celula E27  se introduce formula =D27+(E20+3*E22+3*E24+E26)/8 #i se extinde aceast!  formul! peste domeniul E27:J27

Cu aceasta, tabelul de calcul pentru rezolvarea ecua"iei diferen"iale ′ = y x   prin metoda Runge-Kutta de

ordinul IV cu formula de optime, este terminat.Procedurile de schimbare a pasului, condi"iei ini"iale #i de extindere a domeniului de integrare sunt similare

cu cele de mai înainte.

Program pentru rezolvarea ecua!iilor diferen!iale de ordinul I (C++)#include <iostream.h>

#include <conio.h>

#include <alloc.h>

#include <math.h>

#include <stdlib.h>

typedef float ** M_PNT;

typedef float * V_PNT;

void progexit()

{cout << "\Spatiu de memorie insuficient"; exit(EXIT_FAILURE);}

M_PNT alocmtr(int dim)

{int i; M_PNT rez;

 if((rez=(M_PNT)calloc(dim,sizeof(V_PNT)))==NULL) progexit();

  else

  {for(i=0;i<dim;i++)

  if((rez[i]=(V_PNT)calloc(dim,sizeof(float)))==NULL) progexit();

  }

 return(rez);

}

V_PNT alocvect(int dim)

{V_PNT rez;

 if((rez=(V_PNT)calloc(dim,sizeof(float)))==NULL) progexit();

 return(rez);

}

float fxy(float x, float y){return x;}

void P_In(float *x0,float *y0,float *h,int *N)

{cout << "Introducerea datelor\n";

 cout << "x0="; cin >> *x0;

 cout << "y0="; cin >> *y0;

 cout << " h="; cin >> *h; cout << " N="; cin >> *N;

}

Page 4: Lucr9

8/20/2019 Lucr9

http://slidepdf.com/reader/full/lucr9 4/8

L9-4

void P_Out(char **Mes,float h,int N,V_PNT x,V_PNT y)

{int i;

 cout << "Rezultate pentru " << *Mes << ":\n";

 cout << "Pasul de integrare=" << h << "\n";

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

  cout << "x[" << i << "]=" << x[i] << " y[" << i << "]=" << y[i] << "\n";

}

void P_Euler(float x0,float y0,float h,int N,V_PNT x,V_PNT y){int i; float xx,yy;

 x[0]=x0; y[0]=y0;

 for(i=1;i<N;i++)

 {x[i]=x[i-1]+h; xx=x[i-1]; yy=y[i-1];

  y[i]=y[i-1]+h*fxy(xx,yy);

 }

}

void P_ED1()

{char *Mes[]={"metoda Euler directa"};

 float x0,y0,h; int N; V_PNT x,y;

 P_In(&x0,&y0,&h,&N); x=alocvect(N); y=alocvect(N);

 P_Euler(x0,y0,h,N,x,y); P_Out(Mes,h,N,x,y);

 free(x); free(y);}

void P_EulerPC(float x0,float y0,float h,int N,V_PNT x,V_PNT y)

{int i,iter,itermax=100;

 float xx,yy,tst,psi,yc,eps=1e-3;

 x[0]=x0; y[0]=y0;

 for(i=1;i<N;i++)

 {x[i]=x[i-1]+h;

  /*predictor*/

  xx=x[i-1]; yy=y[i-1]; y[i]=y[i-1]+h*fxy(xx,yy);

  /*corector*/

  iter=1;

  do  {xx=x[i-1]; yy=y[i-1]; psi=fxy(xx,yy)/2;

  xx=x[i]; yy=y[i]; psi+=fxy(xx,yy)/2; yc=y[i-1]+h*psi;

  tst=fabs(yc-y[i]); y[i]=yc; iter++;

  } while((tst>=eps)&&(iter<=itermax));

 }

}

void P_ED2()

{char *Mes[]={"metoda Euler predictor-corector"};

 float x0,y0,h; int N; V_PNT x,y;

 P_In(&x0,&y0,&h,&N); x=alocvect(N); y=alocvect(N);

 P_EulerPC(x0,y0,h,N,x,y); P_Out(Mes,h,N,x,y);

 free(x); free(y);

}

void P_RK_I(float x0,float y0,float h,int N,V_PNT x,V_PNT y)

{int i; float xx,yy,k0;

 x[0]=x0; y[0]=y0;

 for(i=1;i<N;i++) x[i]=x[i-1]+h;

 for(i=0;i<N-1;i++){xx=x[i]; yy=y[i]; k0=h*fxy(xx,yy); y[i+1]=y[i]+k0;}

}

void P_ED3()

{char *Mes[]={"metoda Runge-Kutta I"};

 float x0,y0,h; int N; V_PNT x,y;

 P_In(&x0,&y0,&h,&N); x=alocvect(N); y=alocvect(N);

 P_RK_I(x0,y0,h,N,x,y); P_Out(Mes,h,N,x,y);

 free(x); free(y);}

void P_RK_II(float x0,float y0,float h,int N,V_PNT x,V_PNT y)

Page 5: Lucr9

8/20/2019 Lucr9

http://slidepdf.com/reader/full/lucr9 5/8

L9-5

{int i; float xx,yy,k0,k1;

 x[0]=x0; y[0]=y0;

 for(i=1;i<N;i++) x[i]=x[i-1]+h;

 for(i=0;i<N-1;i++)

 {xx=x[i]; yy=y[i]; k0=h*fxy(xx,yy);

  xx=x[i]+h; yy=y[i]+k0; k1=h*fxy(xx,yy);

  y[i+1]=y[i]+(k0+k1)/2;

 }

}

void P_ED4()

{char *Mes[]={"metoda Runge-Kutta II"};

 float x0,y0,h; int N; V_PNT x,y;

 P_In(&x0,&y0,&h,&N); x=alocvect(N); y=alocvect(N);

 P_RK_II(x0,y0,h,N,x,y); P_Out(Mes,h,N,x,y);

 free(x); free(y);

}

void P_RK_III(float x0,float y0,float h,int N,V_PNT x,V_PNT y)

{int i; float xx,yy,k0,k1,k2;

 x[0]=x0; y[0]=y0;

 for(i=1;i<N;i++) x[i]=x[i-1]+h;

 for(i=0;i<N-1;i++) {xx=x[i]; yy=y[i]; k0=h*fxy(xx,yy);

  xx=x[i]+h/2; yy=y[i]+k0/2; k1=h*fxy(xx,yy);

  xx=x[i]+h; yy=y[i]-k0+2*k1; k2=h*fxy(xx,yy);

  y[i+1]=y[i]+(k0+4*k1+k2)/6;

 }

}

void P_ED5()

{char *Mes[]={"metoda Runge-Kutta III"};

 float x0,y0,h; int N; V_PNT x,y;

 P_In(&x0,&y0,&h,&N); x=alocvect(N); y=alocvect(N);

 P_RK_III(x0,y0,h,N,x,y); P_Out(Mes,h,N,x,y);

 free(x); free(y);}

void P_RK_IV(float x0,float y0,float h,int N,V_PNT x,V_PNT y)

{int i; float xx,yy,k0,k1,k2,k3;

 x[0]=x0; y[0]=y0;

 for(i=1;i<N;i++) x[i]=x[i-1]+h;

 for(i=0;i<N-1;i++)

 {xx=x[i]; yy=y[i]; k0=h*fxy(xx,yy);

  xx=x[i]+h/2; yy=y[i]+k0/2; k1=h*fxy(xx,yy);

  xx=x[i]+h/2; yy=y[i]+k1/2; k2=h*fxy(xx,yy);

  xx=x[i]+h; yy=y[i]+k2; k3=h*fxy(xx,yy);

  y[i+1]=y[i]+(k0+2*k1+2*k2+k3)/6;

 }

}

void P_ED6()

{char *Mes[]={"metoda Runge-Kutta IV"};

 float x0,y0,h; int N; V_PNT x,y;

 P_In(&x0,&y0,&h,&N); x=alocvect(N); y=alocvect(N);

 P_RK_IV(x0,y0,h,N,x,y); P_Out(Mes,h,N,x,y);

 free(x); free(y);

}

void P_AB(float x0,float y0,float h,int N,V_PNT x,V_PNT y)

{int i; float xx,yy,k0,k1,f1,f2;

 x[0]=x0; y[0]=y0;

 for(i=1;i<N;i++) x[i]=x[i-1]+h;

 /*RK_II*/ xx=x[0]; yy=y[0]; k0=h*fxy(xx,yy);

 xx=x[0]+h; yy=y[0]+k0; k1=h*fxy(xx,yy);

 y[1]=y[0]+(k0+k1)/2;

Page 6: Lucr9

8/20/2019 Lucr9

http://slidepdf.com/reader/full/lucr9 6/8

L9-6

 /*AB_I*/

 for(i=1;i<N-1;i++)

 {xx=x[i-1]; yy=y[i-1]; f1=fxy(xx,yy);

  xx=x[i]; yy=y[i]; f2=fxy(xx,yy);

  y[i+1]=y[i]+h/2*(3*f2-f1);

 }

}

void P_ED7(){char *Mes[]={"metoda Adams-Bashforth"};

 float x0,y0,h; int N; V_PNT x,y;

 P_In(&x0,&y0,&h,&N); x=alocvect(N); y=alocvect(N);

 P_AB(x0,y0,h,N,x,y); P_Out(Mes,h,N,x,y);

 free(x); free(y);

}

void P_AM(float x0,float y0,float h,int N,V_PNT x,V_PNT y)

{int i,iter,itermax=1000;

 float xx,yy,k0,k1,k2,f1,f2,f3,tst,eps=1e-10;

 x[0]=x0; y[0]=y0;

 for(i=1;i<N;i++) x[i]=x[i-1]+h;

 /*RK_III*/

 for(i=0;i<N-1;i++) {xx=x[i]; yy=y[i]; k0=h*fxy(xx,yy);

  xx=x[i]+h/2; yy=y[i]+k0/2; k1=h*fxy(xx,yy);

  xx=x[i]+h; yy=y[i]-k0+2*k1; k2=h*fxy(xx,yy);

  y[i+1]=y[i]+(k0+4*k1+k2)/6;

 }

 /*AM_I*/

 for(i=1;i<N-1;i++)

 {iter=1;

  do

  {tst=y[i+1];

  xx=x[i-1]; yy=y[i-1]; f1=fxy(xx,yy);

  xx=x[i]; yy=y[i]; f2=fxy(xx,yy);

  xx=x[i+1]; yy=y[i+1]; f3=fxy(xx,yy);  y[i+1]=y[i]+h/12*(-f1+8*f2+5*f3);

  tst=fabs(tst-y[i+1]); iter++;

  } while((tst>=eps)&&(iter<=itermax));

 }

}

void P_ED8()

{char *Mes[]={"metoda Adams-Moulton"};

 float x0,y0,h; int N; V_PNT x,y;

 P_In(&x0,&y0,&h,&N); x=alocvect(N); y=alocvect(N);

 P_AM(x0,y0,h,N,x,y); P_Out(Mes,h,N,x,y);

 free(x); free(y);

}

void main()

{char ch; int corect=0,selcaz;

 clrscr();

 cout << "*************************************************\n";

 cout << "Program ECDIF-Ecuatii diferentiale de ordinul unu\n";

 cout << "*************************************************\n\n";

 cout << " Selectati metoda \n\n";

 cout << "1:Euler direct\n2:Euler predictor corector\n";

 cout << "3:Runge-Kutta I\n4:Runge-Kutta II\n";

 cout << "5:Runge-Kutta III\n6:Runge-Kutta IV\n";

 cout << "7:Adams-Bashforth\n8:Adams-Moulton\n";

 while(corect==0)

 {cin >> selcaz;  switch (selcaz)

  {case 1: P_ED1(); corect=1; break;

  case 2: P_ED2(); corect=1; break;

Page 7: Lucr9

8/20/2019 Lucr9

http://slidepdf.com/reader/full/lucr9 7/8

L9-7

  case 3: P_ED3(); corect=1; break;

  case 4: P_ED4(); corect=1; break;

  case 5: P_ED5(); corect=1; break;

  case 6: P_ED6(); corect=1; break;

  case 7: P_ED7(); corect=1; break;

  case 8: P_ED8(); corect=1; break;

  default: cout << "Selectie eronata! Mai incercati.\n";

  }

 }

 ch=getch();

}

Program pentru rezolvarea sistemelor de ecua!ii diferen!iale de ordinul I (C++)

În programul urm!tor, func"ia f xy(x,y1,y2) a fost proiectat! pentru sistemul de ecua"ii diferen"iale de ordinul 1:

′ =

′  =

 y x

 y y

1

2 1

cu condi"iile ini"iale Cauchy ( ) ( ) x y x y x0 1 0 2 00 0 0= = =, , ,

cu solu"ia analitic!: ( ) ( ) y x x

 y x x

1

2

2

3

2 6= =;

#include <iostream.h>

#include <conio.h>#include <alloc.h>

#include <math.h>

#include <stdlib.h>

typedef float ** M_PNT;

typedef float * V_PNT;

void progexit()

{cout << "\Spatiu de memorie insuficient"; exit(EXIT_FAILURE);}

M_PNT alocmtr(int dim1,int dim2)

{int i; M_PNT rez;

  if((rez=(M_PNT)calloc(dim1,sizeof(V_PNT)))==NULL) progexit();

  else

  {for(i=0;i<dim2;i++)

  if((rez[i]=(V_PNT)calloc(dim2,sizeof(float)))==NULL) progexit();

  }

 return(rez);

}

V_PNT alocvect(int dim)

{V_PNT rez;

 if((rez=(V_PNT)calloc(dim,sizeof(float)))==NULL) progexit();

 return(rez);

}

float fxy(int j,float x, float y1, float y2)

{if(j==0) return x;

 if(j==1) return y1;

}

void P_In1(float *x0,float *h,int *m,int *N)

{cout << "Introducerea datelor\n";

 cout << "x0="; cin >> *x0;

 cout << "h ="; cin >> *h;

 cout << "N ="; cin >> *N;

 cout << "m ="; cin >> *m;

 }

void P_In2(int m,V_PNT y0)

{int j;

 for(j=0;j<m;j++){cout << "y0[" << j << "]="; cin >> y0[j];}

}

void P_Out(int m,int N,V_PNT x,M_PNT y)

{int i;

 cout << "Rezultate pentru metoda Runge-Kutta IV\n";

Page 8: Lucr9

8/20/2019 Lucr9

http://slidepdf.com/reader/full/lucr9 8/8

L9-8

 cout << "aplicata la rezolvarea sistemului de\n";

 cout << "ecuatii diferentiale de ordinul " << m << "\n";

 cout << "-------i-------------x-------------y1-------------y2-------\n";

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

 {cout.width(15); cout << i;

  cout.width(15); cout << x[i];

  cout.width(15); cout << y[0][i];

  cout.width(15); cout << y[1][i] << "\n";

 }

}

void S_RK_IV(float x0,float h,int m,int N,V_PNT x,V_PNT y0,M_PNT y)

{int i,j;

 float xx,y1,y2;

 V_PNT k1,k2,k3,k4;

 k1=alocvect(m); k2=alocvect(m);

 k3=alocvect(m); k4=alocvect(m);

 x[0]=x0;

 for(i=1;i<N;i++) x[i]=x[i-1]+h;

 for(j=0;j<m;j++) y[j][0]=y0[j];

 for(i=0;i<N-1;i++)

 {xx=x[i]; y1=y[0][i]; y2=y[1][i];  for(j=0;j<m;j++) k1[j]=h*fxy(j,xx,y1,y2);

  xx=x[i]+h/2; y1=y[0][i]+k1[0]/2; y2=y[1][i]+k1[1]/2;

  for(j=0;j<m;j++) k2[j]=h*fxy(j,xx,y1,y2);

  xx=x[i]+h/2; y1=y[0][i]+k2[0]/2; y2=y[1][i]+k2[1]/2;

  for(j=0;j<m;j++) k3[j]=h*fxy(j,xx,y1,y2);

  xx=x[i]+h; y1=y[0][i]+k3[0]; y2=y[1][i]+k3[1];

  for(j=0;j<m;j++) k4[j]=h*fxy(j,xx,y1,y2);

  for(j=0;j<m;j++) y[j][i+1]=y[j][i]+(k1[j]+2*k2[j]+2*k3[j]+k4[j])/6;

 }

 free(k1); free(k2); free(k3); free(k4);

}

void main()

{float x0,h; int j,m,N; V_PNT x,y0; M_PNT y; char ch;

 clrscr();

 cout << "******************************************************\n";

 cout << " Program S_ECDIF-Sisteme de ec. dif. de ordinul unu \n";

 cout << "******************************************************\n\n";

 P_In1(&x0,&h,&m,&N);

 y0=alocvect(m);

 P_In2(m,y0);

 x=alocvect(N); y=alocmtr(m,N);

 S_RK_IV(x0,h,m,N,x,y0,y);

 P_Out(m,N,x,y);

 free(x); free(y0);

 for(j=0;j<m;j++) free(y[j]); free(y); ch=getch();

}

Rulând acest program pentru datele de intrare:x0=0; y10=0; y20=0; h=0.01; N=51; m=2;se ob"ine setul de rezultate:-------i-------------x-------------y1-------------y2-------

  0 0 0 0

1 0.01 5e-05 1.666667e-07

2 0.02 0.0002 1.333333e-06

3 0.03 0.00045 4.5e-06

............................................................

  48 0.48 0.1152 0.018432

  49 0.49 0.12005 0.019608

  50 0.50 0.125 0.020833