الاسترخاء المفرط المتتالي
في الجبر الخطي العددي ، تُعدّ طريقة الاسترخاء المتتالي ( SOR ) شكلاً مُعدّلاً من طريقة جاوس-سيدل لحلّ نظام المعادلات الخطية ، مما يُؤدي إلى تقارب أسرع. ويمكن استخدام طريقة مماثلة لأي عملية تكرارية بطيئة التقارب .
طُوِّرت هذه الطريقة في آنٍ واحد من قِبَل ديفيد إم. يونغ الابن وستانلي ب. فرانكل عام ١٩٥٠ بهدف حلّ الأنظمة الخطية تلقائيًا على الحواسيب الرقمية. وقد استُخدمت طرق الاسترخاء المفرط قبل عمل يونغ وفرانكل، ومن أمثلتها طريقة لويس فراي ريتشاردسون ، والطرق التي طوّرها آر. في. ساوثويل . إلا أن هذه الطرق صُمِّمت للحساب بواسطة حاسبات بشرية ، ما يتطلب خبرةً لضمان التقارب نحو الحل، الأمر الذي جعلها غير قابلة للتطبيق في برمجة الحواسيب الرقمية. وقد نُوقشت هذه الجوانب في أطروحة ديفيد إم. يونغ الابن [ ١ ].
التركيبة
بفرض وجود نظام مربع من n معادلة خطية مع مجهول x :
أين:
ثم يمكن تحليل A إلى مكون قطري D ، ومكونين مثلثيين سفليين وعلويين L و U :
أين
يمكن إعادة كتابة نظام المعادلات الخطية على النحو التالي:
بالنسبة لثابت ω > 1، يسمى عامل الاسترخاء .
طريقة الاسترخاء المتتالي هي تقنية تكرارية تحل الطرف الأيسر من هذه المعادلة لإيجاد قيمة x ، باستخدام القيمة السابقة لـ x في الطرف الأيمن. ويمكن كتابة ذلك تحليليًا على النحو التالي:
أينهي التقريب أو التكرار رقم k لـوهي التكرار التالي أو k + 1 منومع ذلك، من خلال الاستفادة من الشكل المثلثي لـ ( D + ωL ) ، يمكن حساب عناصر x ( k + 1) بالتتابع باستخدام التعويض الأمامي :
ويمكن كتابة ذلك مرة أخرى تحليليًا في شكل مصفوفة-متجه دون الحاجة إلى عكس المصفوفة: [ 2 ]
التقارب

إن اختيار عامل الاسترخاء ω ليس بالأمر السهل بالضرورة، ويعتمد على خصائص مصفوفة المعاملات . في عام 1947، أثبت أوستروفسكي أنه إذاإذا كانت متناظرة وموجبة التحديدلوبالتالي، يتبع ذلك تقارب عملية التكرار، لكننا نهتم بشكل عام بالتقارب الأسرع بدلاً من مجرد التقارب.
معدل التقارب
يمكن اشتقاق معدل التقارب لطريقة SOR تحليليًا. يجب افتراض ما يلي [ 3 ] [ 4 ]
- معامل الاسترخاء مناسب:
- مصفوفة تكرار جاكوبيلها قيم ذاتية حقيقية فقط
- طريقة جاكوبي متقاربة: :=\rho (C_{\text{Jac}})<1}
- تحليل المصفوفةيفي بالخاصية التيلأيو.
ويمكن التعبير عن معدل التقارب على النحو التالي: حيث يتم إعطاء معامل الاسترخاء الأمثل بواسطة على وجه الخصوص، بالنسبة لـ( غاوس-سيدل ) ينص على أنللحصول على الأمثلنحصلوهذا يوضح أن SOR أكثر كفاءة بأربع مرات تقريبًا من Gauss–Seidel.
يتحقق الافتراض الأخير بالنسبة للمصفوفات ثلاثية الأقطار لأنللقطرمع إدخالاتو.
الخوارزمية
بما أنه يمكن استبدال العناصر أثناء حسابها في هذه الخوارزمية، فلا حاجة إلا لمتجه تخزين واحد، ويتم الاستغناء عن فهرسة المتجهات. وتتلخص الخوارزمية فيما يلي:
المدخلات: A ، b ، ω المخرجات: اختر تخمينًا أوليًاللوصول إلى الحل، كرر العملية حتى التقارب. من أجل i من 1 إلى n ، اجعل σ تساوي 0. من أجل j من 1 إلى n ، إذا كان j ≠ i ، فاجعل σ تساوي 0.end if end ( j -loop) تعيينلنهاية ( حلقة i ) تحقق مما إذا تم الوصول إلى التقارب النهاية (تكرار)
- ملحوظة
- ويمكن كتابتها أيضاًوبالتالي توفير عملية ضرب واحدة في كل تكرار للحلقة الخارجية for .
مثال
لدينا النظام الخطي
لحل المعادلات، نختار عامل استرخاءومتجه تخمين أوليوفقًا لخوارزمية الاسترخاء المتتالي، يتم الحصول على الجدول التالي، الذي يمثل تكرارًا نموذجيًا مع التقريبات، والذي من الناحية المثالية، ولكن ليس بالضرورة، يجد الحل الدقيق، (3، -2 ، 2، 1) ، في 38 خطوة.
| التكرار | ||||
|---|---|---|---|---|
| 1 | 0.25 | -2.78125 | 1.6289062 | 0.5152344 |
| 2 | 1.2490234 | -2.2448974 | 1.9687712 | 0.9108547 |
| 3 | 2.070478 | -1.6696789 | 1.5904881 | 0.76172125 |
| ... | ... | ... | ... | ... |
| 37 | 2.9999998 | - 2.0 | 2.0 | 1.0 |
| 38 | 3.0 | - 2.0 | 2.0 | 1.0 |
فيما يلي تطبيق بسيط للخوارزمية بلغة Common Lisp .
;; اضبط تنسيق الفاصلة العائمة الافتراضي على "long-float" لضمان التشغيل الصحيح على نطاق أوسع من الأرقام. ( setf *read-default-float-format* 'long-float )( defparameter +MAXIMUM-NUMBER-OF-ITERATIONS+ 100 "عدد التكرارات التي يجب أن تتوقف الخوارزمية عن العمل بعدها، بغض النظر عن حلها الحالي. قد يوفر عدد أكبر من التكرارات نتيجة أكثر دقة، ولكنه يفرض متطلبات أداء أعلى." )( declaim ( type ( integer 0 * ) +MAXIMUM-NUMBER-OF-ITERATIONS+ ))( defun get-errors ( computed-solution exact-solution ) "لكل عنصر من عناصر متجه الحل المحسوب، تسترجع هذه الدالة خطأه بالنسبة لمتجه الحل الدقيق المتوقع، وتعيد متجهًا من قيم الخطأ. --- على الرغم من أنه يجب أن يكون كلا متجهي الإدخال متساويين في الحجم، إلا أنه لا يتم التحقق من هذا الشرط، ويحدد أقصر متجه من المتجهين عدد عناصر متجه الإخراج. --- الصيغة المعتمدة هي التالية: let resultVectorSize = min(computedSolution.length, exactSolution.length) let resultVector = new vector of resultVectorSize For i from 0 to (resultVectorSize - 1) resultVector[i] = exactSolution[i] - computedSolution[i] Return resultVector" ( declare ( type ( vector number * ) computed-solution )) ( declare ( type ( vector number * ) exact-solution )) ( map ' ( vector number * ) #' - exact-solution computed-solution ))( defun is-convergent ( errors &key ( error-tolerance 0.001 )) "يتحقق هذا من الوصول إلى التقارب بالنسبة لمتجه الأخطاء (ERRORS) الذي يسجل التباين بين متجه الحل المحسوب ومتجه الحل الدقيق. --- يتحقق التقارب إذا وفقط إذا كان كل مكون من مكونات الخطأ المطلق أقل من أو يساوي قيمة تحمل الخطأ (ERRORS-TOLERANCE)، أي: لكل e في متجه الأخطاء (ERRORS)، يكون الشرط: abs(e) <= errorTolerance." ( declare ( type ( vector number * ) errors )) ( declare ( type number error-tolerance )) ( flet (( error-is-acceptable ( error ) ( declare ( type number error )) ( <= ( abs error ) error-tolerance ))) ( every #' error-is-acceptable errors )))( defun make-zero-vector ( size ) "ينشئ ويعيد متجهًا بحجم SIZE مع تعيين جميع عناصره إلى 0." ( declare ( type ( integer 0 * ) size )) ( make-array size :initial-element 0.0 :element-type 'number '))( defun successive-over-relaxation ( A b omega &key ( phi ( make-zero-vector ( length b ))) ( convergence-check #' ( lambda ( iteration phi ) ( declare ( ignore phi )) ( >= iteration +MAXIMUM-NUMBER-OF-ITERATIONS+ )))) "تُنفذ هذه الدالة طريقة الاسترخاء المتتالي (SOR)، المُطبقة على المعادلات الخطية المُحددة بواسطة المصفوفة A ومتجه الطرف الأيمن B، باستخدام عامل الاسترخاء أوميغا، وتُعيد متجه الحل المحسوب. --- تتمثل الخطوة الأولى في الخوارزمية، وهي اختيار قيمة ابتدائية PHI، في مُعامل الكلمة المفتاحية الاختياري PHI، والذي يكون افتراضيًا متجهًا صفريًا بنفس بنية B. في حال توفيره، سيتم تعديل هذا المتجه بشكل جذري. على أي حال، يُمثل متجه PHI قيمة نتيجة الدالة. --- يتم تنفيذ شرط الإنهاء بواسطة CONVERGENCE-CHECK، وهو مُسند اختياري lambda(iteration phi) => دالة منطقية معممة تُرجع T، مما يدل على الإنهاء الفوري عند الوصول إلى التقارب، أو NIL، مما يدل على استمرار العملية في غير ذلك. في تكوينها الافتراضي، تلتزم دالة CONVERGENCE-CHECK ببساطة بوصول التكرار إلى "+MAXIMUM-NUMBER-OF-ITERATIONS+"، متجاهلةً دقة المتجه PHI. ( declare ( type ( array number ( * * )) A )) ( declare ( type ( vector number * ) b )) ( declare ( type number omega )) ( declare ( type ( vector number * ) phi )) ( declare ( type ( function (( integer 1 * ) ( vector number * )) * ) convergence-check )) ( let (( n( array-dimension A 0 ))) ( declare ( type ( integer 0 * ) n )) ( loop for iteration from 1 by 1 do ( loop for i from 0 below n by 1 do ( let (( rho 0 )) ( declare ( type number rho )) ( loop for j from 0 below n by 1 do ( when ( /= j i ) ( let (( a[ij] ( aref A i j )) ( phi[j] ( aref phi j ))) ( incf rho ( * a[ij] phi[j] ))))) ( setf ( aref phi i ) ( + ( * ( - 1 omega ) ( aref phi i )) ( * ( / omega ( aref A i i )) ( - ( aref b i ) rho )))))) ( format T "~&~d. solution = ~a" iteration phi ) ;; تحقق من الوصول إلى التقارب. ( when ( funcall convergence-check iteration phi ) ( return )))) ( the ( vector number * ) phi ));; استدعاء الدالة باستخدام المعاملات النموذجية. ( let (( A ( make-array ( list 4 4 ) :initial-contents ' (( 4 -1 -6 0 ) ( -5 -4 10 8 ) ( 0 9 4 -2 ) ( 1 0 -7 5 )))) ( b ( vector 2 21 -12 -6 )) ( omega 0.5 ) ( exact-solution ( vector 3 -2 2 1 ))) ( successive-over-relaxation A b omega :convergence-check #' ( lambda ( iteration phi ) ( declare ( type ( integer 0 * ) iteration )) ( declare ( type ( vector number * ) phi )) ( let (( errors ( get-errors phi exact-solution ))) ( declare ( type ( vector number * ) errors )) ( format T "~&~d. errors = ~a" iteration errors ) ( or ( is-convergent errors :error-tolerance 0.0 ) ( >= iteration +الحد الأقصى لعدد التكرارات+ ))))))تطبيق بسيط بلغة بايثون للرمز الزائف المذكور أعلاه.
استورد مكتبة NumPy باسم np، واستورد مكتبة scipy باسم linalg.def sor_solver ( A , b , omega , initial_guess , convergence_criteria ): """ هذا تطبيق للشيفرة الزائفة المذكورة في مقالة ويكيبيديا. الوسائط: A: مصفوفة NumPy من الرتبة n×n. b: متجه NumPy ذو n بُعد. omega: عامل الاسترخاء. initial_guess: تخمين الحل الأولي الذي يبدأ به المُحلِّل. convergence_criteria: أقصى تباين مقبول لاعتبار الحل الحالي مناسبًا. القيمة المرجعة: phi: متجه الحل ذو البُعد n. """ step = 0 phi = initial_guess [:] residual = linalg . norm ( A @ phi - b ) # الباقي الأولي while residual > convergence_criteria : for i in range ( A . shape [ 0 ]): sigma = 0 for j in range ( A . shape [ 1 ]): if j != i : sigma += A [ i , j ] * phi [ j ] phi [ i ] = ( 1 - omega ) * phi [ i ] + ( omega / A [ i , i ]) * ( b [ i ] - sigma ) residual = linalg . norm ( A @ phi - b ) step += 1 print ( "الخطوة {} الباقي: {:10.6g} " . format ( step , residual )) return phi# مثال توضيحي يُحاكي المثال الوارد في مقالة ويكيبيديا residual_convergence = 1e-8 omega = 0.5 # عامل الاسترخاءA = np.array ( [ [ 4 , -1 , -6 , 0 ] , [ -5 , -4 , 10 , 8 ] , [ 0 , 9 , 4 , -2 ] , [ 1 , 0 , -7 , 5 ] ] )b = np.array ( [ 2 , 21 , -12 , -6 ] )initial_guess = np.zeros ( 4 )phi = sor_solver ( A , b , omega , initial_guess , residual_convergence ) print ( phi )الاسترخاء المتتالي المتناظر
النسخة الخاصة بالمصفوفات المتناظرة A ، والتي
يُشار إليه باسم الاسترخاء المتتالي المتناظر ، أو ( SSOR )، حيث
والطريقة التكرارية هي
يُنسب الفضل في تطوير طريقتي SOR و SSOR إلى ديفيد إم. يونغ جونيور.
تطبيقات أخرى لهذه الطريقة
يمكن استخدام أسلوب مماثل لأي طريقة تكرارية. إذا كان التكرار الأصلي على الشكل التالي
ثم سيستخدم الإصدار المعدل
مع ذلك، فإن الصيغة المذكورة أعلاه، والمستخدمة لحل أنظمة المعادلات الخطية، ليست حالة خاصة من هذه الصيغة إذا اعتُبر x متجهًا كاملًا. إذا استُخدمت هذه الصيغة بدلًا من ذلك، فستبدو معادلة حساب المتجه التالي كما يلي:
أينقيمتُستخدم هذه القيم لتسريع تقارب عملية بطيئة التقارب، بينما تُستخدم قيم أخرىتُستخدم غالبًا للمساعدة في إرساء تقارب عملية تكرارية متباعدة أو تسريع تقارب عملية متجاوزة .
توجد طرق متنوعة لضبط معلمات الاسترخاء بشكل تكيفيبناءً على السلوك الملحوظ لعملية التقارب. عادةً ما تساعد هذه الطرق في الوصول إلى تقارب فائق الخطية لبعض المسائل، لكنها تفشل في مسائل أخرى.
انظر أيضاً
ملحوظات
- ↑ يونغ، ديفيد م. (1 مايو 1950)، طرق تكرارية لحل المعادلات التفاضلية الجزئية من النوع الإهليلجي (ملف PDF) (أطروحة دكتوراه)، جامعة هارفارد، مؤرشفة من الأصل (ملف PDF) في 17 مايو 2017 ، تم استرجاعها في 15 يونيو 2009
- ^ تورنيج، ويلي (1979). Numerische Mathematik für Ingenieure und Physiker (1 ed.). سبرينغر برلين، هايدلبرغ. ص. 180. دوى : 10.1007/978-3-642-96508-1 . رقم ISBN 978-3-642-96508-1تم الاطلاع عليه بتاريخ 20 مايو 2024 .
- ↑ هاك بوش، وولفغانغ (2016). "4.6.2". الحل التكراري لأنظمة المعادلات الكبيرة المتفرقة | سبرينغر لينك . العلوم الرياضية التطبيقية. المجلد 95. doi : 10.1007/978-3-319-28483-5 . ISBN 978-3-319-28481-1.
- ↑ غرينباوم، آن (1997). "10.1". الطرق التكرارية لحل الأنظمة الخطية . مجلة فرونتيرز في الرياضيات التطبيقية. المجلد 17. doi : 10.1137/1.9781611970937 . ISBN 978-0-89871-396-1.
مراجع
- تتضمن هذه المقالة نصًا من المقالة Successive_over-relaxation_method_-_SOR الموجودة على CFD-Wiki والتي تخضع لرخصة GFDL .
- أبراهام بيرمان، روبرت ج. بليمونز ، المصفوفات غير السالبة في العلوم الرياضية ، 1994، SIAM. ISBN 0-89871-321-8.
- بلاك، نويل ومور، شيرلي. "طريقة الاسترخاء المتتالي" . عالم الرياضيات .
- أ. هادجيديموس، الاسترخاء المتتالي المفرط (SOR) والأساليب ذات الصلة ، مجلة الرياضيات الحسابية والتطبيقية 123 (2000)، 177-199.
- يوسف سعد ، الطرق التكرارية للأنظمة الخطية المتفرقة ، الطبعة الأولى، PWS، 1996.
- نسخة Netlib من "Templates for the Solution of Linear Systems" من تأليف باريت وآخرون.
- ريتشارد إس. فارغا 2002 تحليل المصفوفات التكراري ، الطبعة الثانية (من طبعة برنتيس هول لعام 1962)، سبرينغر-فيرلاغ.
- ديفيد إم. يونغ الابن، الحل التكراري للأنظمة الخطية الكبيرة ، دار النشر الأكاديمية، 1971. (أعيد طبعه بواسطة دوفر، 2003)
روابط خارجية
- وحدة طريقة SOR
- برنامج لحل أنظمة المعادلات الخطية ثلاثية الأقطار يعتمد على SOR، مكتوب بلغة C++
- الجبر الخطي العددي
- الاسترخاء (الأساليب التكرارية)
