lucr9
TRANSCRIPT
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
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.
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;
}
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)
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;
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;
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";
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