Sieben Mal messen - einmal schneiden oder das Sprichwort in der Praxis verwenden

Ich saß auf dem Coursera-Kurs. Der Kurs richtete sich an AnfĂ€nger in Java, und in einem der Video-Tutorials wurde das Thema 7 Schritte zur Lösung von Problemen angesprochen .

Ich habe mir mit gutem Gewissen das Video-Tutorial angehört und dachte mir, dieses GeschÀft ist weit und lange gegangen.

Der Rest des Kurses war einfach und entspannt. Zu einem der FĂ€cher der UniversitĂ€t, nĂ€mlich der sogenannten „Wissenschaftlichen Programmierung“, stellte sich jedoch folgende Aufgabe:
Lösen Sie ein lineares Gleichungssystem Ax=bunter Verwendung der folgenden Matrixerweiterung A::

A=LU,

Wo LIst die untere Dreiecksmatrix und UIst die obere Dreiecksmatrix.

Das Thema der linearen Algebra, das wir im 1. Kurs aufgenommen haben. Ehrlich gesagt erinnerte ich mich an die allgemeinen Prinzipien der Operationen mit Matrizen, Vektoren und dem Allerheiligsten - der Gauß-Methode. Wenn Sie es sich mit dem Gehirn ĂŒberlegen, haben wir keine LU-Zerlegung untersucht, aber die Google-Methode hilft immer. Bis zu diesem Punkt gerettet.

Ich habe einen allgemeinen Algorithmus zum Finden von Matrizen gefunden Lund U, aber um halb vier Uhr morgens gab mir kein Kaffee die Möglichkeit, es richtig umzusetzen (vorausgesetzt, wir haben dort auf Octave codiert). Am Ende flippte ich aus und beschloss, trotzdem das klug benannte Sprichwort zu hören.

1. Beschreiben Sie das Problem von Hand


Alles, was Ihnen im Leben fehlt, ist zu verstehen, was das Problem wirklich ist. Nehmen wir ein Beispiel fĂŒr das obige Problem und schreiben es auf ein Blatt Papier. In guter Weise mĂŒssen die folgenden Bedingungen fĂŒr die Existenz von Matrizen erfĂŒllt seinL und U:

- Die inverse Matrix muss existierenA, Ich meine ∃A−1;;
- Alle großen MinderjĂ€hrigen sollten nicht entartet seinΔ(1,...,n)≠0

Deshalb brauchen wir zumindest einen "Narrentest", denn es gibt sicherlich kluge Leute, die die Matrix verwenden wollen, die fĂŒr uns nicht geeignet ist. Aber lassen wir es jetzt weg.

Das Problem ist uns klar: Matrizen findenL und Udas wird unter den oben genannten Bedingungen fallen. Nachdem Sie versucht haben, die Lösungsmethoden zu googeln, ist es unwahrscheinlich, dass Sie den Algorithmus beim ersten Mal korrekt implementieren können (wenn Sie nicht gut in linearer Algebra sind). Nachdem wir unzĂ€hlige Versuche durchlaufen haben, werden wir höchstwahrscheinlich eine Abfolge von Maßnahmen entwickeln, um unser Problem zu lösen, und dann fahren wir mit Schritt 2 fort.

2. Beschreiben Sie, was Sie getan haben


Nehmen Sie die Matrix als Beispiel

A=(1230−241−10).



Jetzt wenden wir unsere Gauß-Methode darauf an und entfernen unnötige Elemente in der 3. Zeile, indem wir die erste Zeile davon subtrahieren, multipliziert mit dem VerhĂ€ltnis des ersten Elements von 3 Zeilen zum ersten Element von 1 Zeile:

a3=a3−a1⋅a31a11.



Entfernen Sie nun das zweite Element der 3-Zeile mit einer Àhnlichen Aktion:

a3=a3−a2⋅a32a22.



Als Ergebnis erhalten wir die Matrix

A=(1230−24000)=U.



Und nun die Koeffizienten, die wir gefunden haben (das Ergebnis des VerhÀltnisses der Elemente aijajj) nimm die Werte der Matrix L, und bekomme

L=(1000101121).



Schauen Sie sich die Vorlage an, nicht wahr?

3. Muster finden


In diesem Stadium kehren Sie höchstwahrscheinlich zu Schritt 1 und 2 zurĂŒck, da die Vorlage, die Sie nicht immer gefunden haben, in allen FĂ€llen wahr ist. Aber nichts, da es nicht geklappt hat, wird es als nĂ€chstes passieren.

Anhand eines Beispiels können wir also den folgenden Algorithmus / die folgende Lösungsvorlage formulieren:

1. Definieren Sie eine quadratische MatrixA,nth Ordnung;
2. Stellen Sie die Matrix einL=Iwo I- IdentitÀtsmatrix nth Ordnung;
3. Stellen Sie die Matrix einU=A;;
4. Wir wenden die folgenden aufeinanderfolgenden Transformationen auf die Matrizen an, vorausgesetzt, dass{i=2,
,nj=1,
,i

lij=uijujjui=ui−uj⋅lij,



Beim n=3wir bekommen:

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



4. ÜberprĂŒfen der Vorlage / des Algorithmus


Es gibt einen Algorithmus - es gibt Millionen von Matrizen, um ihn zu testen! Sie können sich ĂŒber diese Vorlage keine Sorgen machen, es ist offensichtlich wahr (persönlich getestet auf der nicht entarteten der möglichen Matrizen). Aber denken Sie daran: Beeilen Sie sich - Sie bringen die Leute zum Lachen . ÜberprĂŒfen Sie also immer die Vorlagen, die Sie erstellt haben, damit Sie nicht wie zum Anfang springen.

5. Übersetzung des Algorithmus in Code


Der offensichtliche Schritt, alles, was Sie brauchen, ist oft schon in der Syntax der Sprache, und wenn nicht, stört Sie niemand, Klassen und Funktionen zu erstellen, um dieses Problem zu lösen, dann haben Sie einen Algorithmus. Da ich diesen Algorithmus als Teil eines BildungsuniversitĂ€tsprogramms implementiert habe, konnte ich Octave nur fĂŒr die Implementierung verwenden, sodass der gesamte Code, den ich Ihnen prĂ€sentiere, in seiner Syntax vorliegt (er ist Python sehr Ă€hnlich, daher werde ich sein Highlight fĂŒr die Formatierung verwenden):

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. Suchen Sie nach fehlgeschlagenen Tests


Sie sollten immer versuchen, Ihren Code zu "brechen". Hier gibt es (offensichtlich) keinen vollstĂ€ndigen „Schutz vor dem Narren“, aber ich habe die Annahme zugrunde gelegt, dass die anfĂ€nglich korrekte Matrix eingefĂŒhrt wird.

In diesem Schritt sollten Sie alle möglichen Fehler und Ungenauigkeiten in Ihrem Code finden, wodurch auch die Verzerrung des konstruierten Algorithmus aufgedeckt werden kann. Daher sollten Sie hier so viele Auslassungen ausprobieren, wie möglich gewesen wÀren.

7. Debuggen Sie fehlgeschlagene Tests


Die logischste und wahrscheinlich erwartete der Schritte. Der Code muss verzerrt und der Algorithmus korrigiert werden. Hier gibt es nichts mehr hinzuzufĂŒgen.

Fazit


Ich kann sagen, dass es unwahrscheinlich ist, dass ich diesen Ansatz zur Lösung von Problemen jemals ernst nehmen wĂŒrde, wenn ich nicht schlĂ€frig wĂ€re. Es lohnt sich jedoch, auf diese Methode zu achten - sie ist kurz und all ihre MĂŒhsal besteht nur darin, dass sie angewendet werden muss.

Hinweis


Dank der LehrbĂŒcher zur linearen Algebra fĂŒr das Material zur Lösung des Problems.

All Articles