خوارزمية جاكوبي لحساب القيم الذاتية (Jacobi Eigenvalue Algorithm)

مقدمة

في الجبر الخطي العددي، تعد خوارزمية جاكوبي لحساب القيم الذاتية (Jacobi Eigenvalue Algorithm) طريقة تكرارية لحساب القيم الذاتية والمتجهات الذاتية لمصفوفة متماثلة. تم تطوير هذه الخوارزمية من قبل عالم الرياضيات الألماني كارل غوستاف جاكوبي في عام 1846. تعتبر خوارزمية جاكوبي من أقدم وأكثر الخوارزميات استخدامًا لحساب القيم الذاتية، وهي لا تزال ذات أهمية كبيرة في مجالات مختلفة مثل الفيزياء، الهندسة، وعلوم الكمبيوتر. تتميز الخوارزمية ببساطتها من الناحية المفاهيمية وثباتها العددي، على الرغم من أنها قد تكون أبطأ من بعض الخوارزميات الأخرى في بعض الحالات.

الأساس النظري لخوارزمية جاكوبي

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

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

بشكل رسمي، إذا كانت لدينا مصفوفة متماثلة A، فإن الخوارزمية تقوم بإنشاء سلسلة من المصفوفات Ak حيث:

  • A0 = A
  • Ak+1 = JkT Ak Jk

حيث Jk هي مصفوفة دوران (مصفوفة جاكوبي) مصممة لتصفير عنصر معين في المصفوفة Ak. مع تكرار هذه العملية، تتقارب المصفوفات Ak نحو مصفوفة قطرية، والقيم الموجودة على القطر هي القيم الذاتية للمصفوفة الأصلية.

خطوات خوارزمية جاكوبي

تتلخص خطوات خوارزمية جاكوبي في النقاط التالية:

  1. اختيار العنصر غير القطري الأكبر (في القيمة المطلقة): في كل تكرار، يتم تحديد العنصر غير القطري aij الأكبر في القيمة المطلقة. يحدد هذا العنصر المستوى الذي سيتم فيه إجراء الدوران.
  2. حساب زاوية الدوران (θ): يتم حساب زاوية الدوران θ بناءً على العنصرين aii، ajj، و aij. معادلة الحساب هي:
    • إذا كان aii = ajj، فإن θ = π/4 أو θ = -π/4 اعتمادًا على إشارة aij.
    • إذا كان aii ≠ ajj، فإن tan(2θ) = 2aij / (aii – ajj). يتم حساب θ باستخدام الدالة arctan.
  3. بناء مصفوفة الدوران (J): يتم بناء مصفوفة الدوران J استنادًا إلى الزاوية θ. هذه المصفوفة هي مصفوفة وحدة مع تعديلات في الصفوف والأعمدة i و j.

    إذا كانت n هي حجم المصفوفة، فإن عناصر مصفوفة J هي:

    • Jkk = 1 لكل k ≠ i, j
    • Jii = cos(θ)
    • Jjj = cos(θ)
    • Jij = -sin(θ)
    • Jji = sin(θ)
  4. تحديث المصفوفة (A): يتم تحديث المصفوفة A باستخدام العلاقة Ak+1 = JT Ak J. هذه الخطوة هي العملية الرئيسية التي تقوم بتصفير العنصر aij وتغيير العناصر الأخرى في المصفوفة.
  5. التكرار: تتكرر الخطوات من 1 إلى 4 حتى تصبح العناصر غير القطرية صغيرة بما فيه الكفاية (أقل من عتبة معينة).
  6. استخراج القيم الذاتية: عند التقارب، تكون القيم القطرية للمصفوفة A هي القيم الذاتية المقربة.

تفاصيل تنفيذ الخوارزمية

هناك بعض التفاصيل التي يجب مراعاتها عند تنفيذ خوارزمية جاكوبي:

  • اختيار العتبة: يجب تحديد عتبة (tolerance) لتحديد متى تتقارب الخوارزمية. يمكن أن تكون هذه العتبة هي الحد الأقصى للقيمة المطلقة للعناصر غير القطرية أو مجموعها.
  • ترتيب التكرار: يمكن اختيار العنصر غير القطري الأكبر بطرق مختلفة. اختيار هذا العنصر يؤثر على سرعة التقارب. يمكن استخدام البحث المنهجي أو اختيار العنصر بشكل عشوائي.
  • تحسينات الأداء: يمكن تحسين أداء الخوارزمية من خلال استخدام تقنيات مثل التخزين المؤقت والعمليات المتوازية.

مزايا وعيوب خوارزمية جاكوبي

المزايا:

  • الدقة: توفر الخوارزمية قيمًا ذاتية دقيقة، خاصة للمصفوفات ذات القيم الذاتية المتباعدة.
  • الثبات العددي: الخوارزمية مستقرة عدديًا، مما يعني أنها لا تتأثر بشكل كبير بأخطاء التقريب.
  • البساطة: سهلة الفهم والتنفيذ.
  • التقارب: تتقارب دائمًا للمصفوفات المتماثلة.

العيوب:

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

تطبيقات خوارزمية جاكوبي

تجد خوارزمية جاكوبي تطبيقات في العديد من المجالات، بما في ذلك:

  • الفيزياء: في الفيزياء الكمومية، تستخدم لحساب مستويات الطاقة للأنظمة الكمومية.
  • الهندسة: في تحليل الهياكل، لحساب ترددات الرنين وتصميم الأنظمة الميكانيكية.
  • التعلم الآلي: في تحليل المكونات الرئيسية (PCA) وتقليل الأبعاد.
  • معالجة الصور: في تحليل الصور وتحديد الميزات.
  • الإحصاء: في تحليل العوامل (Factor Analysis) والتحليل العاملي.

مقارنة بخوارزميات أخرى

هناك العديد من الخوارزميات الأخرى لحساب القيم الذاتية، مثل خوارزمية QR وخوارزمية باور. كل خوارزمية لها مزاياها وعيوبها:

  • خوارزمية QR: أسرع من خوارزمية جاكوبي للمصفوفات الكبيرة، لكنها قد تكون أقل دقة في بعض الحالات.
  • خوارزمية باور: تستخدم لحساب أكبر قيمة ذاتية للمصفوفة، ولكنها لا تحسب جميع القيم الذاتية.

يعتمد اختيار الخوارزمية على حجم المصفوفة، متطلبات الدقة، وخصائص المشكلة المحددة.

تنفيذ الخوارزمية في بايثون

فيما يلي مثال على تنفيذ خوارزمية جاكوبي في لغة بايثون باستخدام مكتبة NumPy:

import numpy as np

def jacobi_eigenvalues(A, tolerance=1e-6, max_iterations=1000):
    """
    تحسب القيم الذاتية للمصفوفة المتماثلة باستخدام خوارزمية جاكوبي.

    Args:
        A (numpy.ndarray): المصفوفة المتماثلة.
        tolerance (float): عتبة التقارب.
        max_iterations (int): الحد الأقصى لعدد التكرارات.

    Returns:
        numpy.ndarray: مصفوفة تحتوي على القيم الذاتية.
    """
    A = np.array(A, dtype=float)  # التأكد من أن A مصفوفة NumPy
    n = A.shape[0]
    V = np.eye(n)  # تهيئة مصفوفة المتجهات الذاتية كـ مصفوفة وحدة
    for _ in range(max_iterations):
        # تحديد العنصر غير القطري الأكبر
        off_diag = A - np.diag(np.diag(A))
        p, q = np.unravel_index(np.argmax(np.abs(off_diag)), A.shape)
        if A[p, q] == 0:
            break  # إذا كانت جميع العناصر خارج القطر صفرًا، فتنتهي الدورة

        # حساب الزاوية
        if A[p, p] == A[q, q]:
            theta = np.pi / 4 if A[p, q] > 0 else -np.pi / 4
        else:
            theta = 0.5 * np.arctan(2 * A[p, q] / (A[p, p] - A[q, q]))

        # بناء مصفوفة الدوران
        c, s = np.cos(theta), np.sin(theta)
        J = np.eye(n)
        J[p, p], J[q, q] = c, c
        J[p, q], J[q, p] = -s, s

        # تحديث المصفوفة و مصفوفة المتجهات الذاتية
        A = J.T @ A @ J
        V = V @ J

        # التحقق من التقارب
        if np.max(np.abs(off_diag)) < tolerance:
            break

    return np.diag(A)

# مثال على الاستخدام
A = np.array([[4, 2, 2],
              [2, 1, 1],
              [2, 1, 1]])

eigenvalues = jacobi_eigenvalues(A)
print("القيم الذاتية:", eigenvalues)

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

التحسينات والتطورات في خوارزمية جاكوبي

على الرغم من بساطتها، لا تزال خوارزمية جاكوبي موضوعًا للبحث والتحسين. بعض التطورات تشمل:

  • الخوارزميات المتوازية: يمكن تسريع خوارزمية جاكوبي بشكل كبير من خلال تنفيذها على معالجات متعددة أو أنظمة حوسبة متوازية.
  • تحسينات اختيار العناصر: تطوير طرق أكثر كفاءة لاختيار العناصر غير القطرية التي يجب تصفيرها في كل تكرار.
  • التقارب المتسارع: استخدام تقنيات لتحسين معدل تقارب الخوارزمية.

هذه التحسينات تجعل خوارزمية جاكوبي أكثر فعالية في تطبيقات متنوعة.

خاتمة

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

المراجع