Es ist natürlich sehr schwierig, alle Methoden im Detail zu beschreiben, aber für mich scheint dieses Thema interessant und äußerst wichtig zu sein, da jeder häufig vor der Aufgabe steht, eine Lösung zu finden. Im ersten Artikel
Warum Gauß? Die Gauß-Methode wurde beschrieben (auch mit Modifikationen) und einige iterative Methoden. Angesichts der Kritik an
Sinn3r habe ich mich jedoch entschlossen, auch andere Methoden zu beschreiben.
Fangen Sie von vorne an
Lassen Sie uns also noch einmal ein System linearer algebraischer Ordnungsgleichungen lösen
. Eine der auffälligsten numerischen Methoden ist eine Methode, die verwendet
-Zersetzung der Matrix.
Diese intuitive Methode ist wie folgt. Angenommen, wir haben ein System linearer algebraischer Gleichungen (in Vektorform geschrieben):
wo
- eine schreckliche und verwirrende
nicht entartete Matrix. Wir stellen es als Produkt von zwei anderen Matrizen dar:
Ist eine untere Dreiecksmatrix und
Ist die obere Dreiecksmatrix. Dann nimmt das System offensichtlich die Form an:
Wenn angegeben
, dann wird die Lösung zum ursprünglichen System aus der Lösung von zwei anderen Systemen gefunden:
Der Vorteil dieser Methode ist, dass die Lösungen zweier Hilfssysteme sehr einfach sind (aufgrund der Tatsache, dass die Matrizen
und
- dreieckig). Aber ist es einfach, diese Matrizen zu finden? Die Aufgabe, das System zu lösen, wird also auf die Aufgabe des Bauens reduziert
-Zersetzungen für die Matrix.
Beschreibung des anwendbaren Algorithmus
-Zersetzung wird
hier ausreichend detailliert beschrieben. In der Zwischenzeit werden wir uns eine andere Methode ansehen.
Quadratwurzelmethode
Wir legen der Matrix zusätzliche Bedingungen auf
. Wir fordern, dass es symmetrisch ist, d.h.
oder
. Eine solche Matrix kann dargestellt werden als
wo
- obere Dreiecksmatrix,
Ist eine diagonale
reelle Matrix, und ihre diagonalen Elemente sind im absoluten Wert gleich Eins. In ähnlicher Weise wird das ursprüngliche System auf zwei andere reduziert:
die auch aufgrund der Eigenschaften der Matrizen elementar gelöst werden
und
.
Die Ableitung algorithmischer Formeln ist ziemlich umständlich und geht über den Umfang der Veröffentlichung hinaus. Auf Wunsch finden Sie diese
hier .
Beispiel für Java-Code, der die Sweep-Methode implementiert:
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.PrintWriter; import java.util.Locale; import java.util.Scanner; public class SquareRootMethod { public static void main(String[] args) throws FileNotFoundException { Scanner scanner = new Scanner(new FileReader("input.txt")); scanner.useLocale(Locale.US); int n = scanner.nextInt(); double[][] a = new double[n + 1][n + 1]; double[] b = new double[n + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { a[i][j] = scanner.nextDouble(); } b[i] = scanner.nextDouble(); } double[] x = new double[n + 1]; double[] d = new double[n + 1]; double[][] s = new double[n + 1][n + 1];
Sweep-Methode
Mit dieser Methode können nur bestimmte Systeme mit nicht mehr als drei Unbekannten in jeder Zeile gelöst werden. Das heißt, mit dem System
Matrix
ist tridiagonal:
A = \ begin {pmatrix} C_1 & -B_1 & 0 & \ dots & 0 & 0 \\ -A_2 & C_2 & -B_2 & \ dots & 0 & 0 \\ \ vdots & \ vdots & \ vdots & \ ddots & \ vdots & \ vdots \\ 0 & 0 & \ dots & -A_ {n-1} & C_ {n-1} & -B_ {n-1} \\ 0 & 0 & \ dots & 0 & -A_n & C_n \\ \ end {pmatrix}.
Beachten Sie nur, dass es eine Verbindung benachbarter Lösungen gibt:
- einige unbekannte Zahlen. Wenn wir sie und eine einzelne Variable finden, können wir alle anderen finden.
Ableitung von Formeln
hier vorhanden. Nun, am Ende
Beachten Sie dies in den Suchformeln
Es gibt eine Division nach Zahlen
Dies kann sich als Null herausstellen, die verfolgt werden muss. Tatsächlich gilt jedoch die folgende
Aussage , deren Beweis
hier vorliegt: Der Sweep-Algorithmus ist korrekt und stabil, wenn die Bedingungen erfüllt sind:
Betrachten Sie den Java-Programmcode, der das System löst.
\ left \ {\ begin {align} & x_1 = 0, \\ & x_ {i-1} + \ xi x_ {i + 1} = \ dfrac {i} {n}, \ (i = \ overline {2, n-1}), \\ & x_n = 1, \\ \ end {align} \ right.
bei
.
package SystemOfLinearAlgebraicEquations; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.PrintWriter; import java.util.Locale; import java.util.Scanner; public class TridiagonalMatrixAlgorithm { public static void main(String[] args) throws FileNotFoundException { final int n = 21; double[] A = new double[n + 1]; double[] B = new double[n + 1]; double[] C = new double[n + 1]; double[] F = new double[n + 1]; double xi = 2; C[1] = 1; F[1] = 0; for(int i = 2; i <= n-1; i++) { A[i] = 1; C[i] = xi; B[i] = 1; F[i] = - (double) i / n; } A[n] = 0; C[n] = 1; F[n] = 1; double[] alpha = new double[n + 1]; double[] beta = new double[n + 1];