طريقة رومبرغ
في التحليل العددي ، تُستخدم طريقة رومبرغ [ 1 ] لتقدير التكامل المحددبتطبيق استقراء ريتشاردسون [ 2 ] بشكل متكرر على قاعدة شبه المنحرف أو قاعدة المستطيل (قاعدة نقطة المنتصف). تُنتج التقديرات مصفوفة مثلثية . طريقة رومبرغ هي صيغة نيوتن-كوتس ، حيث تُقيّم الدالة المُكاملة عند نقاط متساوية التباعد. يجب أن تكون للدالة المُكاملة مشتقات متصلة، مع العلم أنه يمكن الحصول على نتائج جيدة نسبيًا إذا كانت المشتقات قليلة. إذا أمكن تقييم الدالة المُكاملة عند نقاط غير متساوية التباعد، فإن طرقًا أخرى مثل التكامل العددي الغاوسي والتكامل العددي كلينشو-كورتيس تكون عمومًا أكثر دقة.
سميت هذه الطريقة على اسم فيرنر رومبرغ ، الذي نشرها في عام 1955.
طريقة
استخداميمكن تعريف الطريقة استقرائيًا بواسطة أينولاحظ أن المعادلتين الأوليين تُقابلان العمود الأول، وهما الصيغتان المرتبطتان بقاعدة شبه المنحرف المركب. في ترميز Big O ، يكون الخطأ لـ R ( n , m ) هو: [ 3 ]
الاستقراء الصفري، R ( n , 0) ، يُكافئ قاعدة شبه المنحرف بـ 2n + 1 نقطة؛ والاستقراء الأول، R ( n , 1) ، يُكافئ قاعدة سيمبسون بـ 2n + 1 نقطة. أما الاستقراء الثاني، R ( n , 2) ، فيُكافئ قاعدة بول بـ 2n + 1 نقطة. وتختلف الاستقراءات اللاحقة عن صيغ نيوتن -كوتس. فعلى وجه الخصوص ، تُوسّع استقراءات رومبرغ اللاحقة قاعدة بول بشكل طفيف للغاية، مُعدّلةً الأوزان إلى نسب مشابهة لتلك الموجودة في قاعدة بول. في المقابل، تُنتج طرق نيوتن-كوتس اللاحقة أوزانًا مُختلفة بشكل متزايد، مما يؤدي في النهاية إلى أوزان موجبة وسالبة كبيرة. وهذا يُشير إلى كيفية فشل طرق نيوتن-كوتس متعددة الحدود ذات الدرجة الكبيرة في التقارب للعديد من التكاملات، بينما يكون تكامل رومبرغ أكثر استقرارًا.
من خلال تصنيفناالتقريبات كـبدلاً منيمكننا إجراء استقراء ريتشاردسون باستخدام صيغة الخطأ المحددة أدناه: بمجرد حصولنا علىالتقريباتيمكننا أن نصنفهم على النحو التالي:.
عندما تكون عمليات تقييم الدوال مكلفة، قد يكون من الأفضل استبدال الاستيفاء متعدد الحدود لريتشاردسون بالاستيفاء النسبي الذي اقترحه بوليرش وستوير (1967) .
مثال هندسي
لتقدير المساحة تحت المنحنى، يتم تطبيق قاعدة شبه المنحرف أولاً على قطعة واحدة، ثم قطعتين، ثم أربع قطع، وهكذا.




بعد الحصول على تقديرات قاعدة شبه المنحرف، يتم تطبيق استقراء ريتشاردسون .
- في التكرار الأول، تُستخدم تقديرات القطعتين والقطعة الواحدة في الصيغة 4 × (الأكثر دقة) - (الأقل دقة) / 3. ثم تُستخدم الصيغة نفسها لمقارنة تقدير القطع الأربع وتقدير القطعتين، وكذلك بالنسبة للتقديرات الأعلى .
- في التكرار الثاني ، تُستخدم قيم التكرار الأول في الصيغة 16 × (الأكثر دقة) - (الأقل دقة) / 15
- تستخدم التكرار الثالث القوة التالية للعدد 4: 64 × (أكثر دقة) - (أقل دقة) / 63 على القيم المشتقة من التكرار الثاني .
- يستمر النمط حتى يتم التوصل إلى تقدير واحد.
| عدد القطع | تقديرات شبه المنحرف | التكرار الأول | التكرار الثاني | التكرار الثالث |
|---|---|---|---|---|
| 4 MA − LA / 3 | 16 MA − LA / 15 | 64 MA − LA / 63 | ||
| 1 | 0 | 4 ×16 − 0 / 3 = 21.333... | 16 × 34.667 - 21.333 / 15 = 35.556... | 64 × 42.489 - 35.556 / 63 = 42.599... |
| 2 | 16 | 4 ×30 − 16 / 3 = 34.666... | 16 ×42 − 34.667 / 15 = 42.489... | |
| 4 | 30 | 4 ×39 - 30 / 3 = 42 | ||
| 8 | 39 |
مثال
على سبيل المثال، يتم تكامل دالة غاوس من 0 إلى 1، أي دالة الخطأ erf(1) ≈ 0.842 700 792 949 715. يتم حساب المصفوفة المثلثية صفًا تلو الآخر، ويتوقف الحساب إذا كان الفرق بين آخر عنصرين في الصف الأخير أقل من 10 − 8 .
0.77174333 0.82526296 0.84310283 0.83836778 0.84273605 0.84271160 0.84161922 0.84270304 0.84270083 0.84270066 0.84243051 0.84270093 0.84270079 0.84270079 0.84270079
النتيجة في الزاوية السفلية اليمنى من المصفوفة المثلثية دقيقة حتى الأرقام الموضحة. ومن اللافت للنظر أن هذه النتيجة مستمدة من التقريبات الأقل دقة التي تم الحصول عليها باستخدام قاعدة شبه المنحرف في العمود الأول من المصفوفة المثلثية.
تطبيق
فيما يلي مثال على تطبيق حاسوبي لطريقة رومبيرغ (بلغة البرمجة C ):
#include <stdio.h>#include <math.h>void print_row ( size_t i , double * R ) {printf ( "R[%2zu] = " , i );for ( size_t j = 0 ; j <= i ; ++ j ) {printf ( "%f " , R [ j ]);}printf ( " \n " );}/*مدخل:(*f) : مؤشر إلى الدالة المراد دمجهاأ: الحد الأدنىب: الحد الأعلىmax_steps: الحد الأقصى لعدد خطوات الإجراءالدقة: الدقة المطلوبةالناتج:Rp[max_steps-1]: القيمة التقريبية لتكامل الدالة f لـ x في [a,b] بدقة 'acc' وخطوات 'max_steps'.*/دالة رومبيرغ المزدوجة ( دالة مزدوجة ( * f )( مزدوجة ), دالة مزدوجة a , دالة مزدوجة b , حجم_t الحد_الخطوات_القصوى , دالة مزدوجة acc ){double R1 [ max_steps ], R2 [ max_steps ]; // مخازن مؤقتةdouble * Rp = & R1 [ 0 ], * Rc = & R2 [ 0 ]; // Rp هو الصف السابق، وRc هو الصف الحاليdouble h = b - a ; // حجم الخطوةRp [ 0 ] = ( f ( a ) + f ( b )) * h * 0.5 ; // الخطوة شبه المنحرفة الأولىprint_row ( 0 , Rp );for ( size_t i = 1 ; i < max_steps ; ++ i ) {h /= 2. ;double c = 0 ;size_t ep = 1 << ( i -1 ); //2^(n-1)for ( size_t j = 1 ; j <= ep ; ++ j ) {c += f ( a + ( 2 * j -1 ) * h );}Rc [ 0 ] = h * c + 0.5 * Rp [ 0 ]; // R(i,0)for ( size_t j = 1 ; j <= i ; ++ j ) {double n_k = pow ( 4 , j );Rc [ j ] = ( n_k * Rc [ j -1 ] - Rp [ j -1 ]) / ( n_k -1 ); // حساب R(i,j)}// اطبع الصف رقم i من R، R[i,i] هو أفضل تقدير حتى الآنprint_row ( i , Rc );إذا كان ( i > 1 && fabs ( Rp [ i -1 ] - Rc [ i ]) < acc ) {أعد Rc [ i ]؛}// قم بتبديل Rn و Rc لأننا نحتاج فقط إلى الصف الأخيرdouble * rt = Rp ;Rp = Rc ;Rc = rt ;}return Rp [ max_steps - 1 ]; // إرجاع أفضل تخمين لدينا}فيما يلي تطبيق لطريقة رومبيرغ (بلغة برمجة بايثون ):
استيراد numpy كـ npfrom math import erf , sqrt , piدالة طباعة_الصف ( الصف ):# اطبع صفًا واحدًا من جدول رومبيرج بتنسيق رقمي ذي عرض ثابت.# هذا يجعل نمط التقارب سهل القراءة عمودًا تلو الآخر.print ( "" . join ( f " { x : 11.8f } " for x in row ))دالة romberg ( f , a , b , eps = 1e-8 , max_iter = 20 ):""" قم بتقريب التكامل المحدد للدالة f من a إلى b باستخدام تكامل رومبرغ. حدود ---------- f: دالة قابلة للاستدعاء دالة للتكامل. من الأفضل أن تقبل مصفوفات NumPy حتى يمكن تحويل عمليات التقييم في العديد من النقاط إلى عمليات متجهة. أ، ب: عدد عشري الحدود الدنيا والعليا للتكامل. eps: عدد عشري، اختياري التسامح المطلوب للتوقف. تتوقف الخوارزمية عند حدوث قيمتين متتاليتين تقديرات رومبيرغ القطرية قريبة بما فيه الكفاية. max_iter : عدد صحيح، اختياري الحد الأقصى لعدد مستويات التحسين المسموح بها. المرتجعات ------- يطفو أفضل تقدير رومبرغ للتكامل. """# R[n, m] سيحتوي على التحسين رقم n والاستقراء رقم m لريتشاردسون.R = np.zeros ( ( max_iter + 1 , max_iter + 1 ) )# الحالة الأساسية: قاعدة شبه المنحرف باستخدام النقطتين الطرفيتين a و b فقط.# هذا هو التقريب الأول والأكثر خشونة للتكامل.R [ 0,0 ] = ( b - a ) * ( f ( a ) + f ( b ) ) / 2# اطبع الصف الأول، الذي يحتوي فقط على التقدير الأولي لشبه المنحرف.print_row ( R [ 0 , : 1 ])# تحسين مستوى التقريب مستوى تلو الآخر.# كل مستوى جديد يقلل حجم الخطوة إلى النصف ويضيف قيم الدالة عند# نقاط المنتصف الجديدة التي تم إدخالها عن طريق التقسيم الفرعي.for n in range ( 1 , max_iter + 1 ):# حجم الخطوة عند مستوى التحسين n.# بما أن الفترة مقسمة إلى 2^n فترات فرعية، فإن عرض الشبكة هو:h_n1 = ( b - a ) / ( 2 ** n ) # h_{n-1}# قم بإنشاء النقاط الجديدة التي تم إدخالها في مستوى التحسين هذا.# هذه هي المضاعفات الفردية لـ h بالنسبة إلى a:# أ + ح، أ + 3 س، أ + 5 س، ...، أ + (2^ن - 1)ح8# هناك 2^(n-1) من هذه النقاط، ويقوم NumPy بإنشائها بكفاءة.x = أ + h_n1 * np . المدى ( 1 , 2 ** ن , 2 )# تحديث تقدير شبه المنحرف باستخدام علاقة رومبرغ المتكررة:.R [ n , 0 ] = R [ n - 1 , 0 ] / 2 + h_n1 * np.sum ( f ( x ) )# استقراء ريتشاردسون:for m in range ( 1 , n + 1 ):R [ n , m ] = R [ n , m - 1 ] + ( R [ n , m - 1 ] - R [ n - 1 , m - 1 ]) / ( 4 ** m - 1 )# اطبع الصف المكتمل حتى العنصر القطري الحالي.print_row ( R [ n , : n + 1 ])# معيار التوقف:# إذا كانت القيمتان الأخيرتان المرتبطتان بالقطر متقاربتين بدرجة كافية،# نحن نقبل أحدث تقدير تم استقراءه.إذا كانت القيمة المطلقة لـ ( R [ n , n ] - R [ n , n - 1 ]) أقل من eps :إرجاع R [ n , n ]# إذا لم تتقارب الطريقة ضمن مستويات max_iter، فقم برفع خطأ.raise RuntimeError ( "لم يتقارب أسلوب رومبيرغ خلال الحد الأقصى لعدد التكرارات. " )# مثال على الاستخدام:# قم بتكامل الدالة المقابلة لـ erf(1):# erf(1) = 2/√π * ∫₀¹ exp(-t²) dt8f = lambda t : 2 / np . sqrt ( np . pi ) * np . exp ( - t * t )# احسب النتيجة واطبعها.print ( "التقريب = " , romberg ( f , 0.0 , 1.0 ))print ( "القيمة الدقيقة = " , erf ( 1.0 ))مراجع
الاقتباسات
فهرس
- ريتشاردسون، إل إف (1911)، "الحل الحسابي التقريبي باستخدام الفروق المحدودة للمسائل الفيزيائية التي تتضمن معادلات تفاضلية، مع تطبيق على الإجهادات في سد مبني من الطوب"، المعاملات الفلسفية للجمعية الملكية أ ، 210 ( 459-470 ): 307-357 ، رمز Bibcode : 1911RSPTA.210..307R ، doi : 10.1098/rsta.1911.0009 ، JSTOR 90994
- Romberg، W. (1955)، “Vereinfachte numerische Integration”، Det Kongelige Norske Videnskabers Selskab Forhandlinger ، 28 (7)، تروندهايم : 30–36
- ثاتشر الابن، هنري سي. (يوليو 1964)، "ملاحظة حول الخوارزمية 60: تكامل رومبرغ"، اتصالات ACM ، 7 (7): 420-421 ، doi : 10.1145/364520.364542
- باور، فلوريدا؛ روتشاوزر، هـ.؛ ستيفل، إي. (1963)، متروبوليس، كارولاينا الشمالية؛ وآخرون (محررون)، "جوانب جديدة في التربيع العددي"، الحساب التجريبي، الحوسبة عالية السرعة والرياضيات، وقائع الندوات في الرياضيات التطبيقية (15)، الجمعية الأمريكية للرياضيات : 199-218
- بوليرش، رولاند. Stoer، Josef (1967)، “Handbook Series Numerical Integration. التربيع العددي عن طريق الاستقراء” ، Numerische Mathematik ، 9 : 271–278 ، دوى : 10.1007 / bf02162420
- Mysovskikh، IP (2002) [1994]، “طريقة Romberg” ، في Hazewinkel، Michiel (ed.)، موسوعة الرياضيات ، Springer-Verlag ، ISBN 1-4020-0609-8
- بريس، دبليو إتش؛ تيوكولسكي، إس إيه؛ فيترلينغ، دبليو تي؛ فلانيري، بي بي (2007)، "القسم 4.3. تكامل رومبرغ" ، وصفات عددية: فن الحوسبة العلمية ( الطبعة الثالثة)، نيويورك: مطبعة جامعة كامبريدج، رقم ISBN 978-0-521-88068-8
روابط خارجية
- ROMBINT – كود لبرنامج MATLAB (المؤلف: مارتن كاسيناك)
- أداة تكامل مجانية عبر الإنترنت تستخدم طرق رومبرغ، فوكس-رومبرغ، غاوس-ليجندر، وغيرها من الطرق العددية
- تطبيق SciPy لطريقة رومبيرغ
- Romberg.jl — تطبيق جوليا (يدعم التحليلات العشوائية، وليس فقطنقاط)
- التكامل العددي
