الإنجليزية: Euler Method
الفرنسية: Méthode d'Euler
المبدأ
نجزئ المجال [a, b] إلى N مجال مصغر ذي طول يساوي h = ،
المجالات المصغرة محدودة بنقط التجزيء xn = a + nh , n = 0,... N.
لكل أفصول xn، نحسب القيمة المقربة yn للقيمة الصحيحة y(xn) لدالة y.
لهذا، نعتبر مماس في (xn, yn) للمنحنى التام المار من نقطه، القيمةyn+1 هي أرتوب نقطة هدا المستقيم ذي أفصول 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 f(x0, y0)
= y0 - h y02
= 1 - (1/10)12
= 9/10
x2 = 2/10
y2 = y1 + h f(x1, y1)
= y1 - h y12
= (9/10) - (1/10)(9/10)2
= 819/1000
البرمجة
#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(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\n"); for(n=10;n<=10000;n*=10) { nmax=ed_euler(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); } }
نتيجة البرنامج
-
في كل خطوة البرنامج يظهر:
قيمة xn
قيمة yn
الارتياب (الفرق بين yn المحسوبة والقيمة المضبوطةy(xn) )
ويظهر أيضا، لكل قيمة، نسبة التقارب، العلاقة بين الارتياب وفي نقطة إعتباطية من المجال (نختارx = 1 )
xn yn الارتياب
0.0000 1.0000000000000000e+00 0.00e+00
0.1000 9.0000000000000002e-01 9.09e-03
0.2000 8.1900000000000006e-01 1.43e-02
0.3000 7.5192390000000009e-01 1.73e-02
0.4000 6.9538494486087910e-01 1.89e-02
0.5000 6.4702892270696233e-01 1.96e-02
0.6000 6.0516428002502909e-01 1.98e-02
0.7000 5.6854189944320788e-01 1.97e-02
0.8000 5.3621791030095878e-01 1.93e-02
0.9000 5.0746494556820609e-01 1.89e-02
1.0000 4.8171287847015187e-01 1.83e-02
نسبة = 1.83e-01
h = 0.0100
xn yn الارتياب
0.0000 1.0000000000000000e+00 0.00e+00
0.1000 9.0829282588834559e-01 7.98e-04
0.2000 8.3205259796437259e-01 1.28e-03
0.3000 7.6766248975763363e-01 1.57e-03
0.4000 7.1255342431233093e-01 1.73e-03
0.5000 6.6484990411095146e-01 1.82e-03
0.6000 6.2315052002916993e-01 1.85e-03
0.7000 5.8638691400614118e-01 1.85e-03
0.8000 5.5373029959869036e-01 1.83e-03
0.9000 5.2452781589306963e-01 1.79e-03
1.0000 4.9825816164586700e-01 1.74e-03
نسبة = 1.74e-01
h = 0.0010
xn yn الارتياب
0.0000 1.0000000000000000e+00 0.00e+00
0.1000 9.0901203784010098e-01 7.89e-05
0.2000 8.3320657680096466e-01 1.27e-04
0.3000 7.6907536755137540e-01 1.55e-04
0.4000 7.1411389036029838e-01 1.72e-04
0.5000 6.6648631430783711e-01 1.80e-04
0.6000 6.2481627065328638e-01 1.84e-04
0.7000 5.8805156369036982e-01 1.84e-04
0.8000 5.5537402970003502e-01 1.82e-04
0.9000 5.2613789141912859e-01 1.78e-04
1.0000 4.9982662405687811e-01 1.73e-04
نسبة = 1.73e-01
h = 0.0001
xn yn الارتياب
0.0000 1.0000000000000000e+00 0.00e+00
0.1000 9.0908303119289890e-01 7.88e-06
0.2000 8.3332067067247628e-01 1.27e-05
0.3000 7.6921524315425815e-01 1.55e-05
0.4000 7.1426854579220944e-01 1.72e-05
0.5000 6.6664864454004780e-01 1.80e-05
0.6000 6.2498163914253235e-01 1.84e-05
0.7000 5.8821693205906611e-01 1.84e-05
0.8000 5.5553741289040837e-01 1.81e-05
0.9000 5.2629800859634635e-01 1.78e-05
1.0000 4.9998267042955358e-01 1.73e-05
نسبة = 1.73e-01
الدالة الرئيسية ed_euler
معايير هذه الدالة هي كالتالي:
-
a و b : حدي المجال [a, b]
-
y : الشرط البدئي y0 = y(a) = y(x0)i
-
n : عدد المجالات الصغيرة (ذات الطول h)
-
res : جدول لحفظ القيم (xn, yn)
تستدعي الدالة الرئيسية الدالة التالية التي يجب تعريفها في البرنامج الرئيسي أيضا:
double ed_f(double x,double y)
تمثل هذه الدالة الدالة الرياضية f .
يتم حساب القيم التقريبية لـ y(x)i من خلال طريقة أولير. وترجع بعدد القيم (xn, yn) المحفوظة (أقصى حد هو 100) ;
سيتم حفظ هذه القيم في الجدول res : حيث سيحتوي العمود 0 على قيم xn بينما سيمثل العمود 1 قيم yn المقابلة.
long ed_euler(double a,double b,double y,long n,double res[101][2])
{
double x,h,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++)
{
y += h*ed_f(x,y);
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]));
}
}
}