علوم وفضاء

matrix_power: هل يحتاج الأس صفر إلى معكوس؟

الوحدة وجدول الآحاد.
نتيجتان للأس صفر.

أعطى الأس صفر مصفوفة الوحدة لمدخلنا المفرد؛ وأعطى الأس السالب خطأ. أما رفع عناصر المدخل إلى صفر فأنتج جدولًا من الآحاد.

حدد العملية قبل تفسير الصفر

تعيد matrix_power عند الأس صفر مصفوفة الوحدة بالشكل نفسه؛ وعند الأس السالب تستخدم المعكوس. [1]

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

يفيد المثال المفرد هنا لأننا نستطيع مراجعة شرط المعكوس بالأعداد. نختار A=[[0,3],[0,0]]؛ حاصل 0×0−3×0 يساوي صفرًا. لا نستدل على وجود معكوس من نجاح استدعاء للأس صفر.

الأعداد مؤلفة وبلا وحدات. لا تمثل عينة علمية أو معاملات نموذج، ولا نقيس زمن التنفيذ أو دقة حلول كبيرة. نحتفظ في سجل كل استدعاء بالقيمة والشكل والنوع أو باسم الخطأ.

قارن الوحدة بجدول الآحاد

أنشأنا A=np.array([[0,3],[0,0]],dtype=np.int64). في NumPy 2.3.5 على CPython 3.12.14 أعادت np.linalg.matrix_power(A,0) [[1,0],[0,1]]؛ شكلها (2,2) ونوعها int64.

أما np.power(A,0) فأعادت [[1,1],[1,1]] بالنوع والشكل نفسيهما. الخانتان خارج القطر تفصلان النتيجتين: صفرا الوحدة صارا آحادًا في الاستدعاء الثاني. وجود الصفر في خانات المدخل لم يجعل هذه الخانات صفرية في خرج power مع هذا الأس.

تطبق power الرفع إلى القوة على العناصر؛ ويختصر العامل ** هذه العملية على ndarray. [2] نفذنا power صراحة في تجربتنا، ولا نزعم أننا نفذنا عامل ** أيضًا.

يمكن مراجعة وظيفة الناتجين بحساب مستقل. إذا ضربنا الوحدة في A، يعيد جمع الصف في العمود A نفسها. أما جدول الآحاد J=[[1,1],[1,1]]، فيعطي JA=[[0,3],[0,3]] وAJ=[[3,3],[0,0]]؛ لا يحافظ أي منهما على A المختارة.

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

ثم راجعنا الأس اثنين. كل خانة في حاصل AA تساوي صفرًا: مثلًا خانة الصف الأول والعمود الثاني هي 0×3+3×0. أعاد matrix_power(A,2) [[0,0],[0,0]]، بينما أعاد power(A,2) [[0,9],[0,0]].

وأعاد matrix_power(A,3) مصفوفة صفرية أيضًا. في مرجعنا اليدوي AA صفرية، وضربها في A يبقي الخانات الأربع صفرية. هذه نتيجة للمدخل المحدد، وليست وصفًا لكل مصفوفة مفردة.

افصل الأس السالب عن الأس صفر

أثار np.linalg.matrix_power(A,-1) خطأ LinAlgError في تشغيلنا. لم يرجع هذا الاستدعاء مصفوفة حلول أو مصفوفة أصفار. لذلك نسجل اسمه وخطأه بدل ملء خانة نتيجة رقمية من عندنا.

للمقارنة أنشأنا مدخلًا مستقلًا D=np.array([[2,0],[0,4]],dtype=np.int64). أعادت np.linalg.matrix_power(D,-1) [[0.5,0.0],[0.0,0.25]] بالشكل (2,2) وبنوع float64.

حسبنا مرجع D بقسمة مستقلة: محدده 2×4−0×0=8، ومصفوفة المعكوس [[4,0],[0,2]] مقسومة على 8. ينتج 1/2 و1/4 على القطر. الكسور المختارة قابلة للتمثيل العائم الدقيق في هذا التشغيل.

لكن np.power(D,-1) أثارت ValueError. توثق power خطأ رفع نوع صحيح إلى أس صحيح سالب. [2] احتفظنا بمدخل int64 في الاستدعاءين.

إذن نجاح matrix_power(D,-1) لا يقرر نجاح power(D,-1)، ونجاح matrix_power(A,0) لا يقرر وجود معكوس A. اكتب اسم العملية والأس ونوع المدخل إلى جانب الرقم قبل نقل نتيجة من استدعاء إلى آخر.

قوى المدخل المفرد.
الأس السالب وتحكم مستقل.

راجع ما تثبته الفحوص

شبكتنا تختار كل واحدة من خانات المصفوفة الثنائية الأربع من −1 أو صفر أو 1. عدد الحالات 3⁴=81. نستعمل int64 والشكل (2,2) في كل حالة، ونقارن الأس صفر واثنين وثلاثة و−1، مع أسّي العناصر صفر واثنين.

يبني المرجع حاصل الضرب بقوائم Python وحلقتي الصف والعمود، وجمع حدين لكل خانة. لبناء القوة الثالثة يضرب حاصل التربيع في المدخل. لا يستخدم matrix_power أو power أو matmul أو inv من NumPy لصنع التوقع.

يحسب المرجع المحدد ad−bc. إذا كان غير صفر، يبني [[d,−b],[−c,a]] مقسومة عليه باستخدام Fraction، ثم يحول الكسور إلى float. محددات الشبكة غير الصفرية هي ±1 أو ±2، فتظل الكسور صغيرة وممثلة بدقة في المقارنة المحددة.

في 33 حالة من الشبكة كان المحدد صفرًا، وراجعنا ظهور LinAlgError للأس −1. في بقية الحالات راجعنا قيم المعكوس المتوقعة ونوع الناتج وشكله. هذا ضبط لحالاتنا الصغيرة، ولا يختبر التكييف العددي لمصفوفات عامة.

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

أجرينا الفحوص الثمانية نفسها على A الرئيسية. أضفنا أربعة تحكمات: القوتان الثانية والثالثة الصفريتان؛ فصل خطأ الأس السالب عن نتيجتي الأس صفر؛ معكوس D ونوعه وشكله؛ وخطأ power على D مع الأس −1. الحساب 81×8+8+4=660، ومرت الفحوص كلها.

اقتصر التنفيذ على int64 ومصفوفات ثنائية صغيرة، والمعكوس العائم للتحكمات المحددة. لم نفحص الدفعات أو الأنواع المركبة أو object أو الأشكال المستطيلة أو الأس الكسري أو الفائض العددي أو التخزين أو الأداء. حساب الوحدة عند الأس صفر لا يثبت صلاحية معكوس لمدخل آخر.

قبل تفسير النتيجة، اسأل أي عملية نفذت وعلى أي مدخل وبأي أس. اقرأ الخانات خارج القطر مع القطر، واحتفظ باسم الخطأ حين لا يرجع الاستدعاء نتيجة.

الاستدعاءالمدخلالناتجنوع الناتج
matrix_power(A,0)[[0,3],[0,0]][[1,0],[0,1]]int64
power(A,0)A[[1,1],[1,1]]int64
matrix_power(A,2)A[[0,0],[0,0]]int64
power(A,2)A[[0,9],[0,0]]int64
matrix_power(A,-1)ALinAlgErrorلا نتيجة
matrix_power(D,-1)[[2,0],[0,4]][[0.5,0],[0,0.25]]float64
power(D,-1)DValueErrorلا نتيجة

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

المراجع

  1. NumPy 2.3 — matrix_power
  2. NumPy 2.3 — power

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