قياس سبع مرات - قطع مرة واحدة ، أو استخدام القول في الممارسة

جلست في دورة Coursera. كانت الدورة موجهة للمبتدئين في Java ، وفي أحد دروس الفيديو تم طرح الموضوع 7 خطوات لحل المشكلات .

لقد استمعت ، بضمير مرتاح ، إلى الفيديو التعليمي ، وقلت لنفسي ، إن هذا العمل ذهب بعيداً ولفترة طويلة.

بقية الدورة كانت سهلة ومريحة. ولكن ، فيما يتعلق بأحد موضوعات الجامعة ، وتحديدا فيما يسمى "البرمجة العلمية" ، ظهرت المهمة التالية:
حل نظام المعادلات الخطية Ax=bباستخدام توسيع المصفوفة التالية A:

A=LU,

أين Lهي المصفوفة الثلاثية السفلية و Uهي المصفوفة المثلثة العليا.

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

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

1. صف المشكلة يدويًا


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

- يجب أن توجد المصفوفة العكسيةA، انا اعني A1؛
- يجب ألا يتدهور جميع القاصرين ، أيΔ(1,...,n)0

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

إن المشكلة واضحة بالنسبة لنا: البحث عن المصفوفاتL و Uالتي ستندرج تحت الشروط المذكورة أعلاه. بعد أن حاولت استخدام Google لأساليب الحل ، من غير المحتمل أن تتمكن من تنفيذ الخوارزمية بشكل صحيح في المرة الأولى (إذا لم تكن جيدًا في الجبر الخطي). بعد اجتياز العديد من المحاولات ، سنقوم على الأرجح بتطوير سلسلة من الإجراءات لحل مشكلتنا ، ثم ننتقل إلى الخطوة 2.

2. صف ما فعلته


خذ المصفوفة كمثال

A=(123024110).



الآن نقوم بتطبيق طريقة Gauss الخاصة بنا عليها والتخلص من العناصر الإضافية في السطر 3 ، بطرح السطر الأول منه ، مضروبًا في نسبة العنصر الأول من 3 سطور إلى العنصر الأول من السطر 1:

a3=a3a1a31a11.



الآن ، تخلص من العنصر الثاني في السطر 3 بإجراء مماثل:

a3=a3a2a32a22.



ونتيجة لذلك ، نحصل على المصفوفة

A=(123024000)=U.



والآن ، المعاملات التي وجدناها (نتيجة لنسبة العناصر aijajj) خذ قيم المصفوفة L، واحصل على

L=(1000101121).



بالنظر إلى القالب ، أليس كذلك؟

3. إيجاد الأنماط


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

لذا ، بناءً على مثال ، يمكننا صياغة قالب الحل / الخوارزمية التالي:

1. تحديد مصفوفة مربعةA,nالترتيب عشر ؛
2. تعيين المصفوفةL=Iأين I- مصفوفة الهوية nالترتيب عشر ؛
3. تعيين المصفوفةU=A؛
4. نطبق التحولات المتعاقبة التالية على المصفوفات شريطة ذلك{i=2,,nj=1,,i

lij=uijujjui=uiujlij,



في n=3نحن نحصل:

L=(100l2110l31l321),U=(u11u12u130u22u2300u33)



4. التحقق من القالب / الخوارزمية


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

5. ترجمة الخوارزمية إلى كود


الخطوة الواضحة ، كل ما تحتاجه غالبًا ما تكون في صياغة اللغة ، وإذا لم يكن الأمر كذلك ، فلا يزعجك أحد لإنشاء فئات ووظائف لحل هذه المشكلة ، فلديك خوارزمية. نظرًا لأنني قمت بتطبيق هذه الخوارزمية كجزء من برنامج جامعي تعليمي ، كان بإمكاني فقط استخدام Octave للتنفيذ ، لذا فإن كل التعليمات البرمجية التي أقدمها لك موجودة في صيغتها (وهي مشابهة جدًا لـ Python ، لذلك سأستخدم تمييزها للتنسيق):

A = input("Enter the matrix A: ")
numOfRows = size(A, 1)
numOfCols = size(A, 2)

if numOfRows ~= numOfCols
    disp("Wrong matrix.")
else
    n = numOfCols
    disp("----------------")
    L = eye(3)
    disp("Making U = A")
    U = A
    disp("----------------")

    for i=2:n
        disp("Step "), disp(i-1)
        for j=1:i-1
            L(i,j) = U(i,j)/U(j,j)
            U(i,:) = U(i,:) - U(j,:)*L(i,j)
        end
        disp("----------------")
    end

    disp("Check the answer of L*U: "), disp(L*U)
end

6. البحث عن اختبارات فاشلة


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

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

7. فشل اختبارات التصحيح


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

استنتاج


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

ملحوظة


بفضل كتب الجبر الخطية للمواد لحل المشكلة.

All Articles