Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Lineares Gleichungssystem lösen (https://www.delphipraxis.net/205830-lineares-gleichungssystem-loesen.html)

Kegasetu 30. Okt 2020 08:47

AW: Lineares Gleichungssystem lösen
 
Zitat:

Zitat von Andreas13 (Beitrag 1476370)
Eleganter wäre eine Lösung, wenn Du Deine Daten aus einer Textdatei einlesen würdest und die Matrix A in zwei Teile aufspaltest: Linke Seite (= Quadratische Matrix) und rechte Seite (= SpaltenVektor). Die Vektorspalte kannst Du an die Matrix per Programm-Code ranhängen. So kann man z.B. für verschiedene rechte Seiten des Gleichungssystems einfach neue Lösungen generieren.

Melde Dich wieder, wenn ich Dir etwas helfen kann.
Gruß, Andreas

Auf der grundlage der A-Matrix im Programm müsste die Matrix welche ich eingebe ja so aussehen:

A[0, 0] := l1*MA;
A[0, 1] := l2*MB;
A[0, 2] := l3*MC;
A[0, 3] := 0;
A[0, 4] := 0;
A[0, 5] := 0;
A[0, 6] := 0;
A[0, 7] := 0;
A[0, 8] := 0;
A[0, 9] := 0;
A[0, 10] := 0;
A[0, 11] := b1;

A[1, 0] := 0;
A[1, 1] := l2*MB;
A[1, 2] := l3*MC;
A[1, 3] := l4*MD;
A[1, 4] := 0;
A[1, 5] := 0;
A[1, 6] := 0;
A[1, 7] := 0;
A[1, 8] := 0;
A[1, 9] := 0;
A[1, 10] := 0;
A[1, 11] := b2;
usw..

Ich habe lzha[] jetzt mit l vereinfacht

Mir stellt sich jetzt noch die Frage, wie ich mit dem "SetLength" umgehe und vielmehr was es bedeutet?

Das n müsste ja n= 11 sein.

Jens01 30. Okt 2020 10:09

AW: Lineares Gleichungssystem lösen
 
Zitat:

Ich glaube das greift mir etwas zu weit. Aber Danke, ich werde es mir mal zurücklegen.
Das Ding ist mit der Zeit etwas umfangreich geworden.
Du mußt Dir die Matrix.pas angucken.
Dort mußt Du 2 Matrizen erstellen und mit SolveLinEQ lösen. Das Ding ist sehr schnell, weil einige Teile über Assembler laufen.
Und eigentlich sehr einfach.
(Ich finde gerade kein Beispiel dafür :shock:)

shebang 30. Okt 2020 10:14

AW: Lineares Gleichungssystem lösen
 
Zitat:

Zitat von Andreas13 (Beitrag 1476367)
n_Gleichungen := 10;

SetLength(A_Matrix, n_Gleichungen, n_Gleichungen + 1);
SetLength(X_Vektor, n_Gleichungen);
Gruß, Andreas

Zitat:

Zitat von Kegasetu (Beitrag 1476405)
Mir stellt sich jetzt noch die Frage, wie ich mit dem "SetLength" umgehe und vielmehr was es bedeutet?

SetLength setzt die Länge des Vektors bzw. der Matrix. In Andreas' Beispiel hat der Vektor 10 Zeilen und die Matrix 10 Zeilen und 11 Spalten.

Jens01 30. Okt 2020 10:22

AW: Lineares Gleichungssystem lösen
 
Hier ist wenigstens ein Beispiel aus dem Testsystem:

Delphi-Quellcode:
procedure TestTThreadedMatrix.TestMatrixSolve;
const cBlkWidth = 512;
      cBlkSize = cBlkWidth*cBlkWidth;
var a, x1, x2, b : TDoubleDynArray;
    i : integer;
    start, stop : int64;
    index : integer;
    m1, m2 : IMatrix;
    mb : IMatrix;
begin
     {$IFDEF FMX} Setup; {$ENDIF};
     SetLength(a, cBlkSize);
     SetLength(b, 3*cBlkWidth);
     SetLength(x1, 3*cBlkWidth);
     SetLength(x2, 3*cBlkWidth);

     RandSeed := 15;
     for i := 0 to cBlkSize - 1 do
         a[i] := Random - 0.5;

     for i := 0 to 3*cBlkWidth - 1 do
         b[i] := Random - 0.5;

     mb := TDoubleMatrix.Create(b, 3, cBlkWidth);
     m1 := TDoubleMatrix.Create(a, cBlkWidth, cBlkWidth);
     m2 := TThreadedMatrix.Create(a, cBlkWidth, cBlkWidth);

     start := MtxGetTime;
     m1.SolveLinEQInPlace(mb);
     stop := MtxGetTime;
     Status(Format('Blocked LU decomp: %.2fms', [(stop - start)/mtxfreq*1000]));

     start := MtxGetTime;
     m2.SolveLinEQInPlace(mb);
     stop := MtxGetTime;
     Status(Format('Threaded LU decomp: %.2fms', [(stop - start)/mtxfreq*1000]));

     index := 0;
     Check(CheckMtxIdx(m1.SubMatrix, m2.SubMatrix, index), Format('error Lin equation solve. Error at x[%d] = %.5f, y[%d] = %.5f', [index, x1[index], index, x2[index]]));
     {$IFDEF FMX} TearDown; {$ENDIF};
end;

Kegasetu 30. Okt 2020 10:28

AW: Lineares Gleichungssystem lösen
 
Zitat:

Zitat von Jens01 (Beitrag 1476428)
Hier ist wenigstens ein Beispiel aus dem Testsystem:

Delphi-Quellcode:
procedure TestTThreadedMatrix.TestMatrixSolve;
const cBlkWidth = 512;
      cBlkSize = cBlkWidth*cBlkWidth;
var a, x1, x2, b : TDoubleDynArray;
    i : integer;
    start, stop : int64;
    index : integer;
    m1, m2 : IMatrix;
    mb : IMatrix;
begin
     {$IFDEF FMX} Setup; {$ENDIF};
     SetLength(a, cBlkSize);
     SetLength(b, 3*cBlkWidth);
     SetLength(x1, 3*cBlkWidth);
     SetLength(x2, 3*cBlkWidth);

     RandSeed := 15;
     for i := 0 to cBlkSize - 1 do
         a[i] := Random - 0.5;

     for i := 0 to 3*cBlkWidth - 1 do
         b[i] := Random - 0.5;

     mb := TDoubleMatrix.Create(b, 3, cBlkWidth);
     m1 := TDoubleMatrix.Create(a, cBlkWidth, cBlkWidth);
     m2 := TThreadedMatrix.Create(a, cBlkWidth, cBlkWidth);

     start := MtxGetTime;
     m1.SolveLinEQInPlace(mb);
     stop := MtxGetTime;
     Status(Format('Blocked LU decomp: %.2fms', [(stop - start)/mtxfreq*1000]));

     start := MtxGetTime;
     m2.SolveLinEQInPlace(mb);
     stop := MtxGetTime;
     Status(Format('Threaded LU decomp: %.2fms', [(stop - start)/mtxfreq*1000]));

     index := 0;
     Check(CheckMtxIdx(m1.SubMatrix, m2.SubMatrix, index), Format('error Lin equation solve. Error at x[%d] = %.5f, y[%d] = %.5f', [index, x1[index], index, x2[index]]));
     {$IFDEF FMX} TearDown; {$ENDIF};
end;

Jetzt mal ganz dreist gefragt, wäre es möglich mir ein Beispiel zu zeigen in dem die Beiden simplen Gleichungen: 5*x=y u. 4+x=y; gelöst werden?

Irgendwie ist mir der Code nicht schlüssig. Warum braucht es z.B. einen Zeitparameter?

Jens01 30. Okt 2020 11:10

AW: Lineares Gleichungssystem lösen
 
Zitat:

Irgendwie ist mir der Code nicht schlüssig. Warum braucht es z.B. einen Zeitparameter?
Mann, ich hab das einfach nur aus dem Testprogramm bei Github kopiert, um Dir irgendwas zu zeigen. Ich weiß nicht, warum er dafür kein BeiSpiel hat. Ist dem Michael scheinbar zu banal. Ich kann mal bei mir gucken, ob ich in meinem Code etwas finde. Moment mal...

Jens01 30. Okt 2020 13:35

AW: Lineares Gleichungssystem lösen
 
Ich habe das einfach nur in den Editor getippt. Probier mal aus. Ich habe schon lange keine Matrizen mehr lösen müssen.:wink:

Delphi-Quellcode:
var
  a, b : TDoubleDynArray;
  m1, m2, mres : IMatrix;
begin
  a := [1,2,3];
  b := [1,2,3,4,5,6,7,8,9];
 
  m1 := TDoubleMatrix.Create(a, 1, 3);
  m2 := TDoubleMatrix.Create(b, 3, 3);
 
  try
    mres := m2.SolveLinEQ(m1);
  except
    // hier kommt was, wenn die Matrix nicht funktioniert
  end;
 
  write(mres[0,0].tostring);
  write(mres[0,1].tostring);
  write(mres[0,2].tostring);
end;

Rollo62 30. Okt 2020 13:45

AW: Lineares Gleichungssystem lösen
 
Unabhängig von dem eigentlichen Problem empfehle ich mal das hier.
https://mathematikalpha.de/

Ist auch hier in der DP bekannt.
https://www.delphipraxis.net/187612-...tik-alpha.html

Andreas13 30. Okt 2020 17:00

AW: Lineares Gleichungssystem lösen
 
Zitat:

Zitat von Kegasetu (Beitrag 1476405)
Auf der grundlage der A-Matrix im Programm müsste die Matrix welche ich eingebe ja so aussehen:

A[0, 0] := l1*MA;
A[0, 1] := l2*MB;
A[0, 2] := l3*MC;
A[0, 3] := 0;
A[0, 4] := 0;
A[0, 5] := 0;
A[0, 6] := 0;
A[0, 7] := 0;
A[0, 8] := 0;
A[0, 9] := 0;
A[0, 10] := 0;
A[0, 11] := b1;

A[1, 0] := 0;
A[1, 1] := l2*MB;
A[1, 2] := l3*MC;
A[1, 3] := l4*MD;
A[1, 4] := 0;
A[1, 5] := 0;
A[1, 6] := 0;
A[1, 7] := 0;
A[1, 8] := 0;
A[1, 9] := 0;
A[1, 10] := 0;
A[1, 11] := b2;
usw..
Ich habe lzha[] jetzt mit l vereinfacht
Mir stellt sich jetzt noch die Frage, wie ich mit dem "SetLength" umgehe und vielmehr was es bedeutet?
Das n müsste ja n= 11 sein.

Hallo Kegasetu,
schreib bitte alle Deine 10 Gleichungen mit den konkreten Koeffizienten (= Zahlenwerten) auf, damit ich für Dich das Programm erstellen kann.
Gruß, Andreas

Fiete45 31. Okt 2020 16:14

AW: Lineares Gleichungssystem lösen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Moin Kegasetu,
mit dem Programm kannst Du Gleichungssysteme lösen.
Die Daten mußt Du selbst eingeben.
Die Größe der Systeme ist vom SpinEditN abhängig.
Viel Erfolg beim Testen!
Gruß Fiete


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz