NumPy: الجبر الخطي

آخر تحديث: 2026-10-11

1. ما ستتعلمه




2. قصة

يحتاج بوب إلى حل نظام من 1000 معادلة خطية. يكتب حلقة حذف غاوسي — 30 ثانية وتنفيذ مليء بالأخطاء. أليس تستخدم np.linalg.solve(A, b) — 0.01 ثانية، نتيجة دقيقة. "الجبر الخطي في NumPy ليس أسرع فحسب — إنه يستدعي BLAS/LAPACK، نفس المكتبات التي يستخدمها MATLAB و R. مُختبرة لعدة عقود."




3. المفاهيم الأساسية

(1) ضرب المصفوفات

PYTHON
import numpy as np

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])

# ثلاث طرق مكافئة:
print(A @ B)            # [[19 22]
                        #  [43 50]]
print(np.dot(A, B))     # نفس الشيء
print(np.matmul(A, B))  # نفس الشيء
TEXT
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (pip install numpy) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.

(2) المعكوس والمحدد

PYTHON
import numpy as np

A = np.array([[1, 2],
              [3, 4]])

det = np.linalg.det(A)      # -2.000
inv = np.linalg.inv(A)      # [[-2.   1. ]
                             #  [ 1.5 -0.5]]
print(A @ inv)              # [[1. 0.]
                             #  [0. 1.]]  (محايدة)
TEXT
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (pip install numpy) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.

(3) حل الأنظمة الخطية

PYTHON
# حل Ax = b
A = np.array([[3, 1],
              [1, 2]])
b = np.array([9, 8])

x = np.linalg.solve(A, b)
print(x)  # [2. 3.]
print(A @ x)  # [9. 8.]  — تحقق
TEXT
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (pip install numpy) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.

▶ مثال: ضرب المصفوفات (الصعوبة ⭐)

PYTHON
import numpy as np

A = np.array([[1, 2, 3],
              [4, 5, 6]])
B = np.array([[7, 8],
              [9, 10],
              [11, 12]])

# ضرب مصفوفات: (2x3) @ (3x2) = (2x2)
C = A @ B
print("A @ B:\n", C)

# الضرب النقطي للمتجهات
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
print("dot(x, y):", np.dot(x, y))

المخرجات:

TEXT
A @ B:
 [[ 58  64]
 [139 154]]
dot(x, y): 32

▶ مثال: حل الأنظمة الخطية (الصعوبة ⭐⭐)

PYTHON
import numpy as np

# حل: 3x + y = 9, x + 2y = 8
A = np.array([[3, 1],
              [1, 2]])
b = np.array([9, 8])

x = np.linalg.solve(A, b)
print("Solution:", x)

# تحقق
print("A @ x =", A @ x)
print("b     =", b)

المخرجات:

TEXT
Solution: [2. 3.]
A @ x = [9. 8.]
b     = [9. 8.]

▶ مثال: القيم الذاتية والمتجهات الذاتية (الصعوبة ⭐⭐)

PYTHON
import numpy as np

A = np.array([[4, -2],
              [1,  1]])

eigenvalues, eigenvectors = np.linalg.eig(A)
print("Eigenvalues:", eigenvalues)

# تحقق: A @ v = λ * v
v = eigenvectors[:, 0]
lam = eigenvalues[0]
lhs = A @ v
rhs = lam * v
print("A @ v:", lhs)
print("λ * v:", rhs)
print("Match:", np.allclose(lhs, rhs))

المخرجات:

TEXT
Eigenvalues: [3. 2.]
A @ v: [0.89442719 0.4472136 ]
λ * v: [0.89442719 0.4472136 ]
Match: True

س ما الفرق بين @ و np.dot و np.matmul؟
ج للمصفوفات ثنائية الأبعاد، هي متطابقة. للأبعاد الأعلى، @ و np.matmul يستخدمان البث (ضرب مصفوفات مكدسة)، بينما np.dot يستخدم مجموع-الضرب على آخر محور لكل منها.
س متى يجب استخدام solve مقابل inv؟
ج استخدم solve دائماً — إنه أسرع وأكثر استقراراً عددياً. حساب inv(A) @ b أبطأ وأقل دقة من solve(A, b).
س ماذا إذا كانت A مفردة؟
ج np.linalg.solve يثير LinAlgError: Singular matrix. استخدم np.linalg.lstsq لحلول المربعات الصغرى للأنظمة غير المحددة/فوق المحددة.


❓ أسئلة شائعة

س ما هو أهم شيء يجب تذكره؟
ج عمليات NumPy مُتجهة — تجنب حلقات Python للحصول على أداء أفضل.
س أين يمكنني معرفة المزيد؟
ج تحقق من وثائق NumPy الرسمية على numpy.org للمراجع التفصيلية والمواضيع المتقدمة.
س هل هذا يعمل مع NumPy 2.x؟
ج نعم — جميع الأمثلة متوافقة مع NumPy 2.x. بعض واجهات API القديمة (مثل np.random.seed) لا تزال مدعومة لكن البدائل الحديثة موصى بها.

📖 ملخص



📝 تمارين

  1. مبتدئ (الصعوبة ⭐): أنشئ مصفوفتين 3x3 من أعداد صحيحة عشوائية. احسب حاصل ضربهما ومحددهما ومعكوسهما. تحقق من أن A @ inv(A) ≈ مصفوفة محايدة.

  2. متوسط (الصعوبة ⭐⭐): حل النظام: 3x + y = 9، x + 2y = 8 باستخدام np.linalg.solve. تحقق من صحة الحل.

  3. متقدم (الصعوبة ⭐⭐⭐): ولّد مصفوفة عشوائية 5x5، احسب قيمها الذاتية ومتجهاتها الذاتية. تحقق من أن A @ v = λ * v لكل زوج ذاتي.

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%