AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Lineares Gleichungssystem lösen

Ein Thema von Kegasetu · begonnen am 21. Okt 2020 · letzter Beitrag vom 10. Nov 2020
Antwort Antwort
Seite 3 von 5     123 45      
Kegasetu

Registriert seit: 26. Sep 2013
85 Beiträge
 
#21

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 09:47
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.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#22

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 11:09
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 )
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
124 Beiträge
 
Delphi 11 Alexandria
 
#23

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 11:14
n_Gleichungen := 10;

SetLength(A_Matrix, n_Gleichungen, n_Gleichungen + 1);
SetLength(X_Vektor, n_Gleichungen);
Gruß, Andreas
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.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#24

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 11:22
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;
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Kegasetu

Registriert seit: 26. Sep 2013
85 Beiträge
 
#25

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 11:28
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?
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#26

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 12:10
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...
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#27

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 14:35
Ich habe das einfach nur in den Editor getippt. Probier mal aus. Ich habe schon lange keine Matrizen mehr lösen müssen.

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;
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.094 Beiträge
 
Delphi 12 Athens
 
#28

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 14:45
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
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#29

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 18:00
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
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Fiete45

Registriert seit: 3. Jun 2019
Ort: Timmendorfer Strand
6 Beiträge
 
Delphi 6 Professional
 
#30

AW: Lineares Gleichungssystem lösen

  Alt 31. Okt 2020, 17:14
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
Miniaturansicht angehängter Grafiken
screen.jpg  
Angehängte Dateien
Dateityp: zip Gleichungssysteme.zip (258,4 KB, 11x aufgerufen)
Wolfgang
use your brain (THINK)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz