علوم وفضاء

matrix_rank: لماذا تنقص الرتبة مع قطر غير صفري؟

قطر موجب وحدود عددية.
القيمة نفسها تحت حدود مختلفة.

أعادت الدالة رتبة عددية تساوي 1 لمصفوفتنا القطرية ذات الخانتين الموجبتين. تغيير الحد أعاد 2؛ والتحجيم غيّر النتيجة عند إبقاء حد مطلق ثابت.

حدد معنى الحد العددي

تعد matrix_rank القيم المفردة الأكبر من tol؛ والحد الافتراضي يعتمد على أكبرها والأبعاد وeps. [1]

عند ترك tol دون تحديد، الحد هو S.max()×max(M,N)×eps؛ حيث S قيمها المفردة، وM وN عدد الصفوف والأعمدة. [1]

في float64 الثنائية، eps=2⁻⁵²؛ وهي الفجوة بين 1 وأقرب عدد ممثل أكبر منه. [2]

نختار مصفوفة قطرية صغيرة حتى نستطيع فصل الحساب الجبري عن قرار الحد. الأعداد مؤلفة بلا وحدات، وليست قياسات لها عدم يقين نريد تقديره. لا نختار حدًا مناسبًا لتطبيق علمي من هذا المثال.

المدخل A=[[1,0],[0,2⁻⁵⁴]]. عموداه مستقلان جبريًا: إذا أعطى جمع مضاعفين منهما المتجه الصفري، فالمركبة الأولى تفرض المعامل الأول صفرًا، والثانية تفرض الثاني صفرًا لأن 2⁻⁵⁴ غير صفر. رتبته الجبرية 2 في هذا الحساب.

وقيمتاه المفردتان الموجبتان هنا 1 و2⁻⁵⁴: حاصل AᵀA قطري بخانتين 1 و2⁻¹⁰⁸، وجذراهما غير السالبين يعيدان الرقمين. هذا اشتقاق يدوي للمصفوفة القطرية المحددة؛ لم نستدع SVD مستقلًا لتسجيل قيمتين منها.

راجع الافتراضي وحد المساواة

أنشأنا A=np.array([[1.0,0.0],[0.0,float(Fraction(1,2**54))]],dtype=np.float64). شكلها (2,2). في NumPy 2.3.5 على CPython 3.12.14 أعادت np.linalg.matrix_rank(A) العدد 1، وكان نوع النتائج المسجلة numpy.int64 وشكلها قياسيًا ().

الخانة الصغيرة 2⁻⁵⁴ تساوي تقريبًا 5.551115123125783e-17. ليست صفرًا في المدخل. حسبنا الحد الافتراضي من 1×2×2⁻⁵²=2⁻⁵¹، أي 4.440892098500626e-16. الرقم 1 يتجاوز الحد، أما الخانة الصغيرة فلا تتجاوزه.

أعدنا الاستدعاء مع tol=float(Fraction(1,2**54))؛ بقيت الرتبة 1. القيمة الصغيرة تساوي هذا الحد تمامًا في الأعداد الثنائية المختارة، والمقارنة المطلوبة أكبر من، فلا نضمها إلى العد عند المساواة.

خفضنا الحد إلى نصفها: tol=float(Fraction(1,2**55)). أعاد الاستدعاء 2؛ تجاوزت القيمتان الحد الجديد. لم نغير A أو نضف عمودًا، بل غيرنا شرط العد في الاستدعاء.

أجرينا أيضًا تحكمين: tol=0.0 أعاد 2، وtol=1.0 أعاد 0. عند الحد الأخير، القيمة الكبيرة تساوي 1 ولا تتجاوزه، والصغيرة أقل منه. صفر الناتج هنا لا يعني أننا استبدلنا كل عناصر المدخل بأصفار.

نحفظ قيمة الحد مع النتيجة. ظهور 2 عند tol=0 في هذا المثال لا يثبت أن هذا الاختيار يكشف الرتبة الجبرية لكل مدخل؛ مرجعنا محدود بمصفوفات قطرية موجبة ذات قيم معلومة.

افصل الحد الثابت عن التحجيم

اخترنا حدًا ثابتًا f=2⁻⁵³، أي 1.1102230246251565e-16. أعادت matrix_rank(A,tol=float(f)) الرتبة 1؛ لأن 2⁻⁵⁴ أصغر من f، بينما 1 أكبر منه.

ثم نفذنا B=16*A. بقي الشكل (2,2) والنوع float64، وصار القطر 16 و2⁻⁵⁰. الخانة الثانية تساوي 8.881784197001252e-16. أعادت matrix_rank(B,tol=float(f)) الرتبة 2، إذ تجاوزت الخانتان الحد المطلق الذي أبقيناه كما هو.

في المقابل، أعادت matrix_rank(B) دون tol الرتبة 1. حسبنا حد المثال المتحجم من 16×2×2⁻⁵²=2⁻⁴⁷. الخانة الصغيرة 2⁻⁵⁰ تظل أقل منه، بينما 16 تتجاوزه.

النسبة بين الخانة الصغيرة والحد الافتراضي هي 1/8 في A، وتبقى 1/8 في B. أما مع f الثابت، فهي 1/2 في A و8 في B. هذه الكسور توضح لماذا اختلف التحكم الثابت دون أن تختلف النتيجة الافتراضية في المثال.

التحجيم هنا مضاعفة للمدخل كله بعدد غير صفري. من حيث الاستقلال الجبري تبقى الرتبة 2؛ الاختلاف الذي سجلناه يخص قرارًا عدديًا تحت حد معلن. لا ننقل هذا الضبط إلى مصفوفة عامة أو بيانات ذات وحدات مختلفة دون مراجعة المسألة.

المدخل بعد التحجيم.
حد ثابت وافتراضي مختلفان.

راجع المرجع ونطاق الفحوص

بنى المرجع القيم والحدود باستخدام Fraction. يثبت eps المرجعي عند 1/2⁵²، ويحسب الحد الافتراضي من أكبر الخانتين مضروبًا في 2 ثم eps. للحد الصريح يعد الخانتين اللتين تتجاوزانه بالمقارنة الكسرية الصارمة.

لم يستخدم المرجع matrix_rank أو SVD أو finfo من NumPy لتوليد التوقع. أجرينا استدعاء np.finfo(np.float64).eps كتحكم إضافي، فأعطى 2.220446049250313e-16، ووافق القيمة المرجعية المختارة.

في الشبكة، أساس الخانة الكبيرة من 1 أو 2 أو 4 أو 8. أساس الصغيرة 2⁻ᵏ، مع k من 48 إلى 56 شاملًا، ثم نضرب الخانتين بمعامل 1 أو 16. عدد الحالات 4×9×2=72، وكل مدخل قطري موجب من float64 بالشكل (2,2).

لكل حالة ثمانية فحوص: الرتبة الافتراضية؛ والحد صفر؛ والحد المساوي للصغيرة؛ ونصف الصغيرة؛ والحد الثابت 2⁻⁵³؛ والحد المساوي للكبيرة؛ وأنواع نتائج الاستدعاءات وأشكالها القياسية؛ وبقاء بايتات المدخل وشكله ونوعه.

أجرينا الثمانية نفسها على A الرئيسية. أضفنا أربعة تحكمات: قيم B ونوعها وشكلها؛ ورتبتها الافتراضية؛ ورتبتها بالحد الثابت؛ وقيمة eps مع حساب الحدين الافتراضيين للمثال. الحساب 72×8+8+4=588، ومرت جميعها.

تركنا hermitian وrtol دون تقديم. لم نفحص مدخلات غير قطرية أو قطرًا صفريًا أو tol سالبًا أو float32 أو أنواعًا مركبة وobject أو دفعات أو أخطاء واستقرار SVD العام أو التخزين والأداء. اختيار قوى اثنين جعل قيم التجربة قابلة للتمثيل الثنائي الدقيق، ولا يضمن ذلك لأي حساب آخر.

قبل تفسير رتبة عددية، سجل المدخل ونوعه والحد أو غيابه، ثم راجع القرار الذي تقيسه. في مثالنا ظل العمودان مستقلين جبريًا، بينما تغير عدد القيم التي تجاوزت بعض الحدود المختارة.

المدخلحد tolالرتبة العددية
Aافتراضي: 2^-511
A02
A2^-541
A2^-552
A2^-531
A10
B=16*Aافتراضي: 2^-471
B=16*A2^-53 نفسه2

للتوسع: أنواع المصفوفات.

المراجع

  1. NumPy 2.3 — matrix_rank
  2. NumPy 2.3 — finfo

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.