Autor |
Beitrag |
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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!
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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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.
Ich brauche keine "Lobeshymnen" , 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
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: So 05.08.12 10:47
bummi hat folgendes geschrieben : | ich habe die Pixels[] - Routine versuchsweise durch einen eigenen FastScanlinezugriff ausgetauscht, bringt aber kaum etwas, die Hauptrechenzeit wird geht nicht bei der Darstellung verloren. |
Mathematiker hat folgendes geschrieben : |
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
Beiträge: 1653
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 05.08.12 17:07
Hallo,
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.
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
Beiträge: 1653
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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.
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; 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
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 06.08.12 20:11
Hallo Horst_H,
Horst_H hat folgendes geschrieben : | 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
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
Beiträge: 1653
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| const b = 640; h = 640; _x1 = -1.02; _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:
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 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
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: 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 Delphi-Quelltext 1: 2:
| result.x := hypot(c.x, c.y); result.y := arctan2(c.y, c.x); |
Gruß Gammatester
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 07.08.12 15:26
Hallo Horst_H,
Horst_H hat folgendes geschrieben : | 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?
Gammatester hat folgendes geschrieben : | 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
Beiträge: 1653
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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.
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:
| 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 k1:=edit0.text; termkorrektur(k1);
b:=bitmap.width; h:=bitmap.height; diffx:=(_x2-_x1)/b; diffy:=(_y2-_y1)/h; 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; fehlerkomplex:=0; ky:=funktionswertkomplex(k1,kx);
maxwx:=arctan2(ky.im,ky.re); if maxwx<0 then maxwx:=maxwx+2*pi;
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; end; 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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 07.08.12 18:41
Hallo Horst_H
Horst_H hat folgendes geschrieben : | 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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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!
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.
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
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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
|
|
|