Delphi-PRAXiS

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)

Ari 7. Mai 2008 20:58


1+1=0 definieren?
 
Hallo,

habe ein mittelschweres Problem. Möchte gerne ein Gleichungssystem mit sehr vielen Gleichungen und Unbekannten lösen lassen, verwende dazu allerdings den endlichen Körper F2, also nur die Elemente 0 und 1. Daher ist dort auch 1+1=0 was die Lösung im Vergleich zum Variablentyp integer mit 1+2=2 beeinflusst.
Mit boolean komme ich auch nicht weiter (na ja, richtig+richtig=falsch? o.O)..

Könntet ihr mir bitte helfen, wie ich so ein Gleichungssystem überhaupt realisieren kann?

Liebe Grüße,
Ariane

mkinzler 7. Mai 2008 21:01

Re: 1+1=0 definieren?
 
Nimm statt + AND

Neutral General 7. Mai 2008 21:03

Re: 1+1=0 definieren?
 
Zitat:

Zitat von mkinzler
Nimm statt + AND

Und was ist mit den Überträgen?

Dax 7. Mai 2008 21:05

Re: 1+1=0 definieren?
 
Zitat:

Zitat von mkinzler
Nimm statt + AND

Ährm.
0+0=0
0+1=1+0=1
1+1=0

Das ist XOR, nicht AND :zwinker:

s.h.a.r.k 7. Mai 2008 21:12

Re: 1+1=0 definieren?
 
Zitat:

Zitat von Neutral General
Zitat:

Zitat von mkinzler
Nimm statt + AND

Und was ist mit den Überträgen?

wenn man das XOR, korrekterweise, nehmen würde, dann würde da wohl kein rest herauskommen. den müsstest dann eben selbst berechnen:

Code:
sum  = x1 XOR x2
carry = x1 AND x2
Willst du die beiden Werte getrennt von einander heraus bekommen oder beide gleichzeitig, d.h. 1 + 1 = 10?

christian_r 7. Mai 2008 21:13

Re: 1+1=0 definieren?
 
Vllt. hilft das weiter ... http://www.delphipraxis.net/internal...ct.php?t=80704 Dann müsstest Du keine XOR-Funktion implementieren, sondern addierst trozdem dezimale Werte und lässt Dir das Ganze binär ausgeben. Aus dem binären Wert kannst dann Überträge rausholen, soviel wie Du willst. ;)

Also:
Code:
1 + 1 = 2 dez.
      = 10 bin.
      = 0 bin. übertrag 1

Ari 7. Mai 2008 21:30

Re: 1+1=0 definieren?
 
Hey,

erstmal ein großes Dankeschön für die vielen Antworten!

Eine 10 möchte ich eigentlich nicht ausgeben, nur 0 und 1 brauch ich. Die Umwandlung habe ich jetzt hinbekommen,
Delphi-Quellcode:
Label1.Caption:=IntToBin(1+1,1);
liefert das Ergebnis 0 :)

Tut mir leid, aber ich krieg das jetzt nicht weiter realisiert: ganz eigentlich wollte ich ein Gleichungssystem binär lösen lassen mit sehr großem Rang. Normale Gauß-Algorithmen habe ich gefunden, IntToBin dort einzubauen ist mir nun nicht ganz gelungen.
Es funktioniert nichtmal

Delphi-Quellcode:
a:=IntToBin(arr[1,1,1]+arr[1,1,2]+arr[1,1,3]+arr[1,1,4],1);
wobei arr ein array ist; a und arr sind beide als integer deklariert. Fehlermeldung: Incompatible Types String and Integer - und jetzt weiß ich nicht, wieso. Könnt ihr mir da bitte nochmal helfen? :gruebel:

himitsu 7. Mai 2008 21:31

Re: 1+1=0 definieren?
 
christian_r...

wenn schon, dann richtig binär :stupid:

Delphi-Quellcode:
var x1, x2, sum: Integer;
sum := (x1 + x2) and 1;
mul := (x1 * x2) and 1;
sub := (x1 - x2) and 1;

// oder doch via Boolean
var x1, x2, sum: Boolean;
sum := x1 xor x2; {sum := x1 + x2}

christian_r 7. Mai 2008 21:33

Re: 1+1=0 definieren?
 
@Ari: a muss ebenfalls ein Integer sein, da IntToBin einen String zurückgibt.

3_of_8 7. Mai 2008 21:53

Re: 1+1=0 definieren?
 
Ist das ein Restklassenring? Wenn ja, warum nicht einfach (operation) mod n?

Also bei einer Addition und |M|=2 praktisch (a+b) mod 2. Das hat den Vorteil, dass es man es leicht verallgemeinern kann.

Ari 7. Mai 2008 22:14

Re: 1+1=0 definieren?
 
Das Ganze mod 2 zu rechnen ist eine gute Idee - nur komischerweise bekomme ich auch den Wert "-1" angezeigt und generell scheint mein Gleichungssystem überhaupt nicht zu funktionieren. Die Integer-Werte meines GLS sind auch sehr ungewöhnlich, mal 6, mal 21, mal -45600 oder sowas :gruebel:
Also, ich möchte aus dem Array arr je neun Elemente aufsummieren und den Wert 1 erhalten, also quasi
arr[1,1,1]+...+arr[1,1,9]=1
haben.

Delphi-Quellcode:
var arr: array [1..9, 1..9, 1..9] of integer; a:integer;

      a:=(arr[1,1,1]+arr[1,1,2]+arr[1,1,3]+arr[1,1,4]) mod 2;
      a:=1;
      Label2.Caption:=IntToStr(arr[1,1,1] mod 2);
      Label3.Caption:=IntToStr(arr[1,1,2] mod 2);
      Label4.Caption:=IntToStr(arr[1,1,3] mod 2);
      Label5.Caption:=IntToStr(arr[1,1,4] mod 2);
Das GLS muss so wohl komplett falsch konstruiert sein, oder?

inherited 7. Mai 2008 23:08

Re: 1+1=0 definieren?
 
Du könntest dir auch einen typ-Record basteln und die Additions, Subtraktions,... Operatoren überladen.

grenzgaenger 7. Mai 2008 23:57

Re: 1+1=0 definieren?
 
Zitat:

Zitat von Ari
Möchte gerne ein Gleichungssystem mit sehr vielen Gleichungen und Unbekannten lösen lassen, verwende dazu allerdings den endlichen Körper F2, also nur die Elemente 0 und 1. Daher ist dort auch 1+1=0 was die Lösung im Vergleich zum Variablentyp integer mit 1+2=2 beeinflusst.

mit welchen operationen möchtest du das eigentlich machen? hast du da schon eine ergebnistabelle, wie die verknüpfungen funktionieren sollen?

komm da leider nicht ganz mit was 10 + 01 = 10 sein sollen insbesondere, wie es da weiter gehen soll ...

btw: häng doch mal 'ne wahrheitstabelle dran ... :-)

himitsu 8. Mai 2008 00:21

Re: 1+1=0 definieren?
 
es klang so, als wenn er nur mit einem Bit rechnen möchte :gruebel:

also reicht es doch die Operationen auf dieses eine Bit zu beschränken?
> siehe #8

grenzgaenger 8. Mai 2008 00:27

Re: 1+1=0 definieren?
 
bist du dir sicher? und kannst du ausschliessen, dass sie nicht was ganz anderes möchte?

denke, das sinnvollste wir sein, wenn sie das kurz erklärt (unabhängig von der sprache) :-)

das wird dann auch die halbe lösung sein ;-)

schöne grüsse
GG

oldmax 8. Mai 2008 05:51

Re: 1+1=0 definieren?
 
Hi
Löst euch mal vom Integer und nehmt den Typ Word
Word ist eine Binäre Zahl, integerdagegen eine Ganzzahl von - irgendwas bis + irgendwas, wobei das höchstwertige Bit das Vorzeichen ist.
Eine Binäre Addition ist xOr, und was ist daran so kompliziert ?
Mathematisch gesehen ist die Subtraktion lediglich die Addition einer negativen Zahl, und um das hinzukriegen muß von der 2. Zahl das 2er Komplement gebildet werden. Ist schon lange her, das ich auf diesem Weg gerechnet habe, daher schaut selbst, wie's gemacht wird.
Nun der Weg:
wird nur mit Bit- Wert gerechnet reicht es 2 Boolean mit xOr zu verknüpfen, ansonsten geht xOr auch mit Byte, Word oder Doppelword.

z. B.
Wert 1 = 00011010 // Byte
Wert 2 = 00011001 // Byte

Addition
Wert 1 xOr Wert 2 (Binär, also Byte, Word oder Doppelword !)
(00011010 xOr 00011001 = 00110011 50 +49 = 99
Subtraktion
Wert2 invertieren // jedes Bit drehen -> 1er Komplement aus 00011001 wird 11100110
1 addieren // bin mir nicht 100% sicher, aber ich glaub, das ist die 2er Komplementbildung
Wert 2 xOr 1 // also 11100110 xOr 0000001 = 11100111
dann Wert 1 xOr Wert 2 //
00011010 xOr 11100111 = 00000001 50 +(-49) = 1

Der beschriebene Fehler, das da plötzlich negative Werte erscheinen liegt m.E. in der Verwendung von Interger !
Gruß oldmax

QuickAndDirty 8. Mai 2008 07:55

Re: 1+1=0 definieren?
 
@Ari: nimm doch einen Derive Interpreter.
Dann löst sich das Problem von alleine.

Und ob du jetzt zehnadische werte oder dyadische für den gauss verwendest das ist einerlei.
Brauchst du alle zwischenschritte mit Binärdarstellung für HA,
dann wandle einfach die Ausgabe in Binärdarstellung um.


Ansonsten könntest du noch in Prolog deine eigene Algebra definieren.

Ari 8. Mai 2008 12:56

Re: 1+1=0 definieren?
 
Derive selbst geht nicht, weil es mehr als 300 Gleichungen sind. Ein Interpreter von Derive ist was genau..?

Also ich denke ich beschreibe erstmal, was ich genau machen will..die binäre Darstellung
Zitat:

Wert 1 = 00011010 // Byte
Wert 2 = 00011001 // Byte
benötige ich glaube ich nicht *vorsichtig*
Also ich habe ein derartiges Gleichungssystem:

Delphi-Quellcode:
1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 ... =1
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 ... =1
1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ... =1
0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ... =1
Wenn ich dann zwei Koeffizienten, die zu einer Unbekannten gehören, erhalte ich den Wert 0 (also 1+1=0) woraufhin ich dann irgendwann auf eine Lösung komme. Insgesamt sinds 320 Gleichungen und 730 Unbekannte *hust*..
Ziel ist es, die Trapezform des Gleichungssystems betrachten zu können. Ich möchte nämlich wissen, ob während des Gauss'schen Eliminationsverfahrens Gleichungen durch die Addition entfallen (also doppelt auftauchen).

Sorry, die bisherigen Informationen kann ich leider grad nicht anwenden, da ich "Wert 1 = 00011010 // Byte " leider nicht ganz verstehe :oops:
und was macht "#8" eigentlich? In einem Beispiel für das Gauß-Verfahren in Object Pascal taucht auch sowas wie #8#8 auf.. :gruebel:

grenzgaenger 8. Mai 2008 13:07

Re: 1+1=0 definieren?
 
weiss zwar noch nicht genau auf was es hinauslaufen soll :gruebel: , vermute mal, dass es sich um die lösung eines Simplex handelt.

hier könntest, du bei den paar gleichungen/variablen die lösung auch mit dem excel-solver leicht ermitteln.

Ari 8. Mai 2008 13:09

Re: 1+1=0 definieren?
 
Ja so ein Ganzzahligkeitsproblem ist es auch. Arbeite mit SCIP, was aber dem Simplex-Verfahren entsprechen müsste..nur da bekomme ich eben leider nur die Lösungen der Unbekannten angezeigt und nicht das ganze Gleichungssystem (oder ich weiß einfach nicht wie), deshalb wollte ich das in Delphi nachprogrammieren

grenzgaenger 8. Mai 2008 13:25

Re: 1+1=0 definieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
SCIP ? hier wäre ja der quellcode mit bei. könntest eigentlich anpassen...

ansonsten, würd ich dir raten, 'n paar vektoren zu definieren und diese dann entsprechend zu lösen. für das lösen, kannst dir ja 'n paar matrix operationen selbst zusammenschrauben ... :-)

als datenstruktur würd ich dir zu 'n array of integer oder 'n array of array of integer raten ... :-)

für dies kannst dann ein paar proceduren implementieren wie add(VonVektor[1], NachVektor[2]), etc.

die ergebnisse und die matrixen kannst dann jederzeit ausgeben :-)

<HTH> GG

BTW: die werte kannst du entweder direkt im code deklarieren oder bei der initialisierung aus deiner datei einlesen :-)

Hier noch 'n kleines Codebeispiel:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TVektor = array of Integer;
  TMatrix = array of TVektor;

procedure AddVektor(VAR Vektor, ZielVektor: tVektor);
var
  i: integer;
begin
  for i := low(Vektor) to high(ZielVektor) do
   ZielVektor[i] := ZielVektor[i] + Vektor[i];
end;
 

var
  V1, V2: TVektor;  
  i: integer;
begin
  setlength(V1, 3);
  Setlength(V2, 3);

  V1[0] := 1; V2[0] := 2;
  V1[1] := 2; V2[1] := -1;
  V1[2] := 1; V2[2] := 1;

  writeln('Ausgangslage');
  write('Vektor 1: '); for i in v1 do write(i: 3, ' '); writeln;
  write('Vektor 2: '); for i in v2 do write(i: 3, ' '); writeln;

  AddVektor(V1, V2);

  writeln(#10'nach Mutation');
  write('Vektor 1: '); for i in v1 do write(i: 3, ' '); writeln;
  write('Vektor 2: '); for i in v2 do write(i: 3, ' '); writeln;

  readln;
end.
sehe grad, dass hier noch 'n paar nette funktionen für arrays/vektoren vorhanden sind, so sollt es schneller gehen :-)

Ari 8. Mai 2008 14:45

Re: 1+1=0 definieren?
 
Hm da ich Delphi 7 verwende funktionieren die ganzen write, writeln und readln befehle bei mir nicht. Auf Memo1.Lines.Add umgemünzt krieg ich auch noch Fehlermeldungen..: operator not applicable to this operand type.

Aber wieso sind das jetzt zwei Vektoren? Quasi ein Vektor eine Unbekannte? Ohje :(

grenzgaenger 8. Mai 2008 14:55

Re: 1+1=0 definieren?
 
Das Beispiel sollte auch auf D7 laufen:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TVektor = array of Integer;
  TMatrix = array of TVektor;

procedure AddVektor(VAR Vektor, ZielVektor: tVektor);
var
  i: integer;
begin
  for i := low(Vektor) to high(ZielVektor) do
   ZielVektor[i] := ZielVektor[i] + Vektor[i];
end;


var
  V1, V2: TVektor;  
  i: integer;
begin
  setlength(V1, 3);
  Setlength(V2, 3);

  V1[0] := 1; V2[0] := 2;
  V1[1] := 2; V2[1] := -1;
  V1[2] := 1; V2[2] := 1;

  writeln('Ausgangslage');
  write('Vektor 1: '); for i := 0 to high(v1) do write(v1[i]: 3, ' '); writeln;
  write('Vektor 2: '); for i := 0 to high(v2) do write(v2[i]: 3, ' '); writeln;

  AddVektor(V1, V2);

  writeln(#10'nach Mutation');
  write('Vektor 1: '); for i := 0 to high(v1) do write(v1[i]: 3, ' '); writeln;
  write('Vektor 2: '); for i := 0 to high(v2) do write(v2[i]: 3, ' '); writeln;

  readln;
end.
das ist 'n beispiel für die addition V1 + V2 --> V2

mit V1 = {1; 2; 1} und V2 = {2; -1; 1}

das ganze kannst auch gern in TMatrix aufnehmen und dann über die vektoren addressieren oder 'ne neue funktion machen, welche die matrix komplett durläuft und die vektoren addiert (mit ausschluss des quellvektors).

in der kleinen komponentensammlung sind aber schon die matrix und vektoroperationen definiert. damit sollt es leichter gehen.

himitsu 8. Mai 2008 14:55

Re: 1+1=0 definieren?
 
Zitat:

Zitat von Ari
Hm da ich Delphi 7 verwende funktionieren die ganzen write, writeln und readln befehle bei mir nicht.

häää?

Diese sind Befehle stammen noch aus den guten alten Pascalzeiten und jede Delphiversion beherscht sie.
schau mal in deine OH.
Und die Befehle versecken sich in der Unit System, welche immer eingebunden ist ... also gehen sie auch immer.

grenzgaenger 8. Mai 2008 15:03

Re: 1+1=0 definieren?
 
es lag wohl an der FOR schleife, da hatte ich die syntaxerweiterung aus D2005 oder D2006 verwand... von daher konnte es in D7 nicht funktionieren. im zweiten betrag hab ich es auf die standardschleife umgestellt :-)

Ari 8. Mai 2008 15:06

Re: 1+1=0 definieren?
 
Dass die von Turbo Pascal kommen hätte ich mir gedacht..
Delphi-Quellcode:
writeln('Ausgangslage');
Popup: Project raised exception class EInOutError with message 'I/O error 105'. Process stopped.
Mit ner Memo hatte ich kein entsprechendes Problem bei anderen Programmen - wobei für dieses Programm nach wie vor die Datei mit meinen Memo-Zuweisungen nichtmal erstellt wird.. :?:

Ari 8. Mai 2008 15:11

Re: 1+1=0 definieren?
 
Zu der neuen Version: wird v[u] durch 3 dividiert oder soll das in der Ausgabe erscheinen? Wenn ich das mit Memo mache muss ich das ja erst in nen string umwandeln
sorry, mein übliches Brett vorm Kopf ist sehr fest genagelt ^^

RipperFox 8. Mai 2008 15:28

Re: 1+1=0 definieren?
 
Edit: war zu knapp..

{$APPTYPE CONSOLE} , dann klappts auch mit writeln..

Erklärung: Wohin soll denn writeln() seinen Output schreiben (die nette DOS-Box / Commandline is ja nich offen..)?

grenzgaenger 8. Mai 2008 15:30

Re: 1+1=0 definieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
das hab ich auch noch nie gesehen, dass der standard write befehl 'n IO error erzeugt ... :gruebel: :gruebel: :gruebel:

hab das ganze mal 'ne formularanwendung gepackt ... sollte nun fuktionieren.

wenn du einen vektor mit 'n skalar multiplizieren möchtest, musst dir 'ne kleine procedure/funktion schreiben... statt V1 * V2 --> x machste dann V1 * Skalar --> x

das sollte aber die unit bereits können ...

<HTH>

Ari 8. Mai 2008 15:44

Re: 1+1=0 definieren?
 
das Beispiel hab ich mir runtergeladen, dankeschön!!

Jedes Mal wenn ich auf den V1+V2 Button drücke wird also V1 dazu addiert..kann ich damit auch bestimmte Unbekannte eliminieren? wie kann ich das jetzt für 730 Unbekannte und 320 Gleichungen machen und dazu noch Modul 2 einbauen?
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: Da das so viele Gleichungen sind wird wohl ein Memo, Liste oder so notwendig sein, oder?

zu {$APPTYPE CONSOLE}: bei mir steht da Unit und wie ich program neu öffne weiß ich auch nicht - meine Hilfedatei läuft unter Vista nicht :pale:

edit: das vorherige gepostete Beispiel hab ich jetzt mit der memo hinbekommen, wobei ich ":3" noch nicht ganz verstehe, hab das einfach als String eingebunden..
edit2: noch ne Frage: was bedeutet das high(v1)?
Vielleicht kann man da irgendwie ne Schleife und ein Modul einbauen um das dann mit mehreren Gleichungen zu machen..?

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 17:29 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