Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 10.07.12 20:27 
Hallo,
Kurz vor meinem Urlaub (endlich!) melde ich mich noch einmal mit einem kleinen, meiner Meinung nach interessanten, Programm.

Soll eine komplexe Funktion, d.h. einer Funktion mit einer komplexen Variablen z und mit komplexen Funktionswerten f(z), grafisch dargestellt werden, so benötigt man vier Dimensionen, zwei für die Variable z und zwei für den Funktionswert f(z). Dies ist grafisch nicht realisierbar.

Aus diesem Grund kann der Phasenplot einer komplexen Funktion genutzt werden:
Zur Darstellung einer Funktion f(z) wird jedem Punkt z des Definitionsgebiets eine Farbe zugeordnet, die das Argument des Funktionswertes f(z) darstellt.
Das Argument ist dabei der Winkel w, der in der trigonometrischen Form des Funktionswertes f(z) = r (cos w + i sin w) auftritt.
Obwohl der Phasenplot nur einen Teil eines Funktionswertes veranschaulicht und den Betrag r nicht berücksichtigt, können aus der Darstellung wichtige Aussagen über die Funktionen gewonnen werden, z.B. die Lage von Nullstellen, Polstellen, usw.
Außerdem entstehen sehr schöne Abbildungen.
Seit 2 Jahren veröffentlicht Prof. Elias Wegert von der Universität Bergakademie Freiberg Jahreskalender mit derartigen Phasenplots als Bildern.
www.mathe.tu-freiber.../mathe-kalender-2011

Die komplexe Funktionsgleichung ist im Programm einzutragen, außerdem der Darstellungsbereich beider Achsen der komplexen Gaußschen Zahlenebene.
Ein interner Funktionsinterpreter ermittelt den Funktionswert für die einzelnen Zahlen der Ebene, daraus das Argument und stellt dieses farbig dar.
Im Moment benötigt der Interpreter noch eine Menge Zeit. Vielleicht kann man das optimieren.

Für die Funktionsgleichung ist zu beachten, dass als Variable Z zu nutzen ist und folgende Funktionen und Operanden verwendet werden können:
1. Operanden +, -, *, / und die Potenzbildung ^
2. Standardfunktionen SQRT, SIN, COS, TAN, COT, SEC, CSC, SINH, COSH, TANH, EXP, LN
3. Spezielle Funktionen GAMMA und die Besselschen Funktionen BI0, BJ0
4. die Jacobischen elliptischen Funktion DN, SN, CN
5. die Konstanten I, PI

Ansonsten wünsche ich Spaß beim Testen und Optimieren. Ich gönne mir erst einmal 3 Wochen Urlaub, ohne Delphi! :wink2:

Beste Grüße
Mathematiker
Einloggen, um Attachments anzusehen!
_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein


Zuletzt bearbeitet von Mathematiker am Mo 31.12.12 09:11, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: kolibri95
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: So 05.08.12 07:04 
Hallo,
nach 3 Wochen Urlaub, gruseligem Wetter und einer miesen Unterkunft, bin ich wieder völlig entspannt zurück.
In der Zwischenzeit gab es über 200 Aufrufe und 6 Downloads zum Phasenplot, aber leider keinen Kommentar. :bawling:
Ich brauche keine "Lobeshymnen" :wink: , aber eine paar kleine Hinweise zum Programm wären doch ganz nett.

Insbesondere wäre es schön, zu erfahren:
Wie funktioniert der Interpreter für komplexzahlige Funktionen?
Wie kann man die Darstellung beschleunigen?
Welche Erweiterungen wären sinnvoll?
Und vor allem, ist das Programm überhaupt sinvoll? :?!?:

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 05.08.12 09:25 
Die generierbaren Bilder sind hübsch, leider bin ich Mathematisch zu wenig beleckt um damit etwas anfangen zu können,
ich habe die Pixels[] - Routine versuchsweise durch einen eigenen FastScanlinezugriff ausgetauscht, bringt aber kaum etwas, die Hauptrechenzeit wird geht nicht bei der Darstellung verloren.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: So 05.08.12 10:47 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
ich habe die Pixels[] - Routine versuchsweise durch einen eigenen FastScanlinezugriff ausgetauscht, bringt aber kaum etwas, die Hauptrechenzeit wird geht nicht bei der Darstellung verloren.

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:

Wie kann man die Darstellung beschleunigen?

Also wenn ich den Code richtig verstanden habe, wird für jeden Pixel der komplette Funktionsterm wieder neu geparst und ausgewertet. Das ist natürlich schon langsam....
Besser (lies: schneller) wäre hier ein compilierender Parser der dir direkt eine Funktion erzeugt die du aufrufen kannst.
Zum Beispiel: www.delphipraxis.net...der-matheparser.html oder der Nachfolger (?) www.delphipraxis.net...-der-ham-parser.html

Für diesen Beitrag haben gedankt: Mathematiker
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: So 05.08.12 14:03 
Hallo,

ist das alles viel zu complex?
Vielleicht passt dieser parser besser.
mathematischer-parser-fuer-komplexe-zahlen

Gruß Horst

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: So 05.08.12 17:07 
Hallo,
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:

Besser (lies: schneller) wäre hier ein compilierender Parser der dir direkt eine Funktion erzeugt die du aufrufen kannst.
Zum Beispiel: www.delphipraxis.net...der-matheparser.html oder der Nachfolger (?) www.delphipraxis.net...-der-ham-parser.html

Danke für den Hinweis. Nach einigen Stunden habe ich beide Parser zum Laufen gebracht. Leider ist der erste deutlich(!) langsamer als meine eigene Lösung. Und der zweite ist zwar schnell, liefert aber falsche Ergebnisse bei der Berechnung komplexer Funktionswerte sobald ein imaginärer Teil auftritt, z.B. ist 3*i = 0i usw.
Ich werde suchen, wo der Fehler steckt, habe aber überhaupt noch nicht verstanden, wie während der Laufzeit der Funktionsterm compiliert wird. Ich werde wohl noch eine Menge lernen müssen.

user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
ist das alles viel zu complex?
Vielleicht passt dieser parser besser.
[url=www.delphipraxis.net...omplexe-zahlen[/url]

Es ist wirklich (für mich!) zu komplex. Dein Hinweis ist nicht schlecht. Für Addition, Subtraktion, Multiplikation und Division beschleunigen die Assembler-Routinen deutlich.
Für die wichtigen höheren Funktionen (sin, ...) bringt es leider nichts, im Gegenteil. Aber auch hier werde ich weiter experimentieren, da ich von den entstehenden Abbildungen irgendwie fasziniert bin.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mo 06.08.12 17:12 
Hallo,

an merkwürdies Ansinnen von mir, der nur Freepascal hat.
Kann jemand testen, ob dieser Schnipsel mit Delphi kompiliert.
So funktioniert es mit freepascal 2.6.0.
Man könnte die die unit qmath dann ja universel für Delphi und freepascal halten.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
(******************************************************************************)
(******************************************************************************)

type

TComplex = record
 x,
 y : double;
end;

TQuat = record
 x,
 y,
 z,
 w : double;
end;

(******************************************************************************)
procedure Quat2Comp(const Q : TQuat; var C1, C2 : TComplex);
asm
  fld  TQuat(Q).X;// Delphi fld Q.X
  fsub TQuat(Q).w;
  fstp TComplex(C1).x;

  fld  TQuat(Q).y;
  fadd TQuat(Q).z;
  fstp TComplex(C1).y;

  fld  TQuat(Q).x;
  fadd TQuat(Q).w;
  fstp TComplex(C2).x;

  fld  TQuat(Q).y;
  fsub TQuat(Q).z;
  fstp TComplex(C2).y;
end;

Begin
end.


Gruß Horst
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 06.08.12 17:30 
kompiliert unter XE

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS

Für diesen Beitrag haben gedankt: Horst_H
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 06.08.12 20:11 
Hallo Horst_H,
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Man könnte die die unit qmath dann ja universel für Delphi und freepascal halten.

Auch unter Delphi 5 funktioniert Dein Code perfekt.
Allerdings muss ich vor der Assembler-Variante von QMath etwas warnen. Zum Beispiel ist die Divisionsroutine der Quaternionen, aber auch der komplexen Zahlen, nicht sauber umgesetzt. Ist einer der Divisoren in
ausblenden Delphi-Quelltext
1:
result.x := ((a.x*b.x)-(a.w*b.w)) / (sqr(b.x)-sqr(b.w)) + ((a.y*b.y)-(a.z*b.z)) / (sqr(b.y)-sqr(b.z));					

Null, wird dies im asm-Code nicht abgefangen. Die Unit benötigt damit noch ein paar Ergänzungen.
Eine klassische Abfrage, ob b.x=b.w oder b.y=b.z ist, bremst den Vorteil von Assembler aus. D.h., hier müsste jemand mit ASM-Kenntnissen Abhilfe schaffen. Da ich das nicht kann, verwende ich die assemblerfreie Variante. Viel langsamer wird es nicht.
Übrigens sind auch weitere Divisionen mit Null nicht abgesichert, z.B. bei Tan und Tanh der komplexen Zahlen bzw. Quaternionen.
Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Di 07.08.12 14:29 
Hallo,

es wird ja als Alternative qmath2 empfohlen, das ohne die Benutzung von Assembler auskommt.
Ich weiß jetzt aber nicht, wie schnell der von Dir benutzte parser ohne Ausgabe ist.
Ich habe mal ein Testprogramm mit cqparser angehängt.
Bei mir braucht es 0,88 Sekunden (2,3 Ghz Amd )für 640x640 Punkte und Bestimmung der Farbe mit den Konstanten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
const
  b = 640;
  h = 640;
  _x1 = -1.02;// Bei -1.0 kommt DivisionbyZeroError
  _x2 =  1.0;
  _y1 = -7.0;
  _y2 =  7.0;

Natürlich müßte man noch viel mehr Fehler abfangen, aber es ist die Frage, ob das gegenüber dem von Dir verwendetem Parser lohnt.

Gruß Horst
EDIT:
ganz koscher ist das ja nicht in qmath2:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function rec2polC(const C : TComplex) : TComplex;
begin
 result := C;

 result.x := sqrt(sqr(result.x) + sqr(result.y));

 if result.x = 0 then
  begin
//Was denn nun?
    result.y :=  PIhalbe;
    result.y := -PIhalbe;
  end
 else
  begin
    result.y := arctan(result.y / result.x);
    if (result.x < 0)then result.y := result.y + pi;
  end;
end;
Einloggen, um Attachments anzusehen!
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Di 07.08.12 14:46 
Für genau diesen Zweck gibt es seit ewigen Zeiten die Funktion math.arctan2:
Zitat:
ArcTan2 calculates ArcTan(Y/X), and returns an angle in the correct quadrant.
Sie ist auch für x=0 definiert; außerdem haben wir noch math.hypot, das sich um Overflows und bessere Genauigkeit kümmert. Damit hätte man wohl
ausblenden Delphi-Quelltext
1:
2:
result.x := hypot(c.x, c.y);
result.y := arctan2(c.y, c.x);

Gruß Gammatester
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 07.08.12 15:26 
Hallo Horst_H,
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mal ein Testprogramm mit cqparser angehängt.

Tut mir leid. Ich bekomme Dein Programm nicht zum laufen. Mehrere Funktionen kennt mein Delphi 5 nicht.
Kannst Du bitte eine Exe anhängen?
user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
Für genau diesen Zweck gibt es seit ewigen Zeiten die Funktion math.arctan2:

Genau so ist es. In meinem eigenen Funktionsinterpreter nutze ich prinzipiell arctan2. Es ist schnell und vor allem muss man sich nicht selbst um den korrekten Quadranten kümmern.
Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Di 07.08.12 16:41 
Hallo,

jetzt habe ich den dicken Rechner und der braucht 0,18 Sekunden für die Rechnerei.( 3,2 Ghz, das Notebook war auf 800 Mhz eingefroren )
Ich kann es hier mal mit Lazarus probieren.Dein PhasenPlot ließ sich problemlos übersetzen und läuft.

Gruß Horst
P.S.
Die Änderung Deiner Zeichenprozedur, um nur die Zeit zu stoppen ergab recht genau 1 Sekunde.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
//Zeichenprozedur
procedure jetztzeichnen;
var
    T1,T0: TDateTime;
    maxwx,diffx,diffy:real;

    i,j,b,h,plotfarbe:integer;
    red,green,blue,maxf,maxw:integer;
    k1:string;

begin
    //Funktionsterm
    k1:=edit0.text;
    termkorrektur(k1);

    b:=bitmap.width;
    h:=bitmap.height;
    diffx:=(_x2-_x1)/b;
    diffy:=(_y2-_y1)/h;
    //Zeichnen
    T0 := Time;
    for i:=0 to b do
    begin
      kx.re:=_x1+i*diffx;
      for j:=0 to h do
      begin
        kx.im:=_y1+j*diffy;
        //komplexer Funktionswert
        fehlerkomplex:=0;
        ky:=funktionswertkomplex(k1,kx);

        //Phase ermitteln
        maxwx:=arctan2(ky.im,ky.re);
        if maxwx<0 then maxwx:=maxwx+2*pi;

        //Zeichenfarbe auswählen
        if fehlerkomplex<>0 then plotfarbe:=clblack
        else
        begin
              maxw := trunc(3/pi*maxwx);
              maxf := round(3*255/pi*(maxwx-maxw*pi/3));
              case maxw of
                0 : begin Red := 255; Green := 0; Blue := maxf end;
                1 : begin Red := 255-maxf; Green := 0; Blue := 255 end;
                2 : begin Red := 0; Green := maxf; Blue := 255 end;
                3 : begin Red := 0; Green := 255; Blue := 255-maxf end;
                4 : begin Red := maxf; Green := 255; Blue := 0 end;
               else begin Red := 255; Green := 255-maxf; Blue := 0 end;
              end;
            plotfarbe:=rgb(red,green,blue);
        end;
        //bitmap.Canvas.pixels[i,h-j]:=plotfarbe;
      end;
//      paintbox1.canvas.draw(0,0,bitmap);
//      application.processmessages;
    end;
    T1 := Time;
    Bitmap.Canvas.TextOut(10,10,FormatDateTime('HH:NN:SS.ZZZ ',T1-T0));
end;
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 07.08.12 18:41 
Hallo Horst_H
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
jetzt habe ich den dicken Rechner und der braucht 0,18 Sekunden für die Rechnerei.

Danke für die Exe. Ich werde neidisch. Auf meinem Rechner brauche ich bei Deinem Programm 0,84 Sekunden.
Damit ist klar, dass der CQParser deutlich schneller ist als mein eigener Parser. Ich werde versuchen, ihn einzubauen.
Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 10.12.12 10:51 
Hallo,
seit wenigen Tagen ist der neue Mathekalender der TU Bergakademie Freiberg bestellbar. Es sind wieder 12 faszinierende Kalenderbilder mit interessanten Erklärungen auf der Rückseite.
Ich weiß, dass das Werbung ist, aber der neue Kalender ist für Fans der komplexen Funktionen einfach ein Muss! :zustimm:

Darüberhinaus kann man alle "alten" Kalenderbilder der Jahre 2011 und 2012 unter
www.mathe.tu-freiber.../mathe-kalender-2011
www.mathe.tu-freiber.../mathe-kalender-2012
kostenlos herunterladen.

Leider ist es mir in meinem einfachen Programm noch nicht gelungen, die Beträge der komplexen Funktionswerte in die Darstellung der Phasenplots so einzubeziehen, wie bei diesem Kalender. Meine Phasenplots sind nicht so schön. :cry:

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein

Für diesen Beitrag haben gedankt: Anika
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mi 18.12.13 22:50 
Hallo,
als Weihnachtsgeschenk ist es zwar etwas spät, aber ich gestatte mir, wieder auf den Superkalender der Universität Bergakademie Freiberg hinzuweisen.
Unter www.mathe.tu-freiber.../mathe-kalender-2014 wird er beschrieben und er enthält wieder wunderschöne Phasenplots komplexer Funktionen.

Ich bin erneut absolut fasziniert von den Darstellungen und der Tatsache, was man mit der heutigen Technik berechnen und zeichnen kann. Wenn ich es nur schaffen könnte, ähnlich schöne Bilder zu erstellen.

Unter www.mathe.tu-freiber.../mathe-kalender-2013 kann man nun auch alle Kalenderblätter von 2013 kostenlos herunterladen.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein

Für diesen Beitrag haben gedankt: Anika, ub60