Maple-Stolperfallen
… und wie man sie
vermeidet
Wolfgang
Konen,
FH Köln
Stand
22.12.2007
Immer dran denken: Das in mathematischen Formeln unterdrückte Mal-Zeichen muss in Maple stets ausgeschrieben werden: aus wird in Maple ln(a*c).
Das ist ein echter Bug in Maple, der manchmal auftritt (es ist nicht ganz klar in welchen Maple-Versionen und unter welchen Bedingungen).
Abhilfe 1: Wenn man RealDomain nur für einen einzelnen Befehl braucht, z.B. für ein solve, dann kann man mit
solve((x^2+1)*(x-5));
end use;
die Verwendung von RealDomain auf nur diesen Befehl einschränken. Ausserhalb funktioniert dann der D-Operator wie gewohnt.
Abhilfe 2: Wenn man unbedingt mit with(RealDomain) rechnen muss, dann nehme man für D den Ersatzoperator
fD:=unapply(diff(f(x),x),x);
Auch dies ist ein echter Bug, der DiffTutor startet zwar, er wendet auch ChainRule an, aber beim Versuch, die sin-Rule anzuwenden gibt es eine komische Fehlermeldung.
Ein restart; with(Student[Calculus1]): bereinigt die Situation.
Denn: 1) Maple verwendet wirklich immer das zuletzt berechnete Ergebnis, und es kann sein, dass man zuvor einen anderen Befehl als den direkt darüberstehenden ausgeführt hat. Das führt dann häufig zur Verwirrung.
2) Wenn bei einer Berechnung nichts herauskommt, dann bezieht Maple ein „%“ automatisch auf das vorherige Resultat, also das Resultat, bei dem zuletzt etwas herauskam. Das kann zu erheblicher Verwirrung führen!!!
Betrachten Sie als Beispiel folgenden Code zur Berechnung von Wendestellen:
> |
f:=x^3+1; df2:=diff(f,x$2);
|
> |
solve(df2=0);
print("Mögliche
Wendestelle bei",%); |
Sieht alles einfach und gut aus. Nun machen wir aus x^3 ein x^2 und rechnen erneut:
> |
f:=x^2+1; df2:=diff(f,x$2);
|
> |
solve(df2=0); print("Mögliche Wendestelle bei",%);
|
Wie kommt Maple darauf, dass 2 eine Wendestelle sei, wo die Funktion x2+1 doch keine Wendestelle hat??? – Weil der solve-Befehl keine Lösung brachte, nimmt Maple das letzte Ergebnis davor, und das ist df2:=2. Kaum das gewünschte Resultat.
Abhilfe: Man vermeide „%“ und weise das solve-Ergebnis lieber auf eine Variable s zu. (Weil solve auch mal mehrere Ergebnisse liefern kann, nehmen wir mit s[1] von diesen das erste Ergebnis.) Man sieht dann an deutlich, dass hier ein Ergebnis keine Lösung bringt:
> |
f:=x^2+1; df2:=diff(f,x$2); |
> |
s:=solve(df2=0); print("Mögliche
Wendestelle bei",s[1]); Error, invalid subscript selector |
In diesem Fall ist ein Error bei print das wohl wünschenswerte Ergebnis. Wäre bei s mindestens eine Lösung herausgekommen, hätte Maple die 1. Lösung ausgegeben.
Ein paar Maple-Tricks
Wolfgang
Konen,
FH Köln
Stand
22.12.2007
Oftmals hilft der Nachsatz assume=positive, denn Maple denkt sonst immer an die kompliziertesten denkbaren Fälle (z.B. komplexe Zahlen u.ä.). Mit assume=positive schränken wir auf die positiven reellen Zahlen ein, die wir bei vielen Umformung auch tatsächlich meinen:
f:=(sqrt(y/x*sqrt(x/y*sqrt(x/y)))); |
|
|
|
> |
h:=ln(a*c/b)-ln(c^4)+ln(b): |
|
|
Oftmals gleichwertig ist simplify(..., symbolic).
Der Befehl with(RealDomain) bewirkt, dass ab dann nur reelle Lösungen gesucht werden: (-8)1/3 hat dann in R die eindeutige Lösung -2 und (-1)1/2 hat in R keine Lösung (Maple: undefined).
> |
restart: |
> |
with(RealDomain): |
[Ohne
RealDomain läßt Maple (-8)1/3
unverändert,
weil dies für 3 Lösungen steht (im Komplexen), und
es formt (-1)1/2 zu I (imaginäre Einheit)
um. Aber das bekommen wir erst im 2. Semester!]
Aber Achtung, RealDomain hat den oben beschriebenen Bug in Verbindung mit Operator D !
Indem man erst die Funktion an der y-Achse spiegelt, also statt f(x) die Funktion f(-x) nimmt, dann die Asymptote für bestimmt, dann diese Asymptote wiederum an der y-Achse spiegelt:
> |
a2:=convert(asympt(f(-x),x,1),
polynom): |