أنت هنا:برمجها»التحليل الرقمي»التربيع الرقمي»طريقة غوص ليجندر
طريقة غوص ليجندر طريقة غوص ليجندر
قيم الموضوع
(1 تصويت)

 
 

مصطلحات
العربية: طريقة غوص ليجندر
الإنجليزية: Gauss-Legendre Method
الفرنسية: 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: حدي المجال [ab]
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);
}
مقالات أخرى من نفس الفئة « طريقة رومبرغ

أضف تعليقا


إصنعها يريد أن يتأكد أنك لست روبوتا، لذلك أحسب ما يلي:

كود امني
تحديث