تحليل تشوليسكي غير الكامل

في التحليل العددي ، يُعدّ تحليل تشوليسكي غير الكامل لمصفوفة متناظرة موجبة التحديد تقريبًا متفرقًا لتحليل تشوليسكي . ويُستخدم تحليل تشوليسكي غير الكامل غالبًا كمعالجة مسبقة لخوارزميات مثل طريقة التدرج المترافق .

يُعطى تحليل تشوليسكي لمصفوفة موجبة محددة A من الرتبة N بالعلاقة A = LL *، حيث L مصفوفة مثلثية سفلية . أما تحليل تشوليسكي غير الكامل فيُعطى بمصفوفة مثلثية سفلية K أقل كثافة من L ، ولكنها تُشابهها في بعض النواحي . ويُسمى المُهيئ المُقابل KK *.

توجد طرق عديدة لإنشاء تحليلات تشوليسكي غير الكاملة. تستعرض هذه المقالة اثنتين منها.

تحفيز

لنأخذ المصفوفة التالية كمثال:

أ=[5-20-2-2-25-2000-25-20-20-25-2-200-25]{\displaystyle \mathbf {A} ={\begin{bmatrix}5&-2&0&-2&-2\\-2&5&-2&0&0\\0&-2&5&-2&0\\-2&0&-2&5&-2\\-2&0&0&-2&5\\\end{bmatrix}}}

إذا طبقنا تحليل تشوليسكي المنتظم الكامل ، فإنه ينتج عنه:

ل=[2.240000-0.892.050000-0.982.0200-0.89-0.39-1.181.630-0.89-0.39-0.19-1.950.45]{\displaystyle \mathbf {L} ={\begin{bmatrix}2.24&0&0&0&0\\-0.89&2.05&0&0&0\\0&-0.98&2.02&0&0\\-0.89&-0.39&-1.18&1.63&0\\-0.89&-0.39&-0.19&-1.95&0.45\\\end{bmatrix}}}

وبحسب التعريف:

أ=لل{\displaystyle \mathbf {A} =\mathbf {L} \mathbf {L'} }

مع ذلك، بتطبيق تحليل تشوليسكي، نلاحظ أن بعض العناصر الصفرية في المصفوفة الأصلية تصبح عناصر غير صفرية في المصفوفة المُحللة، مثل العناصر (4،2) و(5،2) و(5،3) في هذا المثال. تُعرف هذه العناصر باسم "العناصر المُضافة".

هذا ليس مشكلة في حد ذاته، ولكنه يمثل مشكلة كبيرة عند العمل مع المصفوفات المتفرقة ، لأن توليد الحشوات يكون في الغالب غير قابل للتنبؤ ويقلل من تفرق المصفوفة، مما يؤثر على كفاءة خوارزميات المصفوفات المتفرقة.

لذا، ونظرًا لأهمية تحليل تشوليسكي في حسابات المصفوفات، فمن الضروري للغاية إعادة استخدام الطريقة التقليدية للتخلص من توليد القيم المفقودة. وتقوم تحليلات تشوليسكي غير الكاملة بذلك تحديدًا، إذ تُنتج مصفوفة ما.ك{\displaystyle \mathbf {K} }هذا أقل كثافة منل{\displaystyle \mathbf {L} }ويعطي تقريبًاأكك{\displaystyle \mathbf {A} \approx \mathbf {K} \mathbf {K'} }.

تشوليسكي غير مكتمل من المستوى صفر

تُشغّل خوارزمية تشوليسكي غير المكتملة من المستوى صفر أو IC(0) خوارزمية تشوليسكي الدقيقة، ولكنها تتخطى تحديثات K لضمان أن يكون لها نفس درجة التباعد مثل A. لوصف الخوارزمية رياضيًا، قم بتهيئة K إلى مصفوفة صفرية من الرتبة N × N.أنا{\displaystyle i}من1{\displaystyle 1}لشمال{\displaystyle N}، نحن نحدد

كأناأنا=(أأناأنا-ك=1أنا-1كأناك2)12{\displaystyle K_{ii}=\left({a_{ii}-\sum \limits _{k=1}^{i-1}{K_{ik}^{2}}}\right)^{1 \over 2}}،

ولـج{\displaystyle j}منأنا+1{\displaystyle i+1}لشمال{\displaystyle N}، نقوم بتطبيق التحديث التالي فقط إذاأجأنا{\displaystyle a_{ji}}غير صفري

كجأنا=1كأناأنا(أجأنا-ك=1أنا-1كأناككجك){\displaystyle K_{ji}={1 \over {K_{ii}}}\left({a_{ji}-\sum \limits _{k=1}^{i-1}{K_{ik}K_{jk}}}\right)}.

ينتج عن ذلك عامل K يكون بنفس قلة عناصر المثلث السفلي للمصفوفة وبالتالي فإن تخزين كل من A و K يتطلب ضعف مساحة التخزين المطلوبة لتخزين A وحدها على الأكثر. قد تتوقف خوارزمية IC(0) مع وجود خطأ في بعض المصفوفات الموجبة المحددة. وهي مضمونة النجاح إذا كانت A مهيمنة قطريًا ، على الرغم من وجود العديد من المصفوفات الموجبة المحددة التي تنجح فيها IC(0) حتى بدون هيمنة قطرية.

تنفيذ Octave أو MATLAB لهياكل بيانات المصفوفات الكثيفة

تطبيق تحليل تشوليسكي غير الكامل في لغة GNU Octave . يتم تخزين التحليل كمصفوفة مثلثية سفلية، مع ضبط عناصر المثلث العلوي على الصفر.

دالة a = ichol ( a ) n = size ( a , 1 );لـ k = 1 : n a ( k , k ) = sqrt ( a ( k , k )); لـ i = ( k + 1 ): n إذا كان ( a ( i , k ) != 0 ) a ( i , k ) = a ( i , k ) / a ( k , k ); endif endfor لـ j = ( k + 1 ): n لـ i = j : n إذا كان ( a ( i , j ) != 0 ) a ( i , j ) = a ( i , j ) - a ( i , k ) * a ( j , k ); endif endfor endfor endforfor i = 1 : n for j = i + 1 : n a ( i , j ) = 0 ; endfor endfor endfunction

مثال عملي

لنعد إلى النظر في المصفوفة المعروضة في قسم الدوافع من هذه المقالة. بما أنها متناظرة، ولأن الطريقة تستخدم فقط العناصر المثلثية السفلية، فيمكننا تمثيلها كما يلي:

أترأنا=[50000-250000-2500-20-250-200-25]{\displaystyle \mathbf {A_{tri}} ={\begin{bmatrix}5&0&0&0&0\\-2&5&0&0&0\\0&-2&5&0&0\\-2&0&-2&5&0\\-2&0&0&-2&5\end{bmatrix}}}

وبشكل أكثر تحديدًا، في شكلها المتفرق كقائمة إحداثيات، مع مسح الصفوف أولاً:

القيمة 5 -2 -2 -2 5 -2 5 -2 5 -2 5 الصف 1 2 4 5 2 3 3 4 4 5 5 العمود 1 1 1 1 2 2 3 3 4 4 5 

ثم نأخذ الجذر التربيعي لـ (1,1) ونقسم العناصر الأخرى (i,1) على النتيجة:

القيمة 2.24 -0.89 -0.89 -0.89 | 5 -2 5 -2 5 -2 5 الصف 1 2 4 5 | 2 3 3 4 4 5 5 العمود 1 1 1 1 | 2 2 3 3 4 4 5 

بعد ذلك، بالنسبة لجميع العناصر الأخرى التي يزيد عمودها عن 1، احسب (i,j) = (i,j) - (i,1) * (j,1) إذا كان (i,1) و (j,1) موجودين. على سبيل المثال: (5,4) = (5,4) - (5,1) * (4,1) = -2 - (-0.89 * -0.89) = -2.8.

القيمة 2.24 -0.89 -0.89 -0.89 | 4.2 -2 5 -2 4.2 -2.8 4.2 الصف 1 2 4 5 | 2 3 3 4 4 5 5 العمود 1 1 1 1 | 2 2 3 3 4 4 5 ↑ ↑ ↑ ↑ 

تمت إعادة حساب العناصر (2,2)، (4,4)، (5,4)، و(5,5) (المشار إليها بسهم)، لأنها تخضع لهذه القاعدة. في المقابل، لن تتم إعادة حساب العناصر (3,2)، (3,3)، و(4,3) لأن العنصر (3,1) غير موجود، على الرغم من وجود العنصرين (2,1) و(4,1). الآن، كرر العملية، ولكن للعنصر (i,2). خذ الجذر التربيعي للعنصر (2,2) واقسم باقي عناصر (i,2) على الناتج.

القيمة 2.24 -0.89 -0.89 -0.89 | 2.05 -0.98 | 5 -2 4.2 -2.8 4.2 الصف 1 2 4 5 | 2 3 | 3 4 4 5 5 العمود 1 1 1 1 | 2 2 | 3 3 4 4 5 

مرة أخرى، بالنسبة للعناصر التي يزيد عمودها عن 2، احسب (i,j)=(i,j)-(i,2)*(j,2) إذا كان (i,2) و (j,2) موجودين:

القيمة 2.24 -0.89 -0.89 -0.89 | 2.05 -0.98 | 4.05 -2 4.2 -2.8 4.2 الصف 1 2 4 5 | 2 3 | 3 4 4 5 5 العمود 1 1 1 1 | 2 2 | 3 3 4 4 5 ↑ 

كرر العملية للنقطة (i,3). خذ الجذر التربيعي للنقطة (3,3) واقسمها على النقطة (i,3) الأخرى:

القيمة 2.24 -0.89 -0.89 -0.89 2.05 -0.98 | 2.01 -0.99 | 4.2 -2.8 4.2 الصف 1 2 4 5 2 3 | 3 4 | 4 5 5 العمود 1 1 1 1 2 2 | 3 3 | 4 4 5 

بالنسبة للعناصر التي يزيد عمودها عن 3، احسب (i,j)=(i,j)-(i,3)*(j,3) إذا كان (i,3) و (j,3) موجودين:

القيمة 2.24 -0.89 -0.89 -0.89 2.05 -0.98 | 2.01 -0.99 | 3.21 -2.8 4.2 الصف 1 2 4 5 2 3 | 3 4 | 4 5 5 العمود 1 1 1 1 2 2 | 3 3 | 4 4 5 ↑ 

كرر العملية للنقطة (i,4). خذ الجذر التربيعي للنقطة (4,4) واقسمها على النقطة (i,4) الأخرى:

القيمة 2.24 -0.89 -0.89 -0.89 2.05 -0.98 2.01 -0.99 | 1.79 -1.56 | 4.2 الصف 1 2 4 5 2 3 3 4 | 4 5 | 5 العمود 1 1 1 1 2 2 3 3 | 4 4 | 5 

بالنسبة للعناصر التي يزيد عمودها عن 4، احسب (i,j)=(i,j)-(i,4)*(j,4) إذا كان (i,4) و (j,4) موجودين:

القيمة 2.24 -0.89 -0.89 -0.89 2.05 -0.98 2.01 -0.99 | 1.79 -1.56 | 1.76 الصف 1 2 4 5 2 3 3 4 | 4 5 | 5 العمود 1 1 1 1 2 2 3 3 | 4 4 | 5 ↑ 

وأخيراً، خذ الجذر التربيعي للعدد (5،5):

القيمة 2.24 -0.89 -0.89 -0.89 2.05 -0.98 2.01 -0.99 1.79 -1.56 | 1.33 الصف 1 2 4 5 2 3 3 4 4 5 | 5 العمود 1 1 1 1 2 2 3 3 4 4 | 5 

توسيع المصفوفة إلى شكلها الكامل:

ك=[2.240000-0.892.050000-0.982.0100-0.890-0.991.790-0.8900-1.561.33]{\displaystyle \mathbf {K} ={\begin{bmatrix}2.24&0&0&0&0\\-0.89&2.05&0&0&0\\0&-0.98&2.01&0&0\\-0.89&0&-0.99&1.79&0\\-0.89&0&0&-1.56&1.33\end{bmatrix}}}

لاحظ أنه في هذه الحالة لم يتم إنشاء أي قيم بديلة مقارنةً بالمصفوفة الأصلية. لا تزال العناصر (4,2) و(5,2) و(5,3) تساوي صفرًا.

لكن إذا قمنا بضرب K في منقوله:

كك=[5-20-2-2-25-20.80.80-25-20-20.8-25-2-20.80-25]{\displaystyle \mathbf {KK'} ={\begin{bmatrix}5&-2&0&-2&-2\\-2&5&-2&0.8&0.8\\0&-2&5&-2&0\\-2&0.8&-2&5&-2\\-2&0.8&0&-2&5\end{bmatrix}}}

نحصل على مصفوفة مختلفة قليلاً عن المصفوفة الأصلية، لأن عملية التفكيك لم تأخذ في الاعتبار جميع العناصر، وذلك للتخلص من العناصر المعبأة.

تطبيق MATLAB باستخدام بنية بيانات المصفوفة المتفرقة

يمكن الاطلاع أدناه على النسخة المتفرقة من تحليل تشوليسكي غير الكامل (نفس الإجراء المذكور أعلاه) المُنفذة في MATLAB . وبالطبع، يمتلك MATLAB آلياته الخاصة للتعامل مع المصفوفات المتفرقة، ولكن تم توضيح الكود أدناه لأغراض تعليمية. تتميز هذه الخوارزمية بالكفاءة، حيث أنها تتعامل مع المصفوفة كمصفوفة أحادية البعد متسلسلة، متجنبةً العناصر الصفرية تلقائيًا.

دالة A = Sp_ichol ( A ) n = size ( A , 1 ); ncols = A ( n ). col ; c_end = 0 ; for col = 1 : ncols is_next_col = 0 ; c_start = c_end + 1 ; for i = c_start : n if A ( i ). col == col % في العمود الحالي (col): if A ( i ). col == A ( i ) . row A ( i ). val = sqrt ( A ( i ). val ); % خذ الجذر التربيعي لعنصر القطر الرئيسي للعمود الحالي div = A ( i ). val ; else A ( i ). val = A ( i ). val / div ; % اقسم عناصر العمود الحالي الأخرى على الجذر التربيعي لعنصر القطر الرئيسي end end if A ( i ). col > col % في الأعمدة التالية (col+1 ... ncols): إذا كان is_next_col == 0 c_end = i - 1 ; is_next_col = 1 ; end v1 = 0 ; v2 = 0 ; for j = c_start : c_end if A ( j ). col == col if A ( j ). row == A ( i ). row % ابحث عن عناصر العمود الحالي (col) A(j) التي يكون فهرس صفها هو نفسه فهرس صف العنصر الحالي A(i) v1 = A ( j ). val ;إذا كان A ( j ) .row == A ( i ) .col % ابحث عن عناصر العمود الحالي (col) A(j) التي يكون فهرس صفها هو نفسه فهرس عمود العنصر الحالي A(i) v2 = A ( j ) .val ; نهاية إذا كان v1 ~ = 0 && v2 ~= 0 % إذا كانت هذه العناصر موجودة في العمود الحالي (col)، فأعد حساب العنصر الحالي A(i): A ( i ) .val = A ( i ) .val - v1 * v2 ; break ; نهاية نهاية نهاية نهاية نهاية نهاية نهاية

تشوليسكي غير المكتمل ذو القاعدة القطرية

تُنشئ خوارزمية تشوليسكي غير المكتملة القائمة على القطر (DIC) عاملاً K يمكن تخزينه باستخدام المساحة المتاحة فقط لعددين إضافيين A و N. [ 1 ] ومثل IC(0)، تنجح خوارزمية DIC عندما يكون العنصر مهيمناً قطرياً. ويمكن لبعض متغيرات خوارزمية DIC أن تعمل حتى الاكتمال لفئات أعم قليلاً من المصفوفات.

باستخدام DIC، نحددك=(S+د)د-1/2{\displaystyle \mathbf {K} =(\mathbf {S} +\mathbf {D} )\mathbf {D} ^{-1/2}}، أينS{\displaystyle \mathbf {S} }هو المثلث السفلي الصارم لـأ{\displaystyle \mathbf {A} }ود{\displaystyle \mathbf {D} }هي المصفوفة القطرية الناتجة عن الإجراء التالي:

نهيئ متجهًا d على قطر المصفوفة A. ثم نكرر العملية علىأنا{\displaystyle i}من 2 إلى N. عند تكرار معين نكرر على j من i+1 إلى ونخفض التاريخدج=دج-أجأنا2/دأنا{\displaystyle d_{j}=d_{j}-a_{ji}^{2}/d_{i}}لاحظ أنه يمكن تخطي هذا التحديث عندأجأنا{\displaystyle a_{ji}}يساوي صفرًا.

تطبيق بايثون باستخدام بنية بيانات المصفوفة المتفرقة

من scipy.sparse استورد csc_matrix، واستورد numpy كـ npdef dic_diagonal ( A : csc_matrix ) -> np . ndarray : # يوضح الشكل 3.3 من www.netlib.org/templates/templates.pdf كيفية # حساب قطر "inv(D)" للمُهيئ LU غير الكامل القائم على القطر. # تُكيّف هذه الدالة تلك الطريقة للمصفوفات المتناظرة # ذات القطر المهيمن، وتُنشئ قطر D # (بدلاً من قطر inv(D)). d = A . diagonal () inds = A . indices ptrs = A . indptr vals = A . البيانات لـ i في نطاق ( حجم d ) : إذا كان d [ i ] < 0 : ارفع ValueError ( 'فشل تحليل DIC!' ) j = inds [ ptrs [ i ]: ptrs [ i + 1 ]] v = vals [ ptrs [ i ]: ptrs [ i + 1 ]] selector = j > i j = j [ selector ] v = v [ selector ] d [ j ] -= v ** 2 / d [ i ] إرجاع d

مراجع

  1. باريت، ريتشارد؛ بيري، مايكل؛ تشان، توني ف.؛ ديميل، جيمس؛ دوناتو، جون؛ دونغارا، جاك؛ إيخوت، فيكتور؛ بوزو، رولدان؛ رومين، تشارلز (يناير 1994). "انظر القسم 3.4.2". قوالب لحل الأنظمة الخطية: لبنات بناء الطرق التكرارية (ملف PDF) . جمعية الرياضيات الصناعية والتطبيقية. doi : 10.1137/1.9781611971538 . ISBN 978-0-89871-328-2.