AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Numerische Integration (inkl. flexibler Plotter-Komponente)
Thema durchsuchen
Ansicht
Themen-Optionen

Numerische Integration (inkl. flexibler Plotter-Komponente)

Ein Thema von heiopei · begonnen am 23. Jul 2008 · letzter Beitrag vom 24. Okt 2008
Antwort Antwort
heiopei
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!
Angehängte Dateien
Dateityp: zip screenshots_845.zip (188,2 KB, 98x aufgerufen)
Dateityp: zip programm-quellcode_189.zip (96,6 KB, 90x aufgerufen)
Dateityp: zip nur_komponenten_192.zip (58,3 KB, 54x aufgerufen)
Dateityp: zip numerische_integration_-_programm_208.zip (330,0 KB, 108x aufgerufen)
 
heiopei
 
#2
  Alt 14. Okt 2008, 16:04
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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins
 
#3
  Alt 14. Okt 2008, 16:40
Hallo, habs mir gerade mal angeschaut (nur das Demo-Programm)
Ich habe einfach mal Simpson mit 100.000 Iterattionen verwendet und die Anzeige ruckelt

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) ...)
  Mit Zitat antworten Zitat
heiopei
 
#4
  Alt 14. Okt 2008, 22:07
abend,
danke fürs feedback
Zitat von jfheins:
Ich habe einfach mal Simpson mit 100.000 Iterattionen verwendet und die Anzeige ruckelt
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 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 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

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 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" 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
  Mit Zitat antworten Zitat
aladin60

 
Delphi 2006 Personal
 
#5
  Alt 20. Okt 2008, 19:52
Gute Arbeit!

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

Bernd.
  Mit Zitat antworten Zitat
zahor

 
Delphi 2007 Professional
 
#6
  Alt 24. Okt 2008, 12:01
hi heiopei,
super! ist echt hammer gemacht! großes lob! den quelltext guck ich mir später noch an.
  Mit Zitat antworten Zitat
heiopei
 
#7
  Alt 24. Okt 2008, 21:13
Zitat von aladin60:
Gute Arbeit!
Zitat von zahor:
hi heiopei,
super! ist echt hammer gemacht! großes lob! den quelltext guck ich mir später noch an.
Danke!!!

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz