Plotter V3.71 © by Rüdiger Dreier 1988/9/90 Plotter ist FREEWARE DER AUTOR ÜBERNIMMT KEINERLEI HAFTUNG FÜR SCHÄDEN, DIE AUS DER SACH- ODER UNSACHGEMÄSSEN BENUTZUNG DES PROGRAMMS ENTSTEHEN !! WEITERHIN WIRD KEINE HAFTUNG FÜR DIE FEHLERFREIHEIT DES PROGRAMMS ÜBERNOMMEN !! BENUTZUNG AUF EIGENE GEFAHR ! Der Plotter ist ein Programm zum zeichnen zweidimensionaler mathe- matischer Funktionen. Es können 10 Funktionen eingegeben und gezeichnet werden. Zusätzlich kann man sich von jeder Funktion die erste und zweite Ableitung zeichnen lassen (jeweils nummerisch oder symbolisch bestimmt). Es eignet sich zur Unterstützung bei Kurvendiskussionen, um die selbst errechneten Ergebnisse zu kontrollieren. Das Programm fertigt keine komplette Kurvendiskussion an. Anforderungen an die Rechnerkonfiguration: Das Programm läuft unter Kickstart 1.2 und 1.3, 512kB Speicher sollten mindestens vorhanden sein, besser mehr. Der Stack sollte mindestens 20000 Bytes betragen, sonst kommt es zu leicht zu Abstürzen. Im logischen Device LIBS: müssen sich drei Libraries befinden: - mathieeedoubbas.library - mathieeedoubtrans.library - tool.library (in diesem Ordner enthalten) Die Menupunkte: C-Plot Genauigkeit Es erscheinen 3 SubMenuPunkte, mit denen die Genauigkeit auf klein, mittel oder groß gesetzt werden kann. Je genauer gezeichnet wird, desto mehr Zeit wird benötigt. Intervall Nach Anwahl dieses Menupunktes erscheint ein Fenster mit 4 Stringgadgets, in denen die alten Intervallgrenzen (der Bereich, für den die Funktion gezeichnet werden soll) anzeigt werden. Diese Werte kann man wie gewohnt verändern. Der eingegebene Term muß nur den Anforderungen entsprechen, die auch für die Funktionen gelten. Außerdem darf die linke/untere Grenze nicht größer/gleich sein als die rechte/obere. In solchen Fällen erscheint das Fenster nach Anwahl des OK-Gadget (oder im vierten Stringgadget) wieder. Löschen Die auf dem Bildschirm dargestellten Funktionen und das Koordinatenkreuz werden gelöscht. Geschieht automatisch beim Verändern der Intervallgrenzen und Auflösung. Drucken Der für die Darstellung auf dem Bildschirm benutzte Rastport wird auf dem Drucker so groß wie möglich ausgegeben. Bereich mit Maus auswählen Dieser Menupunkt stellt eine Art Lupenfunktion zur Verfügung. Das Intervall, das als nächstes gezeichnet werden soll, kann mit der Maus ausgewählt werden. Die obere/linke Ecke wird mit der Maus angefahren, die linke Maustaste gedrückt und gehalten und dann die rechte/untere Ecke ausgewählt und die Maustaste losgelassen. Danach wird der Bildschirm gelöscht. Während die Maustaste gedrückt wird, wird um den momentan ausgewählten Bereich ein Kasten gezeichnet. Wurde die größte Darstellungsart (s.u.)ausgewählt, so kann jederzeit mit den Cursurtasten und ESC in der gesammten Darstellung gescrollt werden. Konstanten Ein Fenster ähnlich dem bei INTERVALL erscheint. In diesem kann man vier Konstanten (a,b,c,d) bestimmen, die bei Intervall und innerhalb der Funktionen benutzt werden können. About Dieser Menupunkt zeigt die Versionsnummer und das Datum der letzten Veränderung an dem Programm an. Durch Anklicken des Fensters verschwindet es wieder. ENDE Das Programm wird beendet (mit Sicherheitsabfrage). Funktion Ändern Nach Anwahl dieses Menupunktes erscheint ein Untermenu mit den bisher eingegebenen Funktionen (es werden die ersten 14 Zeichen der Funktion angezeigt). Wird einer dieser Funktionen angewählt, so erscheint sie in einem Stringgadget, so daß sie verändert werden kann. Die Funktion muß mathematisch korrekt eingegeben werden. Jede Funktion darf aus den Rechenarten +,-,*,/,^ und den Funktionen sin, cos, tan, log, int, sgn, abs, sqr, asin, acos, atan, ln und den Konstanten a, b, c, d, e und pi sowie der Variablen x bestehen. Es muß alles klein geschrieben werden. Zahlen dürfen normal (1; 1.1; .1) oder in Potenzschreibweise (3e5,5d-7) eingegeben werden. Bei Potenzen darf vor dem Exponenten ein + oder - stehen, ohne das der Exponent gleich geklammert werden muß. In der Regel sollte man aber alles so klammern, daß zweifelsfrei festgelegt ist, in welcher Reihenfolge der Term berechnet werden soll. Es gilt natürlich Potenz- vor Punkt-vor Strichrechnung. Wenn unpaarige Klammern vorhanden sind, erscheint das Stringgadget gleich wieder, damit man die Funktion korrigieren kann. Funktion, 1./2. Ableitung num/symb: Bei jedem dieser 5 Menupunkte erscheint wieder das Untermenu. Durch Anwahl eines Untermenupunktes kann man dann bestimmen, welche Funktion man gezeichnet haben will. Numerische Ableitungen werden nach dem Sekantenverfahren bestimmt, dabei können schon in der ersten Ableitung Ungenauigkeiten auftreten, die in der zweiten Ableitung dann schon recht deutlich werden. Beim symbolischen Ableiten wird erst die Ableitung als Term bestimmt und dann normal gezeichnet. Dabei kommt es dann nach Anwahl der Funktion zu einer kurzen Verzögerung, in der die Ableitung bestimmt wird. Diese Methode ist genauer, hat aber auch ihre Nachteile: Funktionsterme dürfen höchstens 500 Zeichen lang sein, bei komplizierten Funktionen kann diese Grenze bei der zweiten Ableitung leicht überschritten werden. Daher sollte der Programmteil Ableitung.c immer mit Stack-Checking compiliert werden (Lattice-C: ohne -v). Damit kann man einige Abstürze umgehen. Tritt bei dieser Version Plotter (ohne -v compiliert) ein Stacküberlauf auf, so erscheint ein Auto- requester, der einen darauf aufmerksam macht und die Möglichkeit zum Abbruch des Programms gibt. Dabei wird der Screen des Programms nicht geschlossen, dieser Speicher geht also verloren (leider). Aber immerhin ist der Rechner nicht aus heiterem Himmel abgestürzt. Außerdem sind einige der oben erwähnten Funktionen nicht ohne weiteres abzuleiten. Die Ableitung von sgn ist z.B. fast überall Null, nur um Null herum ist sie nicht definiert. Das Programm setzt dafür aber einfach Null ein. Außerdem wird z.B. die Ableitung von ln zu 1/x bestimmt und auch so gezeichnet, d.h. auch im negativen Bereich gezeichnet, obwohl ln dort überhaupt nicht definiert ist. Stellt das Programm beim Zeichnen einen mathematischen Fehler fest (z.B. Wurzel aus einer negativen Zahl), so erscheint nach dem Zeichnen ein Requester, der einen auf einen Fehler in der Formel aufmerksam macht. Dieser Fehler kann natürlich auch am Intervall liegen (oder bei 1/x wurde eine Division durch Null erkannt). Meistens kann man diese Meldung ignorieren, besonder wenn man sie schon erwartet hat. Sie erscheint hauptsächlich, um einen zu zeigen, daß beim Zeichnen etwas geschummelt wurde. Jeder Zeichenvorgang kann durch einen Mausklick in die Zeichenfläche abgebrochen werden. Es erscheint dann ein Requester, in dem man wählen kann, ob weitergezeichnet oder abgebrochen werden soll. Diskussion Unter diesem Menupunkt kann man sich eine grobe Kurvendiskussion er- stellen lassen (Nullstellen, Wendestellen und Extremstellen). Diese Stellen werden nur für das eingegebene Intervall bestimmt. Außerdem wird die Funktion sowie die erste und zweite Ableitung angezeigt. Bei Extremstellen wird angegeben, ob es ein Minimum oder Maximum ist, bei Wendestellen, ob es eine rechts-links "Kurve" oder umgekehrt ist. Nochmal zu den symbolischen Ableitungen: Eingefleischten Mathematikern mag bei einigen der Ableitungen die Haare zu Berge stehen. Zum Einen ist es mit der Vereinfachung der Terme noch nicht sehr weit her (Immerhin: 0*irgendetwas wird nicht angezeigt, wohl aber (1-1)*irgendetwas....). Aber auch rein mathematisch wird manchmal geschummelt. Folgende Ableitungen werden eingesetzt: +-*/ : Das übliche x^a : a*x^(a-1) a^x : a^x*ln(a) f(x)^g(x) : (g(x)*ln(f(x)))'*f(x)^g(x) (Weiß jemand etwas besseres oder einfacheres ?) trigonometr. Funktionen : Das übliche abs(x) : sgn(x) (Für x=0 nicht richtig) int(x) : 0 (Läßt sich drüber diskutieren) sgn(x) : 0 (Läßt sich drüber diskutieren) Das Programm macht nicht deutlich, wenn eine nicht ganz korrekte Ableitung benutzt wird. Im Zweifelsfall die nummerisch bestimmte Ableitung mit der symbolisch bestimmten vergleichen, sie sollten identisch sein. (Ausnahme: z.B. bei ln(x), siehe oben). ICH ÜBERNEHME KEINERLEI VERANTWORTUNG FÜR DIE RICHTIGKEIT DER ABLEITUNGEN ODER ANDERER ERGEBNISSE DIESES PROGRAMMS !! WER EIN ERGEBNIS IN EINER DIPLOMARBEIT ODER ÄHNLICHEN VERWENDET, SOLLTE LIEBER NOCHMAL VON HAND NACHRECHNEN !!!! Zu einer vollständigen Kurvendiskussion fehlt noch einiges: z.B. - Angabe Definitionsbereich - Symetrie - Asymptoten etc. (vielleicht später mal). Größe In diesen Menu kann man einstellen, ob auf einer 640x256- oder 1000 x 300-Bitplane gezeichnet werden soll. Da die größere Möglichkeit nicht in ein Fenster paßt, kann man mit den Cursor-Tasten in der Bitplan herumscrollen. Mit ESC kommt man in die obere/linke Ecke zurück. Die große Auflösung eignet sich besonders gut für Ausdrucke, aber man sollte dann einen Drucker haben, der auch so viele Punkte je Zeile darstellen kann. Hinweis ------- Um den Code klein zu halten, wurde eine Stub-Routine MemCleanup eingefügt. Das verringert die Codelänge bei Lattice-Programmen meist etwas. Bei anderen Compilern sollten die entsprechenden Zeilen gelöscht werden (in Berechnungsroutinen.c). Für Lattice-Besitzer: das C-Tutorial auf Disk 4 beachten (V4.00). Bekannte Fehler: ---------------- Es wäre schön, wenn ich hier KEINE hinschreiben (tippen) könnte. Aber das wäre nicht ganz richtig. Es gibt ein paar kleine Fehler, ich weiß aber nicht, wo sie sind. - Im Quelltext muß Mathieeebase als extern deklariert werden, sonst beschwert sich der Linker. Bei allen anderen Library-Pointern kann man einmal normal deklarieren. Dieser Fehler liegt wohl irgendwo in den (Link)Libraries. - Gelegentlich wird beim Zeichnen ein Funktionswert zu NULL bestimmt und entsprechend gezeichnet. Das ergibt dann einen einzelnen Punkt oder einen häßlichen Haken. Dieser Fehler ist nicht reproduzierbar, d.h. läßt man die gleiche Funktion sofort nochmal zeichnen, passiert das gleiche nicht nochmal. Wie kann sowas passieren ? - Gelegentlich tritt eine TrapV-Exception auf. Die anfälligen Fix-Umwandlungen (die diesen Fehler scheinbar produzieren können) habe ich alle überprüft, wo nötig auch eine Sicherheitsabfrage eingefügt. Diese Exception entsteht irgendwo anders. Sie ist ebenfalls nicht reproduzierbar. Die folgende Unzulänglichkeit werde ich vielleicht noch abstellen: - Die Fehlerabfragen im Parser (der Programmteil in der Tool.Library, der die Strings auswertet) sind nicht die besten. Es wird zwar verhindert, daß durch NULL geteilt wird, ebenfalls wird bemerkt, wenn von einer negativen Zahl die Wurzel oder der Log gebildet werden soll. Wurde aber eine sinnlose Funktion eingegeben, dann wird das nicht bemerkt und so weit wie möglich ausgewertet. Wurden Funktionen falsch eingegeben (sinn statt sin) oder groß geschrieben, dann versucht das Programm, dies als Zahl zu interpretieren, was natürlich recht sinnlose Ergebnisse hervorbringt. Sollte irgendwann eine Funktion nicht so gezeichnet werden, wie man sich das ungefähr vorstellt, dann sollte man überprüfen, ob man sich irgendwo vertippt hat. Falls jemand Verbesserungsvorschläge, Fehlerkorrekturen (oder auch neu entdeckte Fehler) hat (z.B. das irgendeine Ableitung falsch gebildet wird....ich habe da eigentlich sehr viel überprüft): Meine Addresse befindet sich im File Plotter.Readme (die Hinweise dort bitte beachten). Viel Freude mit diesen Programm !!