طريقة رومبرغ

في التحليل العددي ، تُستخدم طريقة رومبرغ [ 1 ] لتقدير التكامل المحددأبو(x)دx{\displaystyle \int _{a}^{b}f(x)\,dx}بتطبيق استقراء ريتشاردسون [ 2 ] بشكل متكرر على قاعدة شبه المنحرف أو قاعدة المستطيل (قاعدة نقطة المنتصف). تُنتج التقديرات مصفوفة مثلثية . طريقة رومبرغ هي صيغة نيوتن-كوتس ، حيث تُقيّم الدالة المُكاملة عند نقاط متساوية التباعد. يجب أن تكون للدالة المُكاملة مشتقات متصلة، مع العلم أنه يمكن الحصول على نتائج جيدة نسبيًا إذا كانت المشتقات قليلة. إذا أمكن تقييم الدالة المُكاملة عند نقاط غير متساوية التباعد، فإن طرقًا أخرى مثل التكامل العددي الغاوسي والتكامل العددي كلينشو-كورتيس تكون عمومًا أكثر دقة.

سميت هذه الطريقة على اسم فيرنر رومبرغ ، الذي نشرها في عام 1955.

طريقة

استخدامحن=(ب-أ)2ن+1{\textstyle h_{n}={\frac {(b-a)}{2^{n+1}}}}يمكن تعريف الطريقة استقرائيًا بواسطة R(0،0)=ح0(و(أ)+و(ب))R(ن،0)=12R(ن-1،0)+2حنك=12ن-1و(أ+(2ك-1)حن-1)R(ن،م)=R(ن،م-1)+14م-1(R(ن،م-1)-R(ن-1،م-1))=14م-1(4مR(ن،م-1)-R(ن-1،م-1)){\displaystyle {\begin{aligned}R(0,0)&=h_{0}(f(a)+f(b))\\R(n,0)&={\tfrac {1}{2}}R(n{-}1,\,0)+2h_{n}\sum _{k=1}^{2^{n-1}}f(a+(2k-1)h_{n-1})\\R(n,m)&=R(n,\,m{-}1)+{\tfrac {1}{4^{m}-1}}(R(n,\,m{-}1)-R(n{-}1,\,m{-}1))\\&={\frac {1}{4^{m}-1}}(4^{m}R(n,\,m{-}1)-R(n{-}1,\,m{-}1))\end{aligned}}} أيننم{\displaystyle n\geq m}وم1{\displaystyle m\geq 1\,}لاحظ أن المعادلتين الأوليين تُقابلان العمود الأول، وهما الصيغتان المرتبطتان بقاعدة شبه المنحرف المركب. في ترميز Big O ، يكون الخطأ لـ R ( n , m ) هو: [ 3 ]يا(حن2م+2).{\displaystyle O{\left(h_{n}^{2m+2}\right)}.}

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

من خلال تصنيفنايا(ح2){\textstyle O(h^{2})}التقريبات كـأ0(ح2ن){\textstyle A_{0}{\big (}{\frac {h}{2^{n}}}{\big )}}بدلاً منR(ن،0){\textstyle R(n,0)}يمكننا إجراء استقراء ريتشاردسون باستخدام صيغة الخطأ المحددة أدناه: أبو(x)دx=أ0(ح2ن)+أ0(ح2ن)2+أ1(ح2ن)4+أ2(ح2ن)6+{\displaystyle \int _{a}^{b}f(x)\,dx=A_{0}{\bigg (}{\frac {h}{2^{n}}}{\bigg )}+a_{0}{\bigg (}{\frac {h}{2^{n}}}{\bigg )}^{2}+a_{1}{\bigg (}{\frac {h}{2^{n}}}{\bigg )}^{4}+a_{2}{\bigg (}{\frac {h}{2^{n}}}{\bigg )}^{6}+\cdots } بمجرد حصولنا علىيا(ح2(م+1)){\textstyle O(h^{2(m+1)})}التقريباتأم(ح2ن){\textstyle A_{m}{\big (}{\frac {h}{2^{n}}}{\big )}}يمكننا أن نصنفهم على النحو التالي:R(ن،م){\textstyle R(n,m)}.

عندما تكون عمليات تقييم الدوال مكلفة، قد يكون من الأفضل استبدال الاستيفاء متعدد الحدود لريتشاردسون بالاستيفاء النسبي الذي اقترحه بوليرش وستوير (1967) .

مثال هندسي

لتقدير المساحة تحت المنحنى، يتم تطبيق قاعدة شبه المنحرف أولاً على قطعة واحدة، ثم قطعتين، ثم أربع قطع، وهكذا.

تقريب من قطعة واحدة
قطعة واحدة. لاحظ أنه بما أنها تبدأ وتنتهي عند الصفر، فإن هذا التقريب ينتج عنه مساحة صفرية.
تقريب من قطعتين
قطعتان
تقريب من أربع قطع
أربع قطع
تقريب من ثماني قطع
ثماني قطع

بعد الحصول على تقديرات قاعدة شبه المنحرف، يتم تطبيق استقراء ريتشاردسون .

  • في التكرار الأول، تُستخدم تقديرات القطعتين والقطعة الواحدة في الصيغة 4 × (الأكثر دقة) - (الأقل دقة) / 3. ثم تُستخدم الصيغة نفسها لمقارنة تقدير القطع الأربع وتقدير القطعتين، وكذلك بالنسبة للتقديرات الأعلى .
  • في التكرار الثاني ، تُستخدم قيم التكرار الأول في الصيغة 16 × (الأكثر دقة) - (الأقل دقة) / 15
  • تستخدم التكرار الثالث القوة التالية للعدد 4: 64 × (أكثر دقة) - (أقل دقة) / 63 على القيم المشتقة من التكرار الثاني .
  • يستمر النمط حتى يتم التوصل إلى تقدير واحد.
عدد القطعتقديرات شبه المنحرفالتكرار الأولالتكرار الثانيالتكرار الثالث
4 MALA / 316 MA LA / 1564 MA LA / 63
104 ×16 − 0 / 3 = 21.333...16 × 34.667 - 21.333 / 15 = 35.556...64 × 42.489 - 35.556 / 63 = 42.599...
2164 ×30 − 16 / 3 = 34.666...16 ×42 − 34.667 / 15 = 42.489...
4304 ×39 - 30 / 3 = 42
839

مثال

على سبيل المثال، يتم تكامل دالة غاوس من 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 ))

مراجع

الاقتباسات

فهرس