علوم وفضاء

slogdet: هل صفر det يثبت انعدام المحدد؟

المدخل والنتائج.
الإشارة واللوغاريتم منفصلان.

أعادت det صفرًا عائمًا لمصفوفتنا ذات المحدد الكسري الموجب غير الصفري. احتفظت slogdet بالإشارة ولوغاريتم منتهٍ، بخلاف تحكم ذي خانة قطرية صفرية.

حدد التمثيل الذي تقرؤه

قد يضمحل خرج det لمحدد صغير؛ وتعيد slogdet إشارته واللوغاريتم الطبيعي لقيمته المطلقة. [1]

تحسب det محدد المصفوفة. [2]

نختار مدخلًا قطريًا بحيث يمكن حساب المحدد مستقلًا بضرب خانتي القطر. كل خانة 2⁻⁶⁰⁰ غير صفرية، وحاصل الضرب الدقيق 2⁻¹²⁰⁰ موجب وغير صفري. السؤال هو ما الذي يبقى في نتيجة التشغيل العائمة.

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

logabsdet لوغاريتم القيمة المطلقة للمحدد؛ وsign يحتفظ بالإشارة منفصلة. [1]

قارن الخرج العائم بالمرجع الكسري

أنشأنا x=float(Fraction(1,2**600))، ثم A=np.array([[x,0],[0,x]],dtype=np.float64). قيمة x المعروضة 2.409919865102884e-181، وشكل A هو (2,2). بقيت الخانتان القطريتان غير صفريتين في المدخل.

في NumPy 2.3.5 على CPython 3.12.14 أعادت np.linalg.det(A) القيمة 0.0. أعادت np.linalg.slogdet(A) sign=1.0 وlogabsdet=-831.7766166719343. القيم الثلاث من numpy.float64 وأشكالها قياسية ().

حسبنا المحدد باستخدام Fraction: (1/2⁶⁰⁰)×(1/2⁶⁰⁰)=1/2¹²⁰⁰. لا توجد قسمة على صفر ولا خانة قطرية منعدمة في هذا الحساب. وتحويل هذا الكسر المحدد إلى float أعطى صفرًا في تحكمنا المستقل.

أما اللوغاريتم المرجعي فهو −1200×ln(2). حسبنا ln(2) في Decimal بدقة 80 رقمًا، ثم حولنا النتيجة إلى float للمقارنة؛ ظهرت −831.7766166719343. توافقها في المثال لا يثبت أن الدالة تحسب كل لوغاريتم بدقة تامة.

نفذنا أيضًا sign*np.exp(logabsdet)، فأعاد 0.0. إجراء العملية الأسية رجع إلى تمثيل القيمة الصغيرة، فلم يستعد عددًا عائمًا غير صفري. احتفظنا بالزوج كما أعادته slogdet عندما أردنا قراءة الإشارة وحجم اللوغاريتم.

في تحكم مستقل N=np.array([[-x,0],[0,x]],dtype=np.float64)، المحدد الكسري −2⁻¹²⁰⁰. أعادت det(N) −0.0، وكانت np.signbit لهذه النتيجة True. أعادت slogdet(N) −1.0 واللوغاريتم المنتهي نفسه.

نكتب −0.0 كما ظهر في السجل، ولا نعده عددًا عائمًا أصغر من صفر. الإشارة −1 في الزوج الأخير هي المعلومة المنفصلة التي نراجعها للمحدد السالب الدقيق في هذا المثال. ولا نجعل بت إشارة صفر قاعدة للحكم على وجود معكوس.

قارن صفرًا دقيقًا وتحكمًا متحجمًا

توثق slogdet أن المحدد الصفري يعطي sign=0 وlogabsdet=-inf. [1]

أنشأنا Z=np.array([[x,0],[0,0]],dtype=np.float64). محددها الدقيق x×0=0. أعادت det(Z) صفرًا، وأعادت slogdet(Z) الإشارة 0.0 واللوغاريتم −inf؛ تحققنا من أنه سالب اللانهاية في التشغيل.

في A وZ ظهر صفر من det، لكن خرج الزوج مختلف: A لها إشارة 1 ولوغاريتم منتهٍ، وZ لها إشارة 0 ولوغاريتم غير منتهٍ في التحكم الصفري. لا نخلط هذين السجلين بسبب تشابه الرقم الواحد الذي أعادته det.

أجرينا تحكمًا آخر C=float(2**600)*A. صارت قيم C=[[1,0],[0,1]]، مع بقاء النوع float64 والشكل (2,2). أعادت det(C) 1.0، وslogdet(C) الإشارة 1.0 واللوغاريتم 0.0.

يدويًا، ضرب الخانتين القطريتين في 2⁶⁰⁰ يضاعف حاصل ضربهما بالعامل 2¹²⁰⁰. لذا يصير المحدد الدقيق 2¹²⁰⁰×2⁻¹²⁰⁰=1. هذا تفسير لحساب التحجيم المحدد، لا وصفة عامة لإصلاح كل مدخل صغير أو كبير.

لم نعد C مدخلًا مطابقًا لـA، ولم ننقل قيمة 1 إلى سجل A الأصلية. حفظنا بايتات A قبل التحكم وبعده، ووجدناها متساوية. قيمة المحدد وناتجها العائم يتبعان المدخل الذي مررناه فعلًا.

إعادة البناء والتحجيم.
خرج جديد لمدخل آخر.

راجع التسامح وحدود الفحوص

في الشبكة نختار أس كل خانة قطرية من 500 أو 550 أو 600، وإشارة كل خانة من +1 أو −1. القيم هي ±2⁻ᵏ، وعدد الحالات 3×3×2×2=36. كل مدخل float64 قطري ثنائي وخانتاه غير صفريتين.

ينتج المرجع الكسري محددًا بإشارة حاصل ضرب الإشارتين، ومقدار 2⁻⁽ⁱ⁺ʲ⁾. يبني المرجع اللوغاريتمي −(i+j)×ln(2) في Decimal بدقة 80 رقمًا. لا يستخدم det أو slogdet أو exp من NumPy لصنع التوقع.

قارنّا اللوغاريتم المرجعي والناتج بتسامح مطلق 1e-12 وتسامح نسبي صفر. للمحدد العائم وإعادة البناء استعملنا تسامحًا نسبيًا 1e-12 ومطلقًا صفرًا. عندما كان المرجع العائم صفرًا، كان المطلوب أن يكون الناتج صفرًا أيضًا؛ لا نخفي اختلافًا صغيرًا بحد مطلق موجب.

لكل حالة ثمانية فحوص: الإشارة؛ واللوغاريتم؛ وقيمة det مقابل التحويل العائم للكسر؛ وأنواع القيم الثلاث وأشكالها القياسية؛ وبت إشارة det؛ وبقاء الخانتين غير صفريتين مع شكل المدخل ونوعه وقيمه المنتهية؛ وإعادة البناء الأسية؛ وثبات بايتات المدخل.

أجرينا الثمانية نفسها على A الرئيسية. أضفنا أربعة تحكمات: سجل Z الصفري؛ وسجل N السالب؛ وقيم C ومحددها وزوجها مع ثبات A؛ وعدم انعدام كسر محدد A رغم صفر تحويله، مع الإشارة الموجبة واللوغاريتم المنتهي. الحساب 36×8+8+4=300، ومرت الفحوص كلها.

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

لم نفحص مصفوفات غير قطرية أو تكييفًا عدديًا عامًا أو أنواعًا مركبة وobject أو دفعات أو فيضًا عدديًا أو الرتبة أو التخزين والأداء. نجاح المقارنة هنا لا يثبت دقة محدد أو لوغاريتم أي مصفوفة أخرى.

قبل تفسير صفر det، اقرأ المدخل الفعلي والتمثيل الذي تحتاج إليه، واحتفظ بزوج slogdet عند المقارنة. مثالنا يفصل صفرًا من التحويل العائم عن صفر دقيق في تحكم آخر، ولا يستبدل مراجعة المسألة الرياضية بمجرد اسم دالة.

المدخلdetsignlogabsdet
A: قطر موجب صغير0.01.0-831.7766166719343
N: قطر أول سالب-0.0-1.0-831.7766166719343
Z: قطر ثان صفري0.00.0-inf
C: الوحدة بعد التحجيم1.01.00.0

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

المراجع

  1. NumPy 2.3 — slogdet
  2. NumPy 2.3 — det

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