Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   nichtlineares Gleichungssystem (https://www.delphipraxis.net/75468-nichtlineares-gleichungssystem.html)

Neotracer64 19. Aug 2006 18:45


nichtlineares Gleichungssystem
 
Ich suche einen Weg ein nichtlineares Gleichungssystem zu lösen.

Zum Beispiel:
(1 + x) / (10^2) - (10*y) + z = -15
(1 + x) / (2^2) - (2*y) + z = 12
(1 + x) / (5^2) - (5*y) + z = 12

Mit Derive 6 kommt folgendes raus:

x = -683/8
y = 189/32
z = 1437/32

Es ist also möglich. Ich habe aber keinen Schimmer, wie ich das in Delphi nachprogrammieren könnte. :gruebel:

Weiss jemand von euch wie das geht? Und wenn ja, könnt ihr mir das mal erklären? :)

Danke im vorraus. :)

Gausi 19. Aug 2006 18:48

Re: nichtlineares Gleichungssystem
 
Wieso ist das ein nichtlineares Gleichungssystem? :gruebel:

So wie ich das sehe, ist das ein ganz normales LGS mit drei Unbekannten, was man mit den üblichen Methoden lösen kann.

gordon freeman 19. Aug 2006 18:51

Re: nichtlineares Gleichungssystem
 
korrigiert mich, wenn ich hier Müll laber, aber solange die Variablen alle in erster Potenz vorliegen ist das doch ein lineares Gleichungssystem, dass man allgemein auf die Form
ax + by + cz = d
zurückführen kann. Dann nimmst du dir ein LGS in das du 3 allgemein formulierte Gleichungen packst und löst es auf. Du erhälst als Ergebnis die Variablen in Abhängigkeit von den Koeffizienten und den Konstanten. Dann muss Delphi nur noch die aktuellen Koeffizienten und Konstanten in die Gleichungen einsetzten und fertig.

[EDIT]
Deine Gleichungen lauten umgeformt ja:
1/100 * x - 10y + z = -15 - 1/100
1/4 * x - 2y + z = 12 - 1/4
1/25 * x - 5y + z = 12 - 1/25
was mit Schulmathematik absolut lösbar ist.

Neotracer64 19. Aug 2006 18:52

Re: nichtlineares Gleichungssystem
 
Achsooo.
Na dann ist gut.

Zitat:

dass man allgemein auf die Form
ax + by + cz = d
zurückführen kann.
Habt ihr eine Idee, wie ich das in Delphi in diese Form bringen kann?

omata 19. Aug 2006 18:54

Re: nichtlineares Gleichungssystem
 
Hier im Forum suchenGleichungssystem

Neotracer64 19. Aug 2006 18:59

Re: nichtlineares Gleichungssystem
 
Ja, ok.
Ich habe ja schon das gauss'sche Verfahren gefunden, mit dem man sowas lösen kann.
Schön und gut.
Dazu müssen meine Gleichungen aber irgendwie noch in diese Form, wie oben beschrieben.
Wie das geht hab ich nicht gefunden. Oder bin ich blind?

omata 19. Aug 2006 19:03

Re: nichtlineares Gleichungssystem
 
Schau doch mal hier.

Gruss
Thorsten

Neotracer64 19. Aug 2006 19:10

Re: nichtlineares Gleichungssystem
 
Das gezeigte Gleichungssystem

Zitat:

I. x(1) + 2*x(2) - x(3) = -8
II. 2*x(1) - x(2) + x(3) = 11
III. 2*x(1) - 2*x(2) - 2*x(3) = 2

{ 1 2 -1 -8
A = 2 -1 1 11
2 -2 -2 2 }
untersscheidet sich aber von meinem ganz schön.

Wenn ich jetzt also mein Gleichungssystem in die Matriz eintragen will:

Zitat:

(1 + x) / (10^2) - (10*y) + z = -15
(1 + x) / (2^2) - (2*y) + z = 12
(1 + x) / (5^2) - (5*y) + z = 12

Was muss denn da genau rein?

1 * x am Anfang, also schonmal eine 1 rein.
Weiter drinne 10*y. also muss auch irgendwo eine 10 rein.
Und dann noch einmal 1 * z, also eine 1 noch rein.
Aber was ist mit dem Rest?
Also (10^2), wo wird das berücksichtigt?

Ich muss das irgendwie auf die Form a*x + b*y + c*z bringen. Ich weiss nur nicht, wie man das in Delphi realisieren soll. :cry:

omata 19. Aug 2006 19:33

Re: nichtlineares Gleichungssystem
 
gordon freeman hat die Formeln doch schon umgestellt.

Hier nochmal die einzelnen Schritte für die erste Gleichung...
Code:
. 1+x
. --- - 10y + z = -15                | *10²
. 10²
.
. 1+x - 10*10²y + 10²z = -15 * 10²
.
. 1+x - 1000y + 100z = -1500         | -1
.
. x - 1000y + 100z = -1500 -1        | :100
.
.  1                      1
. ---x - 10y + z = -15 - ---
. 100                    100
Delphi-Quellcode:
  TGaussSolved = array of Extended;
  TGaussLine = TGaussSolved;
  TGaussMatrix = array of TGaussLine;
:
procedure TForm.ButtonClick(Sender: TObject);
var
  A: TGaussMatrix;
  Res: TGaussSolved;
  i, j: Integer;
  s:string;
begin
  SetLength(A, 3, 4);
  A[0][0] := 1/100; A[0][1] := -10; A[0][2] := 1; A[0][3] := -15-(1/100);
  A[1][0] := 1/4;   A[1][1] := -2; A[1][2] := 1; A[1][3] := 12-(1/4);
  A[2][0] := 1/25;  A[2][1] := -5; A[2][2] := 1; A[2][3] := 12-(1/25);

  for i := 0 to High(A) do begin
    s:='';
    for j := 0 to High(A[i]) - 1 do
      s:=s +FloatToStr(A[i, j]) + '*x(' + inttostr(j + 1) + ') + ';
    Memo1.Lines.Append(s+'= c(' + inttostr(i + 1) + ')');
  end;

  Res := SolveLinearSystem(A, 3, 4);

  for i := 0 to High(Res) do
    Memo1.Lines.Append('x(' + inttostr(i+1) + ') = ' + FloatToStr(Res[i]));
end;
Code von SolveLinearSystem hier

Gruss
Thorsten

Neotracer64 19. Aug 2006 20:03

Re: nichtlineares Gleichungssystem
 
ahh, ich stand gearde auf dem Schlauch. :wall: Jetz weiss ich wies geht.

Viel Dank, auch für deine Geduld, omata und gordon freeman. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 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