Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Numerische Integration (inkl. flexibler Plotter-Komponente) (https://www.delphipraxis.net/117687-numerische-integration-inkl-flexibler-plotter-komponente.html)

heiopei 23. Jul 2008 14:04


Numerische Integration (inkl. flexibler Plotter-Komponente)
 
Liste der Anhänge anzeigen (Anzahl: 4)
Hallo,

Numerische Integration 1.0

Das hier vorgestellte Programm hatte ich für meine Facharbeit geschrieben. Da ich nicht viele Programme gesehen habe (v.a. ohne Quellcode), die Funktionen grafisch schön darstellen und flexibel erweiterbar sind, war ich "gezwungen" eine solche Komponente zu entwickeln.
Ich habe das Programm jedoch nicht umbedingt wegen der Veranschaulichung von Numerischen Verfahren hier reingestellt (das interessiert vermutl. nicht all zu viele), sondern eher wegen des für meine Begriffe flexiblen Plotters (siehe weiter unten).

Zum Programm:

Das Programm stellt eine Oberfläche zur Verfügung, mit der Numerische Integrationsverfahren veranschaulicht werden sollen.
Dabei gibt es drei Module:
- ein Verfahren an verschiedenen Funktionen testen
- meherere Verfahren an einer Funktion testen
- ein Verfahren an einer Funktion testen, wobei eine Große Oberfläche zum detailierten Betrachten zur Verfügung steht (Hier kann
man auch Graphen als JPEG/BMP-Dateien speichern

Es werden die folgenden Verfahren unterstützt:
- Left/Right-Riemann
- Trapezregel
- Simpson
- Monte-Carlo

Dabei kann eine beliebige (sinnvolle) Zahl an Stützstellen eingestellt, sowie beliebige Integrationsgrenzen definiert werden.
Durch die Verwendung eines Funktionenparsers - hier sei darauf hingewiesen, dass ich die Komponente "TCQParser" von Fabian Kleuss in abgewandelter Form verwendet habe - ist die beliebige Eingabe von Funktionen möglich!

Zur Komponente "TPlotter":

TPlotter stellt eine einfache TWinControl-Komponente dar, die einen Graph (TGraph) und beliebig viele Zeichenelemente (TPlotItem) enthält. Der Plotter regelt den Event-"Verkehr", d.h. er nimmt "ich will mich Neu-Zeichnen"-Ereignisse entgegen und leitet diese entsprechend weiter.

Der Graph (TGraph) ist frei skalierbar, per Maus zoom- und bewegbar, die Anzeige des Koordinatensystems kann eingestellt werden (Gitterlinien, Skala, Achsen, Farben...) und ist direkt von TGraphicControl abgeleitet.

Die Klasse TPlotItem stellt eine TObject-Klasse dar, die in der Grundform nur Funktionen zur Zusammenarbeit zwischen TGraph und TPlotter enthält. TPlotItem kann an den Plotter melden, dass sich das PlotItem neu auf den Graph zeichnen muss und TPlotter kann das PlotItem anweisen, sich neu auf den Graph zu zeichnen. Leitet man diese Klasse ab, so kann man beliebige Klassen erzeugen, die irgendwelche Daten auf dem Graph ausgeben können, wie z.B. Funktionen (+ deren Ableitungen, etc), Diagramme, usw.

Für das oben beschriebene Programme habe ich dazu die Klassen TPlotableFunction und TNumIntegrator von TPlotItem implementiert.
TPlotableFunction zeichnet eine beliebige Funktion auf den Graph und TNumIntegrator die Integral-"Fläche" einer beliebigen Funktion.

Zur Demonstration der Anwendung dieser Komponenten gibt es zwei extra Demoprogramme. Möchte man sich weiter damit beschäftigen, so kann man auch die relativ ausführliche Dokumentationen im Quellcode lesen - so wird das System evtl. noch besser klar...


Bekannte Fehler:
- vermutl. ist die Oberfläche bei einigen Bildschirmen zu groß (ist mir grad eingefallen), ich wäre also dankbar wenn mir da jemand möglichst bald bescheid sagt
- der Parser kann nicht kürzen, daher gibt es Probleme bei X durch X.
- Falsche Berechnung bei X hoch X im Negativen Bereich
- evtl. fehlerhafte Fehlerabschätzung (klingt komisch, is aber so...)
- Probleme beim numerischen Ableiten

So, ich hoffe das waren erstmal ausreichend viele Informationen...
Viel Spass beim Testen!

heiopei 14. Okt 2008 16:04

Re: Numerische Integration (inkl. flexibler Plotter-Komponen
 
hallo,
da es schon länger her ist, das ich das Programm hier reingestellt habe,
wollte ich doch mal fragen, was ihr von dem Programm haltet.
Mich würde dabei interessieren, ob die Graph-Komponente (die mit sehr viel Mühe implementiert wurde) intuitiv bedienbar ist (sowohl aus Programmierersicht, der die Komponente einbindet, als auch Anwendersicht) und fehlerfrei funktioniert! Auch Hinweise auf andere, bessere Graphen-Zeichner sind erwünscht... Insbesondere beim Quellcode wäre ich über Auskunft darüber, ob das Code-Design sinnvoll ist (das ist das erste umfangreichere programm gewesen, das ich objekt-orientiert programmiert entworfen habe), sehr froh.

danke fürs anschaun und informieren,
heiopei

jfheins 14. Okt 2008 16:40

Re: Numerische Integration (inkl. flexibler Plotter-Komponen
 
Hallo, habs mir gerade mal angeschaut (nur das Demo-Programm)
Ich habe einfach mal Simpson mit 100.000 Iterattionen verwendet und die Anzeige ruckelt :stupid:

Es wäre sehr cool, wenn das Teil das Bild zwischenspeichert, sodass man schnell verschieben und zoomen kann, und dann wird (im Hintergrund) das Bild neu berechnet, und angezeigt.


Ich nehme mal an, du hast das Teil schon für Multicore-Pozessoren angepasst? Weil er belastet von meinen vieren zwei Cores mit je 75% ...

Generell finde ich das gut, dass mal jemand sowas gemacht hat, und es könnte eigentlich auch mal in die CodeLib *vorschlag* ;)

Btw.: Warum kann ich x^(1/x) nicht mit der Linken-Rechteck-Regel integrieren? Er sagt mir Uneigentliches Integral :(

Nochmal nachgedacht: Okay, logisch - der Punkt X=0 existiert nicht. Warum liefern die anderen keinen Fehler? (Gleiches bei Integral von 0 bis 1 von ln(x) ...)

heiopei 14. Okt 2008 22:07

Re: Numerische Integration (inkl. flexibler Plotter-Komponen
 
abend,
danke fürs feedback :)
Zitat:

Zitat von jfheins
Ich habe einfach mal Simpson mit 100.000 Iterattionen verwendet und die Anzeige ruckelt :stupid:

hi, bei der momentanen Arbeitsweise von TNumIntegrator.Paint ist das, soweit ich mich an den Code erinnern, kann kein Wunder (es kommt ja nicht umsonst eine Meldung bei über 10000 Iterationen), da die einzelnen Intervall-Maße immer berechnet und "gezeichnet" werden, was wiederum sehr zeitaufwendig ist. Bei einer so hohen Zahl an Intervallen sieht man die einzelnen Intervalle logischerweise jedoch nur noch als schwarze Fläche. Man könnte das Zeichnen daher vermutl. beschleunigen, indem man nur noch die Y-Werte der Stützpunkte berechnet, die als Pixel darstellbar sind (und nicht dazwischen "liegen") - muss ich mal auschecken, soweit hab ich noch garnicht gedacht...

Zitat:

Zitat von jfheins
Es wäre sehr cool, wenn das Teil das Bild zwischenspeichert, sodass man schnell verschieben und zoomen kann, und dann wird (im Hintergrund) das Bild neu berechnet, und angezeigt.

Das dürfte so, wie die Komponenten momentan miteinander kommunizieren, nicht ohne weiteres, bzw. wahrsch. gar nicht möglich sein (und so wie ich deine Aussage verstehe). Kannst du das evtl. nochmal ein bisschen genauer beschreiben, was du damit meinst?

Zitat:

Zitat von jfheins
Ich nehme mal an, du hast das Teil schon für Multicore-Pozessoren angepasst? Weil er belastet von meinen vieren zwei Cores mit je 75% ...

Nicht das ich wüsste :angel2: :oops: :P

Zitat:

Zitat von jfheins
Generell finde ich das gut, dass mal jemand sowas gemacht hat, und es könnte eigentlich auch mal in die CodeLib *vorschlag* ;)

Gerne!

Zitat:

Zitat von jfheins
Btw.: Warum kann ich x^(1/x) nicht mit der Linken-Rechteck-Regel integrieren? Er sagt mir Uneigentliches Integral :(

Nochmal nachgedacht: Okay, logisch - der Punkt X=0 existiert nicht. Warum liefern die anderen keinen Fehler? (Gleiches bei Integral von 0 bis 1 von ln(x) ...)

Das x^(1/x) für die Linke-Rechteck-Regel nicht funktioniert ist logisch, da der linke Wert des Intervalls als Berechnungsgrund-Lage verwendet wird - dieser ist aber nicht definiert... Die Rechte-Rechteck-Regel funktioniert jedoch, da der rechte Wert des Intervalls als Grundlage dient - dieser ist jedoch definiert! Die anderen Routinen verwenden jedoch auch alle mindestens den linken Wert, daher kann ich mir das jetzt auch nicht ganz erklären, warum die Ergebnisse liefern, muss ich mir nochmal genauer überlegen und anschaun...

bis dann,
heiopei

PS: Wie im ersten Beitrag kurz angedeutet, funktioniert der Parser, bzw. die Fehlerbehandlung bei ungültigen Berechnungen (0 /5 usw.) noch nicht 100%ig :? Spiel mal mit obiger Funktion im Graph ein wenig herum, irgendwann kommt eine Fehlermeldung "div by 0" :shock: Ich habe ihn zwar schon um einige Fehlerbehandlungen erweitert, aber irgendwann hatte ich für meine Facharbeit andere Prioritäten... Ich hab dafür jedoch momentan ein bisschen wenig Zeit, da ich jetzt dann umziehen werde - aber der Code ist ja OpenSource und halbwegs gut dokumentiert :cheers:

aladin60 20. Okt 2008 19:52

Re: Numerische Integration (inkl. flexibler Plotter-Komponen
 
Gute Arbeit!

Der Parser meldet Fehler bei negativen Potenzen in der Funktion. Aber sonst finde ich das Maschinchen schon toll.

Bernd.

zahor 24. Okt 2008 12:01

Re: Numerische Integration (inkl. flexibler Plotter-Komponen
 
hi heiopei,
super! ist echt hammer gemacht! großes lob! den quelltext guck ich mir später noch an.

heiopei 24. Okt 2008 21:13

Re: Numerische Integration (inkl. flexibler Plotter-Komponen
 
Zitat:

Zitat von aladin60
Gute Arbeit!

Zitat:

Zitat von zahor
hi heiopei,
super! ist echt hammer gemacht! großes lob! den quelltext guck ich mir später noch an.

Danke!!!

Zitat:

Zitat von aladin60
Der Parser meldet Fehler bei negativen Potenzen in der Funktion. Aber sonst finde ich das Maschinchen schon toll.

Danke für den Hinweis - wie gesagt, der Parser ist noch nicht voll funktionstüchtig - werde das mal in 2-3 Wochen angehen, momentan hab ich zu viel anderes um die ohren! Wenn jemand anderes noch erfolgreich dran gebastelt hat, bitte mitteilen...

viel spass beim weitertesten,
heiopei


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