الفرنسية: Méthode de Gauss-Legendre
المبدأ
الحساب العددي لـ I =
نجزئ مجال الاندماج [a, b] إلى n مجال ذي طول يساوي h = ،محدودة بنقط التجزيء
xi = a + nh , i = 0,... N (هو خطوة التكامل).
طريقة جوص-ليجندر ذات الرتبة k، في كل مجال [xi, xi+1], i = 0,... n-1،
نستبدل f بحدوديتها الإستكمالية من الدرجة k المار من النقط rkj, j = 0,... k ذاتrkj الأفاصيل،
بحيث جدور الحدودية من الدرجة k+1 نكتب Pk+1(x)
P0(x) = 1, P1(x) = x
kPk(x) = (2k-1)xPk-1(x) - (k-1)Pk-2(x) k = 2,3,...
وهكذا....
الخوارزم
مع
الارتياب
مثال
نعتبر التكامل المعرف:
القيمة المضبوط لهذا التكامل هوLog(2)
حساب لـ k = 1 و n = 1
G1(1) = G10 = (1/2)(α10 f((r10+1)/2) + α11 f((r11+1)/2) )
r10 = -1/?3
r11 = 1/?3
?10 = 2(1-r102)/22P12(r10) = (1-r102)/2r102 = 1
?11 = 2(1-r112)/22P12(r11) = (1-r112)/2r112 = 1
G1(1) = (1/2)(2/(r10+3) + 2/(r11+3)) = 9/13
البرمجة
#include <math.h> #include <conio.h>
double qu_f(double x) { return(1/(x+1)); }
double qu_pol_leg(int k,double x); double qu_gauss_legendre(double a,double b,int k,int n);
main() { int k,n; double a,b,t; double vr_val; clrscr(); a=0;b=1; vr_val=log(2); printf("Méthode de Gauss-Legendre\n"); printf("Vraie valeur = %.17e\n",vr_val); for(k=1;k<=4;k++) { printf("\n n Rang k =%2d Erreur\n",k); for(n=1;n<=pow(2,7-k);n*=2) { t=qu_gauss_legendre(a,b,k,n); printf("%4d %.17e %.3e\n",n,t,fabs(t-vr_val)); } } }
نتيجة البرنامج
في كل كرة، البرنامج يظهر قيمة n وقيمة المحسوبة والارتياب
طريقة كوص_ليجندر القيمة الحقيقية= 6.9314718055994529e-01
n k = 1 الارتياب رتبة
1 6.9230769230769240e-01 8.39e-04
2 6.9307663828211785e-01 7.05e-05
4 6.9314229275520722e-01 4.89e-06
8 6.9314686592308472e-01 3.15e-07
16 6.9314716074324423e-01 1.98e-08
32 6.9314717931898939e-01 1.24e-09
64 6.9314718048234780e-01 7.76e-11
n k = 2 الارتياب رتبة
1 6.9312169312169292e-01 2.55e-05
2 6.9314649582905896e-01 6.85e-07
4 6.9314716741229765e-01 1.31e-08
8 6.9314718034133038e-01 2.19e-10
16 6.9314718055647218e-01 3.47e-12
32 6.9314718055989044e-01 5.48e-14
n k = 3 الارتياب رتبة
1 6.9314641744548300e-01 7.63e-07
2 6.9314717375355972e-01 6.81e-09
4 6.9314718052271163e-01 3.72e-11
8 6.9314718055978353e-01 1.62e-13
16 6.9314718055994473e-01 5.55e-16
n k = 4 الارتياب رتبة
1 6.9314715785304037e-01 2.27e-08
2 6.9314718049130386e-01 6.86e-11
4 6.9314718055983615e-01 1.09e-13
8 6.9314718055994529e-01 0.00e+00
الدالة الرئيسية qu_gauss_legendre
معايير هذه الدالة هي كالتالي:
a و b: حدي المجال [a, b]
k: درجة الطريقة.
n : عدد المجالات الصغيرة (ذي الطول h).
تستدعي الدالة الرئيسة دالة أخرى هي كالتالي:
double qu_f(double x)
التي يجب أن تعرف في البرنامج الأساسي وهي تمثل الدالة الرياضية f.
وأيضا الدالة التالية يتم استدعائها من طرف الطريقة الرئيسية:
double qu_pol_leg(int k,double x)
{
int i;
double p,p1,p2;
p=1;p1=0;p2=0;
for(i=1;i<=k;i++)
{
p2=p1;p1=p;
p=((2*i-1)*x*p1-(i-1)*p2)/i;
}
return(p);
}
وكل الدوال يجب تعريفها في البرنامج الرئيسي.
double qu_gauss_legendre(double a,double b,int k,int n)
{
int i,j;
double h,x,r,alpha,pol,s,t,rac[5];
switch(k) {
case 0:rac[0]=0.0;break;
case 1:rac[0]=1.0/sqrt(3.0);rac[1]=-rac[0];break;
case 2:rac[0]=sqrt(3.0/5.0);rac[1]=0.0;rac[2]=-rac[0];break;
case 3:rac[0]=sqrt((15+2*sqrt(30))/35);rac[1]=sqrt((15-2*sqrt(30))/35);
rac[2]=-rac[1];rac[3]=-rac[0];break;
case 4:rac[0]=sqrt((35+2*sqrt(70))/63);rac[1]=sqrt((35-2*sqrt(70))/63);
rac[2]=0.0;rac[3]=-rac[1];rac[4]=-rac[0];break;
}
h=(b-a)/n;
x=a;
t=0;
for(i=1;i<=n;i++)
{
s=0.0;
for(j=0;j<=k;j++)
{
r = rac[j];
pol = qu_pol_leg(k,r);
alpha = 2.0*(1.0-r*r)/((k+1)*(k+1)*pol*pol);
s += alpha*qu_f(h/2*(1+r)+x);
}
t += h/2*s;
x += h;
}
return(t);
}