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

 
 

مصطلحات
العربية: طريقة رومبورغ
الإنجليزية: Romberg's Method
الفرنسية: Méthode de Romberg

المبدأ

الحساب العددي لـ I = 

(هي استكمال لطريقة شبه المنحرف).

هذه الطريقة تنبني على استكمال متتالية شبه المنحرف T(hp) مع  بتحويل المتتالية المتوالي، كل متتالية جديدة تتقارب أسرع إلى I من سابقتها.


الخوارزم

متتالية شبه المنحرف هي أول متتالية، والمستحسن حسابها بطريقة المكيفة:

R0(hp) = T(hp)    p = 0, 1,...

ثم ننجز تحويلات المتتاليات المتوالية.

الإرتياب:


مثال

نعتبر التكامل المعرف:

القيمة المضبوط لهذا التكامل هو Log(2) 

حساب الرقمي لقيمة I .

الإستكمالان الأوليان

تهيئ :(طريقة التكييفية لشبه المنحرف)

f(a) = f(0) = 1/(0+1) = 1 
f(b) = f(1) = 1/(1+1) = 1/2
R0(1) = T(1) = (1/2)(f(0)+f(1)) = (1/2)(1+1/2) = 3/4
f(1/2) = 1/(1/2+1) = 2/3
R0(1/2) = 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
R0(1/4) = 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

الاستكمال الأول
R1(1/2) = (4R0(1/2) - R0(1))/3 = (4(17/24) - (3/4))/3 = 25/36
R1(1/4) = (4R0(1/4) - R0(1/2))/3 = (4(1171/1680) - (17/24))/3 = 1747/2540

الاستكمال الثاني
R2(1/4) = (16R1(1/4) - R1(1/2))/15 = (16(1747/2540) - (25/36))/15 = 4367/6300

ملاحظة: الإستكمال الأول يعطي نفس نتيجة طريقة سيمسون


البرمجة

#include <math.h>
#include <conio.h>
#define ITERMAX 7
double qu_f(double x) { return(1/(x+1)); }
void qu_trapezes_adapt(double a,double b,double eps,double t[ITERMAX]); void qu_romberg(double a,double b,double c[ITERMAX][ITERMAX]);
  main() { int i,k; long n; double a,b,r,vr_val; double c[ITERMAX][ITERMAX]; clrscr(); a=0;b=1; vr_val=log(2); printf("Méthode de Romberg\n"); printf("Vraie valeur = %.17e\n",vr_val); n=1; qu_romberg(a,b,c); printf("\n n Trapèzes Erreur\n"); for(i=0;i<ITERMAX;i++) { printf("%4ld %.17e %.3e \n",n,c[0][i],fabs(c[0][i]-vr_val)); n*=2; } for(k=1;k<ITERMAX;k++) { printf("\n n Extrapolation%3d Erreur\n",k); n=pow(2,k-1); for(i=0;i<ITERMAX-k;i++) { n *= 2; r=c[k][i]; printf("%4ld %.17e %.3e\n",n,r,fabs(r-vr_val)); } } }

نتيجة البرنامج

في كل كرة، البرنامج يظهر

  • قيمة n = (b-a)/h

  • قيمة I

  • الارتياب

القيمة الحقيقية= 6.9314718055994529e-01

  
         شبه المنحرف             الارتياب
   1      7.5000000000000000e-01      5.69e-02 
   2      7.0833333333333326e-01      1.52e-02 
   4      6.9702380952380949e-01      3.88e-03 
   8      6.9412185037185026e-01      9.75e-04 
  16      6.9339120220752681e-01      2.44e-04 
  32      6.9320820826924900e-01      6.10e-05 
  64      6.9316243888340345e-01      1.53e-05 

  n          الاستكمال           الارتياب                  
1  
   2      6.9444444444444431e-01      1.30e-03
   4      6.9325396825396823e-01      1.07e-04
   8      6.9315453065453048e-01      7.35e-06
  16      6.9314765281941904e-01      4.72e-07
  32      6.9314721028982307e-01      2.97e-08
  64      6.9314718242145490e-01      1.86e-09

  n       الاستكمال               الارتياب                  
2  
   4      6.9317460317460311e-01      2.74e-05
   8      6.9314790148123462e-01      7.21e-07
  16      6.9314719429707827e-01      1.37e-08
  32      6.9314718078784998e-01      2.28e-10
  64      6.9314718056356373e-01      3.62e-12

  n            الاستكمال            الارتياب                  
3 
   8      6.9314747764483198e-01      2.97e-07
  16      6.9314718307193290e-01      2.51e-09
  32      6.9314718057341773e-01      1.35e-11
  64      6.9314718056000357e-01      5.83e-14

  n      الاستكمال              الارتياب                  
4  
  16      6.9314718191674507e-01      1.36e-09
  32      6.9314718056361968e-01      3.67e-12
  64      6.9314718055995095e-01      5.66e-15

  n         الاستكمال           الارتياب                  
5  
  32      6.9314718056229696e-01      2.35e-12
  64      6.9314718055994740e-01      2.11e-15

  n              الاستكمال      الارتياب                  
6  
64      6.9314718055994684e-01      1.55e-15

الدالة التكميلية qu_trapezes_adapt

معايير هذه الدالة هي كالتالي:

a و b: حدي المجال [ab]
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];
}
}
 

 الدالة التكميلية qu_romberg

معايير هذه الدالة هي كالتالي:
a و b: حدي المجال [ab]
c: جدول ذي الدرجة ITERMAX*ITERMAX.

تستدعي الدالة الرئيسة دالة أخرى هي كالتالي:

void qu_trapezes_adapt(double a,double b,double eps,double t[ITERMAX])

وهي بدورها تستدعي الدالة التالية:

double qu_f(double x)

التي يجب أن تعرف في البرنامج الأساسي وهي تمثل الدالة الرياضية f وترجع في سطور الجدول c قيم الإستكمالات المتتابعة المولد من طرف طريقة رومبرغ.


الثابتة الصحيحة ITERMAX تساوي عدد الإستكمالات المطلوبة (+1).

void qu_romberg(double a,double b,double c[ITERMAX][ITERMAX])
{
int i,k;
double eps;
eps=1e-14;
qu_trapezes_adapt(a,b,eps,c);
for(k=1;k<ITERMAX;k++)
for(i=0;i<ITERMAX-k;i++)
c[k][i]=(pow(4,k)*c[k-1][i+1]-c[k-1][i])/(pow(4,k)-1);
}
مقالات أخرى من نفس الفئة « طريقة سيبسون طريقة غوص ليجندر »

أضف تعليقا


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

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