الفرنسية: Méthode de trapèzes
المبدأ
الحساب العددي لـ I =
نجزئ المجال الاندماج [a, b] إلى n مجال ذي طول يساوي h = ،محدودة بنقط التجزيء
xi = a + nh , i = 0,... N (هو خطوة التكامل).
في كل مجال [xi, xi+1], i = 0,... n-1 ، نستبدل f بحدود يتها الإستكمالية من الدرجة 1 المار من النقط
(xi, f(xi)) و(xi+1, f(xi+1))،
و نستنتج القيمة المقربة لI.
الصيغة القاعدة (n=1)
الصيغة التركيب
الارتياب:
الصيغة التكييفية
نأخذ لـ n قوى 2:
تهيئ: نحصل T(h0)على باستعمال صيغة القاعدة
تكرار
مثال
نعتبر التكامل المعرف:
القيمة المضبوط لهذا التكامل هو Log(2)
حساب الرقمي لقيمة I .
نستعمل هنا الصيغة التكييفية .
الكرتان الأوليتان
f(a) = f(0) = 1/(0+1) = 1
f(b) = f(1) = 1/(1+1) = 1/2
تهيئ (صيغة القاعدة):
T(1) = (1/2)(f(0)+f(1)) = (1/2)(1+1/2) = 3/4
f(1/2) = 1/(1/2+1) = 2/3
T (1/2) = T(1)/2 + (1/2)f(1/2) = (3/4)/2 + (1/2)(2/3) = 17/24
f(1/4) = 1/(1/4+1) = 4/5
f(3/4) = 1/(3/4+1) = 4/7
T (1/4) = T(1/2)/2 + (1/4)(f(1/4)+f(3/4)) = (17/24)/2 + (1/4)((4/5)+(4/7)) = 1171/1680
البرمجة
#include <math.h> #include <conio.h> #define ITERMAX 23
double qu_f(double x) { return(1/(x+1)); }
void qu_trapezes_adapt(double a,double b,double eps,double t[ITERMAX]);
main() { int i; long n; double a,b,eps,vr_val,er; double t[ITERMAX]; clrscr(); a=0;b=1; printf("Méthode des trapèzes (formule adaptative)\n"); vr_val=log(2); printf("Vraie valeur = %.17e\n",vr_val); eps=1e-15; qu_trapezes_adapt(a,b,eps,t); printf(" n Valeur calculée Erreur Taux\n"); n=1; for(i=0;i<ITERMAX;i++) { er=fabs(t[i]-vr_val); printf("%7ld %.17e %.3e %.3e\n",n,t[i],er,er*n*n); n*=2; } }
نتيجة البرنامج
في كل كرة، البرنامج يظهر قيمة n وقيمة ترابيز والارتياب ونسبة التقارب (نسبة الخطأ وتربيع القيمة h).
القيمة الحقيقية= 6.9314718055994529e-01
النسبة الارتياب n القيمة المحسوبة
1 7.5000000000000000e-01 5.69e-02 5.69e-02
2 7.0833333333333326e-01 1.52e-02 6.07e-02
4 6.9702380952380949e-01 3.88e-03 6.20e-02
8 6.9412185037185026e-01 9.75e-04 6.24e-02
16 6.9339120220752681e-01 2.44e-04 6.25e-02
32 6.9320820826924900e-01 6.10e-05 6.25e-02
64 6.9316243888340345e-01 1.53e-05 6.25e-02
128 6.9315099522810786e-01 3.81e-06 6.25e-02
256 6.9314813423244259e-01 9.54e-07 6.25e-02
512 6.9314741897841081e-01 2.38e-07 6.25e-02
1024 6.9314724016458296e-01 5.96e-08 6.25e-02
2048 6.9314719546110626e-01 1.49e-08 6.25e-02
4096 6.9314718428523525e-01 3.73e-09 6.25e-02
8192 6.9314718149126775e-01 9.31e-10 6.25e-02
16384 6.9314718079277526e-01 2.33e-10 6.25e-02
32768 6.9314718061815306e-01 5.82e-11 6.25e-02
65536 6.9314718057449465e-01 1.45e-11 6.25e-02
131072 6.9314718056358260e-01 3.64e-12 6.25e-02
262144 6.9314718056084745e-01 9.02e-13 6.20e-02
524288 6.9314718056016078e-01 2.15e-13 5.92e-02
1048576 6.9314718056000668e-01 6.14e-14 6.75e-02
2097152 6.9314718055997371e-01 2.84e-14 1.25e-01
4194304 6.9314718055995383e-01 8.55e-15 1.50e-01
الدالة الرئيسية qu_trapezes_adapt
معايير هذه الدالة هي كالتالي:
a و b: حدي المجال [a, b]
eps : الدقة المطلوبة
t : جدول ذي الدرجة ITERMAX.
تستدعي الدالة الرئيسة دالة أخرى هي كالتالي:
double qu_f(double x)
التي يجب أن تعرف في البرنامج الأساسي وهي تمثل الدالة الرياضية f.
ترجع الدالة في الجدول t التكرارات المتتالية لطريقة شبه المنحرف.
الثابتة الصحيحة ITERMAX تساوي العدد القصوي للتكرارات المطلوبة (+1).
void qu_trapezes_adapt(double a,double b,double eps,double t[ITERMAX])
{
int j;
long i,n;
double h,s,err,x;
n=1;
h=b-a;
j=0;
err=2*eps;
t[0]=h*(qu_f(a)+qu_f(b))/2;
while((fabs(err)>eps) && (j < ITERMAX-1))
{
j++;
n *= 2;
h /= 2;
x=a-h;
s=0;
for(i=1;i<=n/2;i++)
{
x += 2*h;
s += qu_f(x);
}
t[j]=t[j-1]/2+h*s;
err=t[j]-t[j-1];
}
}