Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 1+1=0 definieren? (https://www.delphipraxis.net/113438-1-1%3D0-definieren.html)

grenzgaenger 8. Mai 2008 16:13

Re: 1+1=0 definieren?
 
denke, du solltest erst mal gucken, dass deine hilfe wieder geht... hier 'n link

zur apptype console ... guckste hier:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;
das :3 in der write anweisung heisst nur, dass die ausgabe 3 zeichen lang sein soll ;-)

grenzgaenger 8. Mai 2008 16:24

Re: 1+1=0 definieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Ari
edit2: noch ne Frage: was bedeutet das high(v1)?

das da es sich um ein dynamisches array handelt, ist die anzahl der elememente nicht bekannt. die funktion high(array) ermitelt das höchste element, so dass das array mit einer schleife durchlaufen werden kann.

Zitat:

Zitat von Ari
kann ich damit auch bestimmte Unbekannte eliminieren?

ja, indem du einer zeile eine andere hinzuaddierst, die so gewählt ist, dass dein zielelement zu null wird...

Delphi-Quellcode:
function AddVektor(const fromVektor, toVektor: tVektor; Skalar: integer): tVektor;
var
  i: integer;
begin
 setlength(result, high(toVektor)+1);
  for i := low(fromVektor) to high(fromVektor) do
   result[i] := fromVektor[i]*Skalar + toVektor[i];
end;

Zitat:

Zitat von Ari
wie kann ich das jetzt für 730 Unbekannte und 320 Gleichungen machen und dazu noch Modul 2 einbauen?

hier solltest du erst mal schauen, dass du deine 320 gleichungen mmit den 730 unbekannten einlesen kannst. mein vorschlag wäre über ein kleines flatfile :-) . wie liegen denn die gleichungen vor?

Zitat:

Zitat von Ari
Die generelle Lösung des Problems erhalte ich ja mit SCIP (also Simplex-Verfahren, falls es das ist). Nur wie das Gleichungssystem nach dem Eliminationsverfahren aussieht, brauche ich noch :gruebel:

dieses vorgehen, musst für jede deiner zeilen, deines gleichungssystems wiederholen...

Zitat:

Zitat von Ari
Da das so viele Gleichungen sind wird wohl ein Memo, Liste oder so notwendig sein, oder?

zum beispiel, oder ausgabe in ein logfile, oder in eine textdatei ...

<HTH>

hier noch 'n beispiel, zum eleminieren des ersten elements der zweiten zeile

grenzgaenger 8. Mai 2008 16:39

Re: 1+1=0 definieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier noch 'n kleines Beispiel, bei dem statt zwei einzelne Vektoren in einer Matrix M integriert sind.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin;

type
  TVektor = array of Integer;
  TMatrix = array of TVektor;
   
type
  TForm1 = class(TForm)
    sV1: TEdit;
    SV2: TEdit;
    EV2: TEdit;
    Ev1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    se: TSpinEdit;
    Label5: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    m: tMatrix;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}


procedure VOut(v: tVektor; e: tEdit);
var
 i: integer;
begin
 e.Text := '{';
 for i := 0 to high(v) do
 begin
  e.text := e.text + inttostr(v[i]);
  if i < high(v) then
   e.text := e.text + '; ';
 end;
 e.Text := e.text + '}';
end;
function AddVektor(const fromVektor, toVektor: tVektor; Skalar: integer): tVektor;
var
  i: integer;
begin
 setlength(result, high(toVektor)+1);
  for i := low(fromVektor) to high(fromVektor) do
   result[i] := fromVektor[i]*Skalar + toVektor[i];
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 
 VOut(M[0], EV1);
 VOut(AddVektor(M[0], M[1], se.Value), EV2);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  //2 Zeilen mit 3 Spalten
  setlength(M, 2, 3);
 
  M[0, 0] := 1; M[1, 0] := 2;
  M[0, 1] := 2; M[1, 1] := -1;
  M[0, 2] := 1; M[1, 2] := 1;

 VOut(M[0], sV1);
 VOut(M[1], sV2);
end;

end.
PS: der Code läuft mit der Form aus dem vorherigen Post


//Edit: anbei noch 'n beispiel mit 'ner 3x3 matrix und ausgabe in ein memo.

grenzgaenger 8. Mai 2008 18:15

Re: 1+1=0 definieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Häng mal 'ne lösungsroutine hinten an...

Delphi-Quellcode:
function AddVektor(const fromVektor, toVektor: tVektor; Skalar: double): tVektor;
var
  i: integer;
begin
 setlength(result, high(toVektor)+1);
  for i := low(fromVektor) to high(fromVektor) do
   result[i] := trunc(fromVektor[i]*Skalar) + toVektor[i];
end;
procedure TForm1.autosolveClick(Sender: TObject);
var
 Zeile1,Zeile2: integer;
begin
 for Zeile1 := 0 to high(m)-1 do
 begin
  for Zeile2 := Zeile1+1 to high(m) do
   M[Zeile2] := AddVektor(M[Zeile1],
                          M[Zeile2],
                          M[Zeile2, Zeile1] / M[Zeile1, Zeile1] * -1);
  MatrixOut(m, memo);
 end;
end;
vorausgesetzt wird hierbei, dass die zeile 0 keinen "0" wert aufweist, da ansonsten eine exeption ausgelöst würde. beispiel im anhang.

Ari 8. Mai 2008 19:28

Re: 1+1=0 definieren?
 
Zunächst vielen vielen Dank für die Mühe, grenzgaenger!

Wo binde ich denn program Project1; ein? Vor der unit funktioniert auch nicht..

Also zu dem geposteten zweiten Beispiel erst. Ausgabe in eine Textdatei wäre glaub ich super! Tut mir leid, wenn ich nochmal nachfrage - aber wofür stehen die Vektoren genau? Ist das sowas wie
A * x = b und alles drei sind dann Vektoren? A die Koeffizienten, x die Unbekannten und b das Ergebnis der Gleichungen?
Also mit diesen zwei Vektoren ist V1 dann der Koeffizientenvektor und V2..? Sorry, versteh das Ganze grad nicht so..

Also die Gleichungen ergeben sich aus Schleifen, so wie
Delphi-Quellcode:
set Z := { 1 to 9 };
set A := Z*Z;
var x[A*Z] binary;
subto jedesFeldEineZahl: forall <i,j> in A do
   sum <k> in Z do x[i,j,k] == 1;
subto quadrate1: forall <k> in Z do
   sum <i,j> in {1,2,3}*{1,2,3} do x[i,j,k] == 1;
...
Direkt auf Delphi übertragen kann man das fürchte ich aber nicht, oder? Demnach sind das dann auch sehr viele Gleichungen..
Was ist denn ein flatfile?

Bei dem 3. Beispiel erhalte ich wieder Fehler..sEdit kennt mein Delphi nicht, sowas wie "Class TsSpinEdit" findet er auch nicht :oops:

Zitat:

//2 Zeilen mit 3 Spalten
setlength(M, 2, 3);

M[0, 0] := 1; M[1, 0] := 2;
M[0, 1] := 2; M[1, 1] := -1;
M[0, 2] := 1; M[1, 2] := 1;
Das bedeutet, dass die Zeilen die Unbekannten und die Spalten die Gleichungen sind?

Bei beispiel 4 leider ein Error,Property Memo.ExplicitWidth does not exist? Also die beiden Scrollfelder unter Zeile 1 und Zeile 2 fehlen bei mir

grenzgaenger 8. Mai 2008 21:20

Re: 1+1=0 definieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Ari
Wo binde ich denn program Project1; ein? Vor der unit funktioniert auch nicht..

das programm statement, ersetzt das unit statement. du musst es stattdessen einfügen.

Zitat:

Zitat von Ari
Bei dem 3. Beispiel erhalte ich wieder Fehler..sEdit kennt mein Delphi nicht, sowas wie "Class TsSpinEdit" findet er auch nicht :oops:

Zitat:

//2 Zeilen mit 3 Spalten
setlength(M, 2, 3);

M[0, 0] := 1; M[1, 0] := 2;
M[0, 1] := 2; M[1, 1] := -1;
M[0, 2] := 1; M[1, 2] := 1;
Das bedeutet, dass die Zeilen die Unbekannten und die Spalten die Gleichungen sind?

Bei beispiel 4 leider ein Error,Property Memo.ExplicitWidth does not exist? Also die beiden Scrollfelder unter Zeile 1 und Zeile 2 fehlen bei mir

die TSSpinedits, hatte ich vergessen auszutauschen... einfch gegen das TSpinEdit tauschen oder stattdessen 'n TEDIT einfügen. anbei 'ne aktualisierte version. im notfall wie gesagt, die komponente austauschen und die units rausschmeissen.

im obigen codeabschnitt ist die initialisierung ... da dies eine matrix ist (mit 2 coordinaten) müssen beide versorgt werden... die erste ziffer M[Zeile, Spalte] wird mit einem entsprechenden wert versorgt. Diese initialiserung müsste bei dir wohl via flatfile erfolgen :-) . flatfile = einfache textdatei ohne formatierungsinformationen.

Zitat:

Zitat von Ari
Also zu dem geposteten zweiten Beispiel erst. Ausgabe in eine Textdatei wäre glaub ich super! Tut mir leid, wenn ich nochmal nachfrage - aber wofür stehen die Vektoren genau?

ein Vektor bildet eine zeile oder eine spalte der matrix ab. in matrix notation werden die vektoren und die matrixen zumeist mit einem grossbuchstaben abgekürzt.

im übigen codesegment hast du eine matrix im folgenden aufbau

1; 2; 1
2; -1; 1

diese kann man entweder als zwei zeilenvektoren oder drei spaltenvektoren angeben. Über die spalten-/zeilennummer werden diese dann innerhalb einer matrix addressiert.


Zitat:

Zitat von Ari
Also zu dem geposteten zweiten Beispiel erst. Ausgabe in eine Textdatei wäre glaub ich super! Tut mir leid, wenn ich nochmal nachfrage - aber wofür stehen die Vektoren genau? Ist das sowas wie A * x = b und alles drei sind dann Vektoren? A die Koeffizienten, x die Unbekannten und b das Ergebnis der Gleichungen?

ja, das ist genau das. im neuesten beispiel, wirst du eine 3x4 matrix sehen. da ist der letzte spaltenvektor b :-)

[quote="Ari"]Also die Gleichungen ergeben sich aus Schleifen, so wie
Delphi-Quellcode:
set Z := { 1 to 9 };
set A := Z*Z;
var x[A*Z] binary;
subto jedesFeldEineZahl: forall <i,j> in A do
   sum &lt;k&gt; in Z do x[i,j,k] == 1;
subto quadrate1: forall &lt;k&gt; in Z do
   sum &lt;i,j&gt; in {1,2,3}*{1,2,3} do x[i,j,k] == 1;
...
Direkt auf Delphi übertragen kann man das fürchte ich aber nicht, oder? Demnach sind das dann auch sehr viele Gleichungen../quote]

warum sollte das nicht gehen? nur müsste man wissen was hier alles gemeint ist... mir sagen die kontrollkonstrukte nix... aber den algo. kannst sicher in pascal abbilden. der vater hat zwar vergessen matrix operationen mit zu integrieren (wie in fortran) aber die kann man sich ja leicht selber bauen ... :-) . beispiele im code und in der libary, wo ich früher schon dran hängte.

noch einen schönen abend und noch viel erfolg.

GG

Ari 9. Mai 2008 00:54

Re: 1+1=0 definieren?
 
Super, für ein kleines Beispiel mit 8 Unbekannten funktioniert das schonmal :) Tausend Dank!!

grenzgaenger 9. Mai 2008 09:23

Re: 1+1=0 definieren?
 
Zitat:

Zitat von Ari
Super, für ein kleines Beispiel mit 8 Unbekannten funktioniert das schonmal :) Tausend Dank!!

die lösung ist auf eine AxB matrix ausgelegt (keine beschränkung). in der aktuellen impl. ist noch b mit aufgenommen. musst aber selber schaun, dass das LGS lösbar ist ...

wie gesagt, musst erst mal schaun wie du die daten reinbekommst...

noch viel erfolg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 Uhr.
Seite 4 von 4   « Erste     234   

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