أعاد اختيار المثلث العلوي عاملًا مختلفًا عن منقول العامل السفلي في مدخلنا غير المتناظر. أعاد الضرب بناء مصفوفتين مختلفتين، ولم يعد المدخل الكامل.
راجع شرط المدخل قبل الخيار
تطلب cholesky مدخلًا متناظرًا موجب التعريف، لكنها لا تفحص التناظر؛ وتستخدم القطر والمثلث الذي يحدده upper. [1]
توثق الدالة أن upper=False، وهو الافتراضي، يعيد العامل السفلي؛ وTrue يعيد العامل العلوي. [1] لا نتخذ كلمة «علوي» وحدها وعدًا بأن الناتج سيكون منقول عامل احتفظنا به من استدعاء سابق.
نختار عمدًا مدخلًا لا يحقق شرط التناظر: A=[[4,6],[2,10]]. الخانتان خارج القطر 6 و2 مختلفتان. التجربة تفحص أثر اختيار المثلث، ولا تقدم هذه المصفوفة مثالًا صالحًا لتحليل تشولسكي كامل.
الأعداد مؤلفة وبلا وحدات، والنتائج سجل لتشغيل محدد. لا نعالج تغاير بيانات فعلية أو نظامًا نريد حلّه، ولا نحول قبول استدعاء إلى إثبات صلاحية المدخل الرياضي.
نقارن العاملين والقيم التي يعيد بناءها ضرب كل منهما مع منقوله بالترتيب المناسب. ثم نستعمل مدخلين متناظرين منفصلين، وتحكمًا ينقل المدخل الأصلي، حتى نعرف ما الذي تغير.
اقرأ العاملين وإعادة البناء
أنشأنا A=np.array([[4,6],[2,10]],dtype=np.int64) بالشكل (2,2). في NumPy 2.3.5 على CPython 3.12.14 أعادت np.linalg.cholesky(A,upper=False) [[2.0,0.0],[1.0,3.0]]. وأعاد الاستدعاء الافتراضي على A القيم والنوع والشكل نفسها.
أعادت np.linalg.cholesky(A,upper=True) [[2.0,3.0],[0.0,1.0]]. الناتجان L وU من float64 وبالشكل (2,2). لكن L.T=[[2,1],[0,3]]، بينما U=[[2,3],[0,1]]؛ الخانة غير القطرية والقطر الأخير مختلفان.
بالحساب المستقل، L Lᵀ=[[4,2],[2,1+9]]=[[4,2],[2,10]]. نفذنا أيضًا L@L.T، فأعاد هذه القيم من float64 بالشكل (2,2). المصفوفة الناتجة تحتفظ بالعدد 2 من الجزء السفلي للمدخل، وتضعه كذلك أعلى القطر.
وبالحساب المستقل، UᵀU=[[4,6],[6,9+1]]=[[4,6],[6,10]]. وافق الاستدعاء U.T@U هذه القيم والنوع والشكل. هنا العدد 6 من الجزء العلوي هو الذي يظهر في خانتي خارج القطر.
لم يعد أي حاصل A=[[4,6],[2,10]] كاملة. نقارن الخانات الأربع، فلا نخفي عدم التطابق لأن القطر 4 و10 صحيح أو لأن الدالة أعادت مصفوفة أعداد.
يمكن مراجعة الحساب من العامل نفسه: السفلي يعطي 2×1=2 خارج القطر و1²+3²=10 في الخانة الأخيرة. العلوي يعطي 2×3=6 و3²+1²=10. تساوي مجموع المربعين لا يجعل الرقمين اللذين دخلاهما متساويين.
قارن التحكم المتناظر بالمدخل المنقول
أنشأنا S=[[4,2],[2,10]] كمدخل مستقل من int64. أعاد upper=True عليه [[2.0,1.0],[0.0,3.0]]، أي منقول L المحسوب سابقًا. أعاد التحكم العلوي العامل الذي توقعناه للسؤال المتناظر.
وأنشأنا T=[[4,6],[6,10]] كمدخل مستقل من int64. أعاد upper=False عليه [[2.0,0.0],[3.0,1.0]]، أي منقول U السابق. كلا تحكمي الناتج من float64 بالشكل (2,2).
نراجع الإيجابية مباشرة لهذه المصفوفتين: تعبير S عند المتجه (x,y) هو (2x+y)²+9y²، وتعبير T هو (2x+3y)²+y². إذا كان أي مجموع صفرًا، يفرض الحد الأخير y=0 ثم x=0؛ لذا كلاهما موجب لكل متجه غير صفري في المثال.
في بعدين، transpose هي عملية منقول المصفوفة المعتادة. [2]
نفذنا E=np.transpose(A)، فصارت القيم [[4,2],[6,10]]. لم نصلح اختلاف خانتي خارج القطر، بل نقلنا موضعيهما. أعاد cholesky(E,upper=False) [[2.0,0.0],[3.0,1.0]]، وأعاد upper=True [[2.0,1.0],[0.0,3.0]].
عامل E السفلي يساوي منقول U الأصلي، وعاملها العلوي يساوي منقول L الأصلي. هذا تحكم على مدخل آخر، ولا يغير نتيجة تبديل الخيار على A نفسها. نحفظ المدخل والخيار مع كل عامل بدل مقارنة أسماء L وU منفصلة عن منشئها.
لا نستنتج من التحكمين المتناظرين أن أي جدول غير متناظر يصلح للتحليل. هما يوضحان كيف تتفق المقارنة عند الخانات التي جعلناها متوافقة، بينما يظل مدخلنا الرئيسي مخالفًا للشرط الموثق.

حدد المرجع ونطاق الشبكة
صممنا العوامل المتوقعة قبل استدعاء NumPy: السفلي [[p,0],[q,r]]، والعلوي [[p,t],[0,s]]. نختار p وr وs موجبة، مع q²+r²=t²+s² وq≠t. بذلك يتشارك العاملان القطر المطلوب مع اختلاف خارج القطر.
نبني المدخل [[p²,pt],[pq,q²+r²]]. يعيد حاصل العامل السفلي مع منقوله الهدف [[p²,pq],[pq,q²+r²]]، ويعيد حاصل منقول العلوي مع العلوي الهدف [[p²,pt],[pt,q²+r²]]. هذا بناء مستقل بقوائم Python، وليس استدعاءً للدالة لصنع توقعها.
في الشبكة p من 1 أو 2 أو 4. نختار (|q|,r) من (1,2) و(1,3) و(2,3) و(3,4)، ثم نجعل |t|=r وs=|q|. لإشارتي q وt اختياران مستقلان؛ العدد 3×4×2×2=48 حالة.
لكل حالة تسعة فحوص: قيم العامل السفلي ونوعه وشكله؛ وقيم العلوي ونوعه وشكله؛ ومطابقة الافتراضي للسفلي؛ وإعادة بناء هدف السفلي؛ وإعادة بناء هدف العلوي؛ واختلاف العلوي عن منقول السفلي والهدفين عن المدخل؛ والتحكم المتناظر السفلي؛ والتحكم المتناظر العلوي؛ وبقاء بايتات المدخل وشكله.
أجرينا التسعة نفسها للمثال الرئيسي. أضفنا فحصي ناتجي الضرب الأصليين في NumPy، وفحصي العاملين بعد نقل A. مجموع الفحوص 48×9+9+4=445، ومرت جميعها.
تستعمل مراجع الضرب والمنقول حلقات وفهارس Python، ولا تستدعي cholesky أو transpose أو matmul لبناء التوقع. الضربان الفعليان ونقل المدخل في NumPy تحكمات إضافية للمثال، وليست المراجع المستقلة.
القيم الصحيحة الصغيرة اختيرت لتعطي عوامل float64 ممثلة بدقة في هذا النطاق. لم نفحص مدخلات عائمة اعتباطية أو تكييفًا عدديًا أو أنواعًا مركبة أو object أو دفعات أو حالات مفردة ورسائل فشل أو التخزين والأداء.
قبل استعمال العامل، تحقق من شروط المدخل الكامل، وراجع المثلث المختار وحاصل إعادة البناء. في مثالنا يجيب كل خيار عن الأعداد التي قرأها؛ لا يكفي نجاح الاستدعاء لإلغاء اختلاف الخانات الأصلية.
| المدخل | الخيار | العامل | إعادة البناء في المثال |
|---|---|---|---|
| A=[[4,6],[2,10]] | upper=False | [[2,0],[1,3]] | [[4,2],[2,10]] |
| A نفسها | upper=True | [[2,3],[0,1]] | [[4,6],[6,10]] |
| S=[[4,2],[2,10]] | upper=True | [[2,1],[0,3]] | تحكم متناظر |
| T=[[4,6],[6,10]] | upper=False | [[2,0],[3,1]] | تحكم متناظر |
| transpose(A) | upper=False | [[2,0],[3,1]] | مدخل منقول |
| transpose(A) | upper=True | [[2,1],[0,3]] | مدخل منقول |
للتوسع: أنواع المصفوفات.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
