الإنجليزية: Euler Cauchy Method
الفرنسية: Méthode d'Euler Cauchy
المبدأ
حل رقميا y'(x) = f(x, y(x))
بحيث
x [a, b] y(a) = y0
نجزئ مجال الاندماج [a, b] إلى N مجال ذي طول يساوي h = ،
محدودة بنقط التجزيء xn = a + nh , n = 0,... N .
لكل أفصول xn ،نحسب القيمة المقربةyn للقيمة الصحيحةy(xn) لدالة y.
لهدا نبدل ميل المماس f(xn, yn) بمتوسط هدا الميل مع القيمة المصححة فيxn+1 في صيغة أولير.
الخوارزم
مثال
نعتبر مشكلة كوشي:
مع y(0) = 1
الحل المضبوط هو :
احسب رقميا قيمy(x) لـ x = 0, 0.1, 0.2, ..., 1 بأخد لـ N القوى المتتالية لـ 10.
الخطوتين الأولتين لـ N = 10
h = 1/10
x0 = 0 , y0 = 1
x1 = 1/10
y1 = y0 + (h/2)( f(x0, y0)+f(x0+h, y0+h f(x0, y0)))
= y0 - (h/2)(y02+( y0 -hy02 )2)
= 1 - (1/20)(12+(1-(1/10)12)2)
= 1819/2000
x2 = 2/10
y2 = y1 + (h/2)( f(x1, y1)+f(x1+h, y1+h f(x1, y1)))
= y1 - (h/2)(y12+( y1 -hy12 )2)
= 1819/2000 - (1/20)((1819/2000)2+(1819/2000-(1/10)(1819/2000)2)2)
البرمجة
#include <math.h> #include <conio.h>
double ed_f(double x,double y) { return(-y*y); }
double ed_solution(double x) { return(1.0/(1.0+x)); }
long ed_euler_cauchy(double a,double b,double y,long n,double res[101][2]); void ed_affichage(double a,double b,long n,long nmax,double res[101][2],int nbpts);
main() { int nbpts; long n,nmax; double a,b,y0; double res[101][2]; clrscr(); nbpts=10; a=0;b=1;y0=1; printf("Méthode d'Euler-Cauchy\n"); for(n=10;n<=10000;n*=10) { nmax=ed_euler_cauchy(a,b,y0,n,res); ed_affichage(a,b,n,nmax,res,nbpts); printf(" taux = %.3e\n", fabs(res[nmax][1]-ed_solution(res[nmax][0]))*n*n); } }
نتيجة البرنامج
-
في كل خطوة البرنامج يظهر:
-
قيمة xn
-
قيمة yn
-
الارتياب (الفرق بين ynالمحسوبة والقيمة المضبوطةy(xn) )
ويظهر أيضا ،لكل قيمة h، نسبة التقارب، العلاقة بين الارتياب وh2 في نقطة اعتباطية من المجال (نختار x = 1 )
h = 0.1000
xn yn الارتياب
0.0000 1.0000000000000000e+00 0.00e+00
0.1000 9.0949999999999998e-01 4.09e-04
0.2000 8.3396214846890249e-01 6.29e-04
0.3000 7.6997115403838756e-01 7.40e-04
0.4000 7.1507467430115557e-01 7.89e-04
0.5000 6.6746716934952444e-01 8.01e-04
0.6000 6.2579033562771691e-01 7.90e-04
0.7000 5.8900298033961918e-01 7.68e-04
0.8000 5.5629374665503883e-01 7.38e-04
0.9000 5.2702111163636556e-01 7.05e-04
1.0000 5.0067122128275432e-01 6.71e-04
نسبة = 6.71e-02
h = 0.0100
xn yn الارتياب
0.0000 1.0000000000000000e+00 0.00e+00
0.1000 9.0909470137414994e-01 3.79e-06
0.2000 8.3333917324553641e-01 5.84e-06
0.3000 7.6923765696640956e-01 6.89e-06
0.4000 7.1429306526662695e-01 7.35e-06
0.5000 6.6667413571001111e-01 7.47e-06
0.6000 6.2500738366174291e-01 7.38e-06
0.7000 5.8824247460205625e-01 7.18e-06
0.8000 5.5556246758329719e-01 6.91e-06
0.9000 5.2632240025000077e-01 6.61e-06
1.0000 5.0000629686925135e-01 6.30e-06
نسبة = 6.30e-02
h = 0.0010
xn yn الارتياب
0.0000 1.0000000000000000e+00 0.00e+00
0.1000 9.0909094669249346e-01 3.76e-08
0.2000 8.3333339125673489e-01 5.79e-08
0.3000 7.6923083756607158e-01 6.83e-08
0.4000 7.1428578723447389e-01 7.29e-08
0.5000 6.6666674080246002e-01 7.41e-08
0.6000 6.2500007330169050e-01 7.33e-08
0.7000 5.8823536541378374e-01 7.13e-08
0.8000 5.5555562419600368e-01 6.86e-08
0.9000 5.2631585513098234e-01 6.57e-08
1.0000 5.0000006254687424e-01 6.25e-08
نسبة = 6.25e-02
h = 0.0001
xn yn الارتياب
0.0000 1.0000000000000000e+00 0.00e+00
0.1000 9.0909090946660254e-01 3.76e-10
0.2000 8.3333333391208975e-01 5.79e-10
0.3000 7.6923076991357764e-01 6.83e-10
0.4000 7.1428571501463878e-01 7.29e-10
0.5000 6.6666666740746761e-01 7.41e-10
0.6000 6.2500000073247952e-01 7.32e-10
0.7000 5.8823529483009662e-01 7.12e-10
0.8000 5.5555555624147845e-01 6.86e-10
0.9000 5.2631579012980312e-01 6.56e-10
1.0000 5.0000000062504335e-01 6.25e-10
نسبة = 6.25e-02
a و b : حدي المجال [a, b]
y : الشرط البدئي y0 = y(a) = y(x0)i
n : عدد المجالات الصغيرة (ذات الطول h)
res : جدول لحفظ القيم (xn, yn)
long ed_euler_cauchy(double a,double b,double y,long n,double res[101][2])
{
double x,h,fxy,tol,xx,exx;
long i,j;
h=(b-a)/n;
tol=h/2;
x=a;
res[0][0]=a;
res[0][1]=y;
j=1;
for(i=1;i<=n;i++)
{
fxy=ed_f(x,y);
y += h*(fxy+ed_f(x+h,y+h*fxy))/2;
x += h;
xx=x-a;
exx=floor(100*xx+0.5)/100;
if(fabs(exx-xx)<tol)
{
res[j][0]=x;
res[j][1]=y;
j++;
}
}
return(j-1);
}
دالة الإظهار ed_affichage
معايير دالة الإظهار هي كالتالي:
-
a و b : حدي المجال [a, b]
n : عدد المجالات الصغيرة (ذات الطول h)
nmax : العدد الأقصى للقيم المحتفظ بها
res : جدول يحفظ القيم (xn, yn)
nbpts : عدد القيم المسموح لها بالإظهار على الشاشة
وهي بدورها تستدعي الدالة التالية:
double ed_solution(double x)
التي يجب أن تعرف في البرنامج الرئيسي وتعطى الحل الحقيقي لـ y.
ستقوم دالة الإظهار بإظهار جزئي للقيم (nbpts قيمة كأقصى حد) المحفوظة في الجدول res. وتظهر أيضا نسبة الخطأ، أي الفرق بينالقيمة الحقيقية y(xn)i للحل y(x)i والقيمة المقربة لـ yn.
void ed_affichage(double a,double b,long n,long nmax,double res[101][2],int nbpts)
{
double h,x;
long i;
h=(b-a)/n;
printf("h = %.4f\n",h);
printf(" xn yn Erreur\n");
if(nmax<nbpts)
for(i=0;i<=nmax;i++)
printf("%8.4f %.17e %.3e\n", res[i][0],res[i][1],fabs(ed_solution(res[i][0])-res[i][1]));
else
{
for(i=0;i<=nmax;i++)
{
x=floor(res[i][0]*nbpts+0.5)/nbpts;
if(fabs(x-res[i][0])<0.005)
printf("%8.4f %.17e %.3e\n", x,res[i][1],fabs(ed_solution(res[i][0])-res[i][1]));
}
}
}