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
Kegasetu

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

AW: Lineares Gleichungssystem lösen

  Alt 29. Okt 2020, 13:59
So sieht die "verbale" Matrix aus die ich lösen will:

lzha1[1]*MA+2(lzha1[1]+lzha1[2])*MB+lzha1[2]*MC=MMA1[1]
lzha1[2]*MB+2(lzha1[2]+lzha1[3])*MC+lzha1[3]*MD=MMA1[2]
lzha1[3]*MC+2(lzha1[3]+lzha1[4])*MD+lzha1[4]*ME=MMA1[3]
lzha1[4]*MD+2(lzha1[4]+lzha1[5])*ME+lzha1[5]*MF=MMA1[4]
lzha1[5]*ME+2(lzha1[5]+lzha1[6])*MF+lzha1[6]*MG=MMA1[5]
lzha1[6]*MF+2(lzha1[6]+lzha1[7])*MG+lzha1[7]*MH=MMA1[6]
........... (Eigentlich sollten jeweils die ersten Variablen untereinander stehen...)

Zusammengeschrieben:
lzha1[1]*MA+2(lzha1[1]+lzha1[2])*MB+lzha1[2]*MC=MMA1[1]
lzha1[2]*MB+2(lzha1[2]+lzha1[3])*MC+lzha1[3]*MD=MMA1[2]
lzha1[3]*MC+2(lzha1[3]+lzha1[4])*MD+lzha1[4]*ME=MMA1[3]
lzha1[4]*MD+2(lzha1[4]+lzha1[5])*ME+lzha1[5]*MF=MMA1[4]
lzha1[5]*ME+2(lzha1[5]+lzha1[6])*MF+lzha1[6]*MG=MMA1[5]
lzha1[6]*MF+2(lzha1[6]+lzha1[7])*MG+lzha1[7]*MH=MMA1[6]
lzha1[7]*MG+2(lzha1[7]+lzha1[8])*MH+lzha1[8]*MI=MMA1[7]
lzha1[8]*MH+2(lzha1[8]+lzha1[9])*MI+lzha1[9]*MJ=MMA1[8]
lzha1[9]*MI+2(lzha1[9]+lzha1[10])*MJ+lzha1[10]*MK=MMA1[9]
lzha1[10]*MJ+2(lzha1[10]+lzha1[11])*MK+lzha1[11]*ML=MMA1[10]

Dabei sind in jeder Gleichung alle Koeffizienten vorhanden, jedoch sind nur die hier hingeschrieben ungleich 0.

EDIT
MA und ML sind vorher schon definiert. Die Gleichungen lassen sich alles nach Gauss lösen (habe ich händisch ausprobiert)

Geändert von Kegasetu (29. Okt 2020 um 14:05 Uhr)
  Mit Zitat antworten Zitat
Andreas13

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

AW: Lineares Gleichungssystem lösen

  Alt 29. Okt 2020, 14:10
Wenn Du die Koeffizienten der Gleichungen bereits in Arrays hast, dann kannst Du die Matrix A einfach per Code (= For-Schleifen) füllen. Das gezeigte Muster kann Dir dabei helfen.

Es würde Deine Arbeit enorm erleichtern, wenn Du auch die Unbekannten (MA, MB etc.) in einem Vektor (= Array) ablegen würdest.
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (29. Okt 2020 um 14:12 Uhr)
  Mit Zitat antworten Zitat
Kegasetu

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

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 08:12
Wenn Du die Koeffizienten der Gleichungen bereits in Arrays hast, dann kannst Du die Matrix A einfach per Code (= For-Schleifen) füllen. Das gezeigte Muster kann Dir dabei helfen.

Es würde Deine Arbeit enorm erleichtern, wenn Du auch die Unbekannten (MA, MB etc.) in einem Vektor (= Array) ablegen würdest.
Ich muss mich nochmal korrigieren. Die Koeffizienten MB-MH muss ich herausfinden.
  Mit Zitat antworten Zitat
Jens01

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

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 10: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
Jens01

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

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 10: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
 
#6

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 10: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
 
#7

AW: Lineares Gleichungssystem lösen

  Alt 30. Okt 2020, 11: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
Antwort Antwort


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 12:10 Uhr.
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