Kapitel 14 Umformung und Vereinfachung mathematischer Ausdrücke Obwohl der Titel dieses Kapitels eher abstrakt klingt, behandelt das Kapitel eines der wichtigsten Themen dieses Buches: das Umformen und Vereinfachen mathematischer Ausdrücke. In der Mathematik gibt es oft viele verschiedene Möglichkeiten, ein und denselben Sachverhalt auszudrücken. So können Sie x2 1, aber auch (x + 1)(x 1) schreiben, was weniger eine Frage des Geschmacks als vielmehr der jeweiligen Anwendung ist, die Sie interessiert. Damit haben wir schon eines der grundlegenden Probleme des Vereinfachens“ angesprochen: Je ” nach Zweck werden Sie beim Vereinfachen unterschiedliche, sich auch widersprechende Ziele verfolgen. Das macht es natürlich schwierig, einen solchen Vorgang zu automatisieren. Mathematica stellt Ihnen zwei zentrale Kommandos zum Vereinfachen von Ausdrücken zur Verfügung, Simplify und FullSimplify, die beide versuchen, einen Ausdruck in eine möglichst einfache Form ohne Ansehen der Zielstellung zu bringen. Simplify ist dabei das Alltagskom” mando“, das mit einem eingeschränkten Repertoire von Tricks arbeitet, aber in den meisten Situationen ausreicht, um Ausdrücke in eine möglichst einfache Form zu bringen. FullSimplify schöpft das ganze Können von Mathematica aus, was in manchen Fällen (besonders, wenn algebraische Zahlen im Spiel sind) noch zu weiteren deutlichen Vereinfachungen führen kann – allerdings auf Kosten der Rechenzeit. Daneben gibt es eine ganze Reihe von Kommandos, um unterschiedliche, in ihrer Zielsetzung teilweise gegensätzliche Umformungen anzustoßen. Schließlich können Sie mit selbst zusammengestellten Regeln Mathematica noch zu mancher Umformung überreden, die es, aus welchen Gründen auch immer, nicht vornehmen möchte. Allerdings ist es oft fehlende mathematische Exaktheit, wie im Fall der Umformung x y x y (setzen Sie einfach mal x = y = 1 ein!), die Mathematica abhält, eine solche Umformung automatisch vorzunehmen. p 7! p p Computeralgebrasysteme wie Mathematica trennen deshalb Rechnen und Vereinfachen und geben Ergebnisse algorithmischer Verfahren meist in einer durch den Algorithmus unmittelbar produzierten Form zurück, ohne diese vor der Ausgabe noch zu bearbeiten. Besonders beim Integrieren können dabei sehr lange Ausdrücke entstehen, die sich noch weiter vereinfachen lassen, was Sie als Nutzer aber selbst bewerkstelligen müssen. Im einfachsten Fall können Sie gleich an jedes Integrationskommando ein ==Simplify anschließen. Bitte beachten Sie aber, dass dessen Abarbeitung auch wieder einige Zeit in Anspruch nimmt. Sie können auf das Ergebnis 324 14 Umformung und Vereinfachung mathematischer Ausdrücke aber auch speziellere Transformationen anwenden, die vielleicht schneller zu einer Vereinfachung führen als dieses Allround-Kommando. Solche spezielleren Kommandos mit teilweise gegensätzlicher Wirkung sind: Expand und Factor Expand multipliziert alle Produkte aus, Factor versucht, Ausdrücke möglichst weitgehend in Faktoren zu zerlegen. Die speziellen Varianten PowerExpand und LogicalExpand wirken nur auf Potenzen bzw. logische Ausdrücke. Together und Apart können zur Bearbeitung rationaler Funktionen eingesetzt werden. Together bringt mehrere Brüche auf einen gemeinsamen Nenner, Apart führt eine Partialbruchzerlegung durch. TrigReduce, TrigExpand, TrigFactor sind Spezialkommandos, die besonders bei der Bearbeitung trigonometrischer Ausdrücke hilfreich sind. TrigToExp, ExpToTrig wandelt trigonometrische Ausdrücke in die (für kompliziertere Umformungen manchmal günstigere) Exponentialschreibweise um bzw. umgekehrt. Das Vereinfachen von Ausdrücken ist auch mathematisch ein anspruchsvolles Thema, dessen algorithmische Umsetzung sich oft hart an der Grenze zur prinzipiellen algorithmischen Unlösbarkeit bewegt. Umso wichtiger ist es für den Nutzer eines Systems wie Mathematica, Teilklassen mit gutem Simplifikationsverhalten zu kennen und identifizieren zu können. Dieses Kapitel legt – nach einer etwas ausführlicheren Darstellung der Simplifikationsproblematik – zunächst den Schwerpunkt auf pseudorationale Ausdrücke als die wichtigste solche Teilklasse. Danach wird an trigonometrischen Anwendungen demonstriert, welche Fragen für Ausdrücke auftreten, die in mehrere verschiedene Richtungen sinnvoll umgeformt werden können, und wie Sie gescheite Antworten darauf finden. Mit dem Integrieren trigonometrischer Funktionen greifen wir dabei auch noch einmal ein Thema aus dem Kapitel 12 auf. Betrachten Sie diesen Teil nicht nur als Einführung in das Arbeiten mit trigonometrischen Funktionen, sondern zugleich als Beispiel für den Umgang mit anderen Funktionenklassen, die wir in diesem Buch nicht alle einzeln behandeln können. Die Kommandos mögen dort andere sein – die grundsätzlichen Überlegungen aber sind ähnlich. Ein wichtiges Thema beim Vereinfachen von Ausdrücken ist für das nächste Kapitel aufgespart – das Vereinfachen von Ausdrücken, die algebraische Zahlen (insbesondere Root-Symbole) enthalten. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Die Simplifikationsproblematik 325 Die Simplifikationsproblematik Welches die einfachste Form eines mathematischen Ausdrucks ist, lässt sich nicht immer eindeutig sagen. Eine dem menschlichen Denken nahe liegende Definition wäre vielleicht, dass ein Ausdruck dann einfach ist, wenn er aus möglichst wenigen Einzeltermen zusammengesetzt ist. Das heißt aber noch lange nicht, dass diese Form auch mathematisch günstig ist (beispielsweise wenn der Ausdruck anschließend integriert werden muss). Noch viel weniger eindeutig ist der Weg zu einer einfacheren Form eines mathematischen Ausdrucks. (x 2)(x + 2)(x2 4) ist in der ausmultiplizierten Form x4 16 kürzer, bei (x 1)10 + 1 wäre das Ausmultiplizieren dagegen genau der falsche Weg, er führte zu einer Summe aus 10 Termen. Schwierig ist es auch, die Frage zu beantworten, was wir in dieser Richtung überhaupt erwarten können. Die einfache Darstellung dieses Ausdrucks ist noch durch Faktorisieren zu finden. Simplify 576 816 x 460 x2 129 x3 18 x4 x5 [ + + 2 (3 + x) Ziehen Sie 1 ab, so belässt Mathematica das Ergebnis in dieser kurzen Form. % Simplify ist jedoch nicht mehr in der Lage, aus dem expandierten Polynom die kurze Darstellung zurückzugewinnen. % Das mächtigere FullSimplify versucht eine andere Vereinfachung, eine Zerlegung des Polynoms nach dem Horner-Schema, die wenigstens für numerische Zwecke effizienter ist als die expandierte Darstellung. % + + + ] 3 (4 + x) 1 == Simplify 2 1 + (3 + x) 3 (4 + x) == Expand == Simplify 2 575 + 816 x + 460 x + 129 x 3 + 18 x 4 5 + x == FullSimplify 575 + x (816 + x (460 + x (129 + x (18 + x)))) 3 Um die Darstellung (3 + x)2 (4 + x) 1 zu finden, hätte Mathematica auch die Umgebung des Polynoms abgrasen müssen, indem es jeden der 5 Koeffizienten vor x0 ; : : : ; x4 um, sagen wir, 2 variiert. Das ergäbe 25 zu untersuchende Polynome – eine Steigerung des Aufwands auf das 25fache ohne die Chance, wenigstens in einem nennenswerten Prozentsatz von Fällen zu einem besseren Resultat zu kommen. Vereinfachen mit Simplify Computeralgebrasysteme wie Mathematica trennen deshalb die Phase des Berechnens von Ergebnissen und die Phase des Vereinfachens dieser Resultate voneinander. Am Ergebnis der folgenden vierten Ableitung können Sie die mehrfache Anwendung der Quotientenregeln noch erahnen. Simplify (aber auch das gezieltere Kommando Together, das nur Brüche zusammen- Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 326 14 Umformung und Vereinfachung mathematischer Ausdrücke fasst) bringen das Ergebnis in die zweite, einfachere und für die Weiterverarbeitung wohl vorzuziehende Form. " # 2 D p11 xx2 ; fx; 4g + 1 + x 2 105 x 7 + 51 x (1 2 (1 + 12 x 4 (1 2 2 7=2 x ) 9 x + x ) == Simplify 90 x + 3 2 7=2 (1 3 x ) 15 x +8 x % 2 9=2 (1 4 2 5=2 9 + (1 2 5=2 x ) 2 3 x + 12 x ) (1 2 5=2 1 + x ) (1 2 3=2 x ) 2 9=2 x ) Bei der Vereinfachung geht Mathematica davon aus, dass sich der Nutzer aktiv am Simplifikationsgeschehen beteiligt. Das kann im einfachsten Fall mit den Kommandos Simplify oder FullSimplify geschehen, aber auch kompliziertere Aktionen sind möglich. Wenn Sie z.B. vermuten, dass der Ausdruck ‘in der Nähe’ eines einfacheren liegt, dann können Sie selbst eine Liste dieser modifizierten Ausdrücke erstellen und untersuchen. Die Kommandos Simplify und FullSimplify vereinfachen Ausdrücke, indem sie eine Reihe gängiger algorithmischer Tricks wie Faktorisieren, Expandieren, Anwenden verschiedener Identitäten und Ähnliches versuchen und unter den Ergebnissen das ‘einfachste’ (eben das mit den wenigsten Termen) zurückgeben. Die Betonung liegt auf ‘versuchen’, denn manchmal ist das Resultat komplizierter als der ursprüngliche Ausdruck. Sie sollten von den Kommandos also keine Wunder erwarten! Mathematica kennt natürlich die einfache Regel Sin[x]2 + Cos[x]2 = 1. Sie wird auch dann angewendet, wenn die Argumente der Winkelfunktionen ein wenig unterschiedlich formuliert sind. Simplify Sin x 2 Cos x 2 [ [ ] + [ ] ] 1 SimplifySin a2 b222 Cos a b a b [ [( )( ] + + )] 1 In Simplify sind auch einige Regeln für logarithmische Funktionen eingebaut. Simplify Ea Log[b] [ ] a b Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Die Simplifikationsproblematik 327 Das Kriterium für die ‘Einfachheit’ mathematischer Ausdrücke ist im Regelfall deren Kürze. Simplify erkennt daher meistens, ob es besser ist, Produkte auszumultiplizieren oder nicht. Simplify x 1 10 1 [( ) + ] 10 1 + ( 1 + x) Simplify a b 2 a b 2 [( ) ( + ) ] 4 a b Das Arsenal von Simplify ist eingeschränkt und mit Blick auf die Rechenzeit optimiert, während FullSimplify das ganze Können von Mathematica auszuschöpfen versucht, was in manchen Fällen (besonders, wenn algebraische Zahlen im Spiel sind) noch zu weiteren deutlichen Vereinfachungen führen kann – allerdings auf Kosten der Rechenzeit. (Das Kommando kann mit Alt + . abgebrochen werden. Alternativ können Sie mit der Option TimeConstraint ein Zeitlimit (in Sekunden) vorgeben oder einzelne Funktionen durch die Option ExcludeForms von Vereinfachungsversuchen ausnehmen.) Wenn das Ergebnis einer Berechnung vorliegt und Sie nicht wissen, welches der vielen Transformationskommandos weiterhilft, dann ist Simplify zumindest einen Versuch wert – ganz nach dem Motto: Hilft’s nichts, so schadet es auch nicht. Vorsicht ist nur bei sehr komplexen Ausdrücken geboten: Da kann es schon passieren, dass die Rechenzeit ins Uferlose steigt. Simplify bricht automatisch nach fünf Minuten ab, FullSimplify kennt dagegen in der Defaulteinstellung kein Zeitlimit. Gezielte Umformung von Ausdrücken Oft ist es aber gar nicht das Ziel, einen Ausdruck nur ‘einfach so’ zu vereinfachen, sondern er soll in eine spezielle, für die weitere Verarbeitung günstige Form gebracht werden. In der Beziehung Log[x2 1] = Log[x +1]+ Log[x 1] werden Sie z.B. den rechten Ausdruck vorziehen, wenn Sie anschließend integrieren wollen, den linken dagegen beim Lösen einer Gleichung. Das Vereinfachen von Ausdrücken ist also Teil einer umfassenderen Problemstellung, die Mathematica bewältigen muss: Die gezielte Umformung von Ausdrücken in eine mathematisch (semantisch) gleichwertige, aber textmäßig (syntaktisch) verschiedene Form, deren Aussehen grob vorgegeben wird. Dafür stehen eine Reihe von Kommandos wie Expand und Factor, Together und Apart, TrigReduce, TrigExpand, TrigFactor usw. zur Verfügung, auf die wir weiter unten noch genauer eingehen werden. Auch zum Vereinfachen von Ausdrücken sind solche speziellen Umformungskommandos oft geeigneter als Simplify, denn mit ihnen können Sie selbst gezielt das Aussehen des Ergebnisses beeinflussen und sind nicht auf Gedeih und Verderb an das Geschehen in der ‘Black Box’ gebunden. Auch sind diese Kommandos meist schneller, da sie nur einen Teil der Arbeit von Simplify verrichten. Doch kommen wir noch einmal zur Beziehung Log[x2 1] = Log[x + 1] + Log[x 1] zurück. Offensichtlich macht Mathematica beim Integrieren davon keinen Gebrauch, denn die vom Computer berechneten Stammfunktionen der beiden Seiten unterscheiden sich leicht. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 328 Z 14 Umformung und Vereinfachung mathematischer Ausdrücke Log x2 1 x dl 2 x s1 = % ( 1 + x] + Log[1 + x] + x 2 + Log 2 1 +x 2 1 +x Log x 1 Log x 1 x [ 2 x s2 1 + x] + Log[1 + x] + x Log == Simplify Log[ Z Log[ = % ] + Log[ [ + ]) dl 1 + x] + x Log[ 1 + x] + Log[1 + x] + x Log[1 + x] == Simplify 2 x + ( 1 + x) Log[ 1 + x] + (1 + x) Log[1 + x] Mathematica geht beim Integrieren also einen anderen Weg als den der Faktorzerlegung des Arguments der Logarithmusfunktion. Allerdings kann selbst FullSimplify die Gleichwertigkeit der Ergebnisse nicht feststellen. s1 == x s2 == FullSimplify Log[ 1 + x] + Log[1 + x] Log[ 2 1 + x ] == 0 Der Grund dafür liegt in Fragen der mathematischen Exaktheit, auf die wir weiter unten noch zurückkommen werden. 2 Auch beim Lösen einer Gleichung, die den == ; Term Log[x2 1] enthält, sind die beiden Aus p p x ! 2 ; x ! 2 drücke nicht gleichwertig. Solve Log x 1 0x Solve Log x 1 Log x 1 [ x [ ! ] + p [ + ] == 0; x ] 2 Sie vermuten vielleicht als Grund, dass dies mit dem eingeschränkteren (reellen) Definitionsbereich des zweiten Ausdrucks zusammenhängt. Dieses Argument ist nicht stichhaltig, wie wir bereits betont haben, denn defaultmäßig werden alle Funktionen als komplexwertig betrachtet. Wir kommen weiter unten auf diese Frage zurück. Erkennen semantisch gleichwertiger Ausdrücke Ein weiteres Problem, das sich gelegentlich stellt, ist der Vergleich von Ergebnissen, die für dieselbe Aufgabenstellung auf unterschiedlichen Wegen erzielt wurden und vollkommen unterschiedliches Aussehen haben. Wir sind mit dieser Frage bereits bei der obigen Integrationsaufgabe konfrontiert worden, wo der Vergleich mit s1 == s2 == FullSimplify versucht wurde. Mathematica hat dabei die Aufgabe von sich aus sofort in die Untersuchung von s1 s2 == 0 Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Die Simplifikationsproblematik 329 transformiert, wie Sie an der Ausgabe sehen, da es wesentlich einfacher ist, einen Nulltest auszuführen, als die Ausdrücke direkt zu vergleichen. Die Aufgabe, zu entscheiden, ob ein gegebener Ausdruck zum Nullausdruck mathematisch gleichwertig ist, bezeichnet man als die Simplifikationsproblematik. Ihre algorithmische Lösung war Gegenstand des 10. Hilbertschen Problems. Seit den Arbeiten von Matijasevich und Roberts Ende der 60er Jahre weiß man, dass diese Aufgabe zu den algorithmisch unlösbaren gehört, d.h. es gibt keinen Algorithmus, der in der Lage ist, in einer genügend reichhaltigen Klasse von Ausdrücken alle zu Null äquivalenten zu identifizieren. Mathematica und damit auch der fortgeschrittene Nutzer bewegen sich beim Vereinfachen von Ausdrücken also häufig hart an der Grenze zur prinzipiellen algorithmischen Unentscheidbarkeit, womit Ihr Können gefordert ist, am Aussehen konkreter Ausdrücke zu erkennen, welche speziellen Arten von Vereinfachungen zur Anwendung zu bringen sind, die sicher und laufzeitfreundlich zum Ergebnis führen. Umformungen und mathematische Exaktheit. Zusatzannahmen Mathematica kennt eine Menge von Umformungen und führt einige besonders elementare auch automatisch aus. Sqrt x 2; Exp 3 Log x ; Tan ArcSin x [ ] [ ; 3; p x x x = [ [ [ [ ]] n ]; [ ; [ x ArcTan[Tan[x]] Log[e ] [ ]] ; ]] p x2 o 2 1.5 1 0.5 ]]; [ [ ArcTan Tan x ; Log Exp x ; Sqrt x2 == FullSimplify Beginnen wir mit einem Plot des ersten Terms. f ArcTan Tan x Plot f ; fx; 5; 5g; PlotRange ! f 2; 2g ]] x2 1 Umso mehr werden Sie verwundert sein, dass diese drei Ausdrücke so simplifikationsresistent sind und nicht jeweils einfach zu x umgeformt werden. [ 4 2 0.5 1 1.5 2 2 4 Mathematica hatte also Recht, nicht ganz so sorglos zu vereinfachen wie vorgeschlagen, denn ArcTan ist nur im Monotonieintervall 2 < x < 2 die Umkehrfunktion von Tan. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 330 14 Umformung und Vereinfachung mathematischer Ausdrücke Für spezielle Argumente weiß Mathematica durchaus den korrekten Wert. Beachten Sie auch unser Vorgehen: f ist eine Variable für den symbolischen Ausdruck und keine Funktion. x wird durch lokale Substitution ein Wert zugewiesen. Die Vereinfachung ist also nur für reelle x zwischen 2 und 2 korrekt. Solche Intervalle können Sie Simplify und FullSimplify als zweiten Parameter übergeben. Nun wird die Vereinfachung vorgenommen. f =: x ! 125 2 5 Simplify f ; 1 < x < 1 [ ] x Als solche Zusatzannahmen (Assumptions) können beliebige boolesche Ausdrücke angegeben (x < 1) interpretiert. werden. Die Ungleichungskette 1 < x < 1 wird dabei als ( 1 < x) Variablen, die in solchen Ungleichungen auftreten, werden außerdem automatisch als reellwertig angenommen. ^ Für den zweiten Ausdruck trifft das Argument mit dem eingeschränkten Definitionsbereich der Umkehrfunktion aber nicht zu, denn Exp ist monoton wachsend auf ganz . 40 20 R 40 f Log Exp x Plot f ; fx; 50; 50g = [ [ ]]; [ 20 20 40 20 ]; 40 Hier wirkt sich aus, dass Mathematica von allen Variablen standardmäßig voraussetzt, dass sie Werte aus annehmen können. Im Bereich der komplexen Zahlen ist aber x = Log[y ] als Im[x] < 2 I ) der Lösungen von y = ex definiert, die nur bis auf einen Hauptwert (d.h. 0 Summanden k 2 I eindeutig bestimmt sind. C Für x = 10 I berechnet Mathematica diesen Hauptwert korrekt. f =: x ! 10I i i 10 4 Seit der Mathematica-Version 4 gibt es die Möglichkeit, die Bereichszugehörigkeit von Variablen über den Domain-Operator (Eingabe Esc elem Esc ) zu testen oder anzugeben. Mathematica kennt folgende Bereiche: 2 Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Die Simplifikationsproblematik Complexes Reals Algebraics Rationals Integers Primes Booleans 331 C R Q Z Bereich der komplexen Zahlen Bereich der reellen Zahlen Bereich der algebraischen Zahlen Bereich der rationalen Zahlen Bereich der ganzen Zahlen Bereich der Primzahlen Boolean-Bereich True; False f g Eine solche Bereichsangabe kann auch im Simplify-Kommando verwendet werden. Sie lässt sich mit anderen booleschen Ausdrücken kombinieren. Hier wird geprüft, ob 149 eine Primzahl ist. Mathematica vereinfacht den Ausdruck automatisch. Mit diesem Kommando wird unser LogAusdruck wie erwartet vereinfacht. 149 2 Primes True Simplify f ; x 2 Reals [ ] x 2 f Sqrt x2 Bleibt noch der dritte Term. Wird hier x Reals angenommen, so erfolgt auch eine Vereinfachung, allerdings zur mathematisch korrekten Antwort x statt x. jj = ; Simplify f ; x 2 Reals [ ] Abs[x] Zwei weitere simplifikationsresistente Ausdrücke, die Ihnen vielleicht schon auf Seite 288 aufgefallen sind, sollen noch Erwähnung finden: Der erste berührt das Zusammenfassen von Produkten von Wurzeln zu einem gemeinsamen Radikanden. Das verweigert Mathematica ziemlich konsequent. Der Grund wird offensichtlich, wenn Sie x = y = 1 einset1 1 = I I = 1, aber zen: p Es gilt ( 1)( 1) = 1 = +1. p p p Der Ausdruck vereinfacht nur dann zu 0, wenn einer der beiden Radikanden eine positive reelle Zahl ist. Addison-Wesley Verlag w1 pxpy px y == Simplify = p p x y p xy w1 =: ffx ! 1; y ! 1g; fx ! 1; y ! 1gg f; g 0 2 Simplify w1; x > 0 [ ] 0 Kofler, Gräbe: Mathematica http://www.kofler.cc 332 14 Umformung und Vereinfachung mathematischer Ausdrücke r w2 p1x Ähnliche Sorgen bereiten Kehrwerte von Wurzeln. Auch hier wird die Vereinfachung verweigert, weil sie für negative reelle Zahlen zu falschen Ergebnissen führt. Für x = 1 ist die linke Seite gleich 1I = I , die rechte dagegen gleich 1 = +I . = r 1 p + x 1 x == Simplify p 1 x w2 =: ffx ! 1g; fx ! 1gg f ; ig 0 2 Der Grund für dieses Verhalten liegt in der Natur der Wurzelfunktion für komplexe Zahlen, die (wie übrigens auch Log und ArcTan) eigentlich mehrwertig ist. w2 =: x ! 1 0:001I == Chop Die Definition der komplexen Wurzelfunktion in Mathematica scheint nicht allzu konsistent zu sein, denn das Hinzufügen eines winzigen Imaginärteils zu 1 ändert die Antwort grundlegend. + 0 Limit w2 =: fx ! 1 a Ig; a ! 0 Sogar der entsprechende Grenzwert, wenn sich x der reellen Achse annähert, ist gleich 0. [ + ] 0 Das ist allerdings kein Defizit, sondern mathematisch notwendig, denn solche mehrwertigen Funktionen sind längs Ihres ‘branch cuts’ nicht stetig. Weitere Erläuterungen dazu finden Sie im Abschnitt 3.2.7 des Mathematica-Handbuchs. l Log 1 x Log 1 2x Log 1 x l =: x ! 2 i Simplify l; x > 1 Auch die Simplifikationsresistenz des LogAusdrucks auf Seite 327 wird nun klarer. 1 vereinfacht er nicht zu Null, Für x < weil die entsprechenden Zweige der LogFunktion nicht zusammenpassen. Die Beziehung stimmt nur für x > 1. = [ + ] + [ + + ] ; 2 [ ] 0 Eigene Umformungsregeln vereinbaren Wenn Mathematica sich konsequent weigert, Vereinfachungen vorzunehmen, dann können Sie es immer noch mit gut gesetzten Regeln dazu überreden. Die Zutaten dafür, Muster und den Rule-Operator , kennen Sie ja schon. Das folgende System aus zwei Regeln fasst Wurzelausdrücke zusammen: r ! sqrtRules = px py ! px y; 1 ! py Addison-Wesley Verlag 1 y ; Kofler, Gräbe: Mathematica http://www.kofler.cc Polynomiale, rationale und pseudorationale Ausdrücke 333 Angewendet wird es auf einen Ausdruck mit dem Operator =: (ReplaceAll, einmalige Anwendung der Regeln) oder ==: (ReplaceRepeated, Anwendung so oft wie möglich). In unserem Fall vereinfacht es nicht nur Produkte und Kehrwerte, sondern auch Quotienten von Wurzeln, da A Mathematica-intern ja als Times[A; Power[B; 1]] dargestellt werden, also aus eiQuotienten B nem Produkt und einem Kehrwert zusammengesetzt sind. (Aus dem Grund reicht auch =: zur Vereinfachung nicht aus.) Die Kenntnis von derartigen Interna ist besonders für das Aufstellen solcher Regelsysteme erforderlich. Im Zusammenhang mit trigonometrischen Ausdrücken kommen wir darauf ab Seite 347 zurück. ( r p r ) pxpy px y; p1 x 1 x x ; py x y ==: sqrtRules f; ; g 0 0 0 Denselben Effekt können Sie in diesem Fall allerdings auch mit dem Kommando PowerExpand erreichen. Auch damit werden die Wurzelausdrücke zu Null vereinfacht. Genauer gesagt bewirkt Powerexpand das Gegenteil der angegebene Regeln – es expandiert (u.a.) Wurzeln von Produkten und Quotienten in Produkte und Quotienten von Wurzeln. Beachten Sie also, dass die Anwendung von PowerExpand zu inkorrekten Ergebnissen führen kann, denn Sie haben gerade gesehen, dass solche Umformungen nicht immer mathematisch exakt sind! Polynomiale, rationale und pseudorationale Ausdrücke Für Polynome und rationale Funktionen lässt sich die Simplifikationsproblematik besonders einfach entscheiden: Sie müssen nur alles ausmultiplizieren bzw. auf einen gemeinsamen Hauptnenner bringen und dann gleichartige Summanden (des Zählers) zusammenfassen. Wenn sich dabei alle Terme wegheben, ist der untersuchte Ausdruck gleich 0, sonst nicht. Wenn Sie die Summanden geeignet ordnen, dann ist das polynomiale Ergebnis im zweiten Fall sogar die rationale Normalform, d.h. zwei Ergebnisse, die verschieden aussehen, sind auch mathematisch verschieden. Ausdrücke mit polynomialer bzw. rationaler Struktur spielen deshalb für Mathematica eine wichtige Rolle, wobei die Definition der ‘Variablen’ nicht so eng gesehen wird und dafür auch y ] (so genannte ‘verallgemeinerte Kerne’) Funktionsausdrücke wie Sin[a + b] oder Cos[x zulässig sind. Solche Ausdrücke werden als pseudorational bezeichnet. Natürlich gehen Beziehungen zwischen den verallgemeinerten Kernen solcher pseudorationaler Ausdrücke in deren rationale Vereinfachung nicht ein. Sie können also in diesem Fall nicht schließen, dass ein Ausdruck, in dem sich nicht alle Terme weggekürzt haben, auch mathematisch verschieden von Null ist. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 334 14 Umformung und Vereinfachung mathematischer Ausdrücke Die entsprechenden Kommandos, mit denen die genannten polynomialen bzw. rationalen Vereinfachungen vorgenommen werden können, lauten Expand und Together. Sie sollten in Ihrem Repertoire gleich nach Simplify einen zentralen Platz einnehmen. Expansion von Produkten Die Funktion von Expand ist am nebenstehenden Beispiel leicht zu erkennen: Das Kommando löst einfach alle Klammern auf. x x a2x b3 ( ) ( ) 2 x ( a + x) Expand 2 a 3 2 b 2 3 2 x 3 + 2 a b 3 4 + 3 b x 3 b 2 a x x 5 3 2 x 2 [( + a b (a + b) )( 2 b (a + b) 2 + )( + 2 + a (a + b) ) 3 b x 2 2 + ] 2 x 2 a (a + b) ( 2 + b (a + b) x 2 x Expand Sin x Cos x 3 6 + x ] a b (a + b) Cos[x] x + 5 x+ 2 x + (a + b) Collect ; x [% 4 + a Expand x a x b a b 2; x [ ] + [ 2 + 3 Cos[x] 2 3 Cos[x] Sin[x] 3 ]) Sin[x]+ + Sin[x] 3 3 Expand xx 11 4 ( + ( 1 ( ) ) 4 3 x + 1 + x) ( ( 3 4 1 + x) Kofler, Gräbe: Mathematica 4+ 1 + x) 2 3 x Addison-Wesley Verlag x 6 a b +(a + b) Bei Brüchen wirkt Expand nur auf den Zähler. (Das reicht für rationale Normalformen auch aus.) Mit Together können Sie das Ergebnis auf einen gemeinsamen Hauptnenner bringen. 2 b 2 b x 6 a b x Expand wirkt auf diesen pseudorationalen Ausdruck, als ob es sich um das Polynom (A + B )3 mit A = Sin[x]; B = Cos[x] handelt. Die Beziehung Sin[x]2 +Cos[x]2 = 1 wird nicht berücksichtigt. 2 x+ 3 a 4 Mit Collect können Sie die Koeffizienten vor den einzelnen Potenzen von x zusammenfassen. b + x) [%] 3 a Im optionalen zweiten Parameter kann ein Muster angegeben werden. Faktoren, in denen dieses Muster (hier einfach die Variable x) nicht vorkommt, bleiben von Expand unberührt. Die Wirkung dieses Kommandos ist also eine Expansion nur nach der Variablen x. 3 ( x + ( 4 1 + x) http://www.kofler.cc Polynomiale, rationale und pseudorationale Ausdrücke ExpandAll wird dagegen auf alle Teilausdrücke angewendet. 335 3 ExpandAll xx 11 4 ==Together ( + ) ( ) 2 3 1 + 3 x+ 3 x 4 x + 6 x2 1 Falls Sie nur den Nenner ausmultiplizieren möchten – ExpandDenominator macht’s möglich! + x 4 x3 + x4 3 ExpandDenominator xx 11 4 ( + ( ) ) 3 (x + 1) 1 Die nebenstehenden Beispiele demonstrieren nochmals den Unterschied zwischen Expand und ExpandAll. Während im ersten Beispiel 2 der Kern A = Sin[(x + 1) ] unverändert bleibt, wird im zweiten Beispiel auch das Innere des Kerns expandiert. 4 x +6 2 x 3 4 x 4 + x Expand Sin x 1 2 1 2 [( [( + ) ] + ) ] 2 2 2 1 + 2 Sin[(1 + x) ] + Sin[(1 + x) ] ExpandAll Sin x 1 2 1 2 [( [( + ) ] + ) ] 2 2 2 1 + 2 Sin[1 + 2 x + x ] + Sin[1 + 2 x + x ] Andere Expand-Kommandos Die folgenden Kommandos haben nichts mit rationalen Funktionen zu tun, sondern ‘expandieren’ Ausdrücke in anderen Bedeutungen dieses Wortes. Sie sind hier der Vollständigkeit halber kurz aufgeführt. Potenzen vereinfachen (PowerExpand) PowerExpand vereinfacht Wurzeln und Potenzen. Diese Umformungen sind nicht immer mathematisch exakt (etwa gilt n2 = n nur für n 0) und deshalb mit Vorsicht zu verwenden. Auf Seite 331 ist dieses Thema genauer besprochen. p PowerExpandSinpn2 t Sin[n t] PowerExpand a b c [( a c ) ] c b PowerExpand expandiert Produkte und Quotienten, die im ersten Argument von Power vorkommen, in Produkte und Quotienten von Potenzen bzw. Wurzeln. Für die dazu inverse Umformung kennt Mathematica kein Kommando. Hierfür müssen Sie das auf Seite 332 beschriebene Regelsystem einsetzen. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 336 14 Umformung und Vereinfachung mathematischer Ausdrücke Komplexe Ausdrücke vereinfachen (ComplexExpand) ComplexExpand Sin a b I ComplexExpand vereinfacht Ausdrücke, in denen Real- und Imaginärteil durch separate Variablen ausgedrückt sind. [ [ + ]] Cosh[b] Sin[a] + I Cos[a] Sinh[b] Die Vereinfachung wird unter der Annahme vorgenommen, dass alle vorkommenden Variablen reelle Zahlen sind. Weitere Beispiele finden Sie im Kapitel 12 auf Seite 266. Logische Ausdrücke vereinfachen (LogicalExpand) LogicalExpand Xor a; b jj Implies a; b Das Kommando LogicalExpand vereinfacht logische Ausdrücke nach den Regeln der booleschen Algebra. Im zweiten Ausdruck sind Xor und Implies mit ihren Operatoren angeschrieben. Die Klammern sind erforderlich, um die Terme richtig zu gruppieren. [ [ ] [ ]] True LogicalExpand a_b ^ a ) b [( b ) ( )] && !a Argumente trigonometrischer Ausdrücke vereinfachen (TrigExpand) TrigExpand Cos TrigExpand wendet Additionstheoreme an, um trigonometrische oder Hyperbelfunktionen mit zusammengesetzten Argumenten (Winkelsummen, Mehrfachwinkel) in solche mit einfachen Argumenten zu verwandeln. [ [ ]Cos[ ] Cos[ + Sin[ ]] ]Sin[ ] Weitere Kommandos zur Bearbeitung trigonometrischer Ausdrücke werden auf Seite 343 vorgestellt. Ausdrücke nach Variablen zusammenfassen (Collect) Mathematica ordnet die Einzelterme eines Ausdrucks (egal ob Summe oder Produkt) nach einer intern festgelegten Ordnung, so dass Sie keinen Einfluss auf diese Ausgabe haben. (Das gilt generell für Funktionssymbole mit dem Attribut Orderless.) h i f Expand a x2y b y 2 x 2y c y2 2 x3 x4y2 = + 2 a + x 2 x 4 2 y 3 + x 2 + 3 2 + c Addison-Wesley Verlag + 2 + 2 a by 4 c y + 4 x y +2 a x y y + 4 y + 2 2 +b + y 2 + 2 c x y 2 + 2 b x 2 2 y + 4 Kofler, Gräbe: Mathematica http://www.kofler.cc Polynomiale, rationale und pseudorationale Ausdrücke 337 Mit Collect können Sie in einem Ausdruck die Terme zur gleichen Potenz einer Variablen, etwa x, zusammenfassen. Collect f ; x [ 2 a ] + x x 3 + 2 a by + 4 y 4 y + 2 c y 2 +b 2 2 y 2 + 2 x 4 y 2 4 c y 3 2 + c y 4 2 + x 1 + 2 a y + 2 b y 2 + Allerdings sind diese Terme nicht unbedingt nach x-Potenzen geordnet, da die interne Ordnung in den meisten Fällen zuerst nach der ‘Kompliziertheit’ (Depth) der Terme geht. Depth = List @ @@ % f; ; ; ; ; ; ; ; ; g 2 2 2 3 3 3 3 3 5 5 Terme mit Klammern haben also eine gute Chance, weiter hinten zu stehen als Einzelterme (wie im ersten Beispiel x3 oder 2x4 y 2 , die unter den x-freien Termen untergehen). Allerdings ist das nicht immer so, wie das folgende Beispiel zeigt. Collect f ; y [ 2 a + x 2 ] 3 + x Depth = List @ + 2 a b 4 x+ 2 a x 2 y + 2 4 + b 2 + 2 c x+ 2 b x 4 + 2 x y 2 4 c y 3 +c 2 y 4 @@ % f; ; ; ; ; ; g 2 2 2 5 5 3 3 Weitere Details zu dieser inneren Ordnung finden Sie im Abschnitt A.3.9 des MathematicaHandbuchs. Doch kommen wir zum Kommando Collect zurück. Detailliertere Informationen, insbesondere Zugriff auf die einzelnen Koeffizienten einer solchen Zerlegung, erhalten Sie mit den Funktionen CoefficientList bzw. Coefficient. Das erste Kommando gibt die Liste aller Koeffizienten nach wachsender x-Potenz geordnet zurück, das zweite kann zum Herauslösen einzelner Koeffizienten verwendet werden. CoeÆcientList f ; x [ a 2 ] + 2 a b y+ 4 y CoeÆcient f ; x2 1 + 2 a y + 2 b y 2 2 + b oder y 2 4 c y 3 2 + c y 4 ; 4 y + 2 c y 2 ; 1 + 2 a y + 2 b y2 ; 1; 2 y2 CoeÆcient f ; x; 2 [ ] 2 Coefficient[f; y n ] und Coefficient[f; y; n] sind für n > 0 zueinander äquivalent. Für n = 0 klappt das erste Kommando nicht. (Grund: y 0 wird zu 1 vereinfacht und eine solche Variable gibt es nicht.) Hier werden die Koeffizienten der Potenzen y 0 ; y 1 und y 2 von f aufgesammelt. (Coefficient ist natürlich auch Listable, deshalb wird das Kommando über die Liste im dritten Argument distribuiert.) Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 338 14 Umformung und Vereinfachung mathematischer Ausdrücke CoeÆcient f ; y; f0; 1; 2g [ 2 a 2 + x 3 + x ;2 a b ] 4 x + 2 a x ; 4 + b2 + 2 c x + 2 b x2 + 2 x4 2 Der zweite Parameter von Collect kann eine Liste sein. In diesem Fall wird nach allen angegebenen Variablen gruppiert. Beachten Sie den Unterschied in der Ausgabe zwischen dem ersten und dem zweiten Beispiel. Im ersten Beispiel ist f nach a und die Koeffizienten nach y geordnet, im zweiten Beispiel ist es umgekehrt. Collect f ; fa; yg [ 2 a + x ] 2 +x 3 2 4 x y+ a 2 b+ 2 x Collect f ; fy; ag [ 2 ] 2 a + x +x 3 + 4 x+ a 2 b +2 x y+ 2 2 2 4 +b + 2 c x + 2 b x 2 y + 4 + b + 2 x 2 + 2 c x + 2 b x 4 y 2 4 + 2 x 4 c y y 2 [ 2 + c 4 c y CoeÆcientList f ; fx; yg Auch CoefficientList und Coefficient können verwendet werden, um Koeffizenten multivariater Terme zu extrahieren. Das erste Kommando extrahiert eine Liste von Listen der Koeffizienten, das zweite einen Koeffizienten zu einem speziellen Term. 3 3 y 4 2 + c y 4 ] ; 2 a b; 4 + b ; 4 c; c2 ; f0; 4; 2 c; 0; 0g; f1; 2 a; 2 b; 0; 0g; f1; 0; 0; 0; 0g; f0; 0; 2; 0; 0g a 2 2 CoeÆcient f ; x2 y 2 a An Collect kann eine ’pure function’ übergeben werden, die auf alle gefundenen Gruppen angewendet wird. Besonders geeignet sind Funktionen, die diese Gruppe weiter vereinfachen. Collect f ; x; Simplify [ 2 a + x 3 ] 4 + 2 a by + 2 x y 2 + 2 x y ( 2 2 + c y) + x 1 + 2 a y+ 2 by 2 +y 2 2 b + ( 2 2 + c y) Collect kommt nicht nur mit einzelnen Variablen, sondern auch mit Kernen wie Cos[x] zurecht. i h Expand Sin x Cos x 2 2 1 Cos x [ 1 ] 2 2 Cos[x] + Cos[x] Collect ; Cos x [% 1 [ [ ] +( [ 4 + Cos[x] ]) 2 2 2 Cos[x] Sin[x] + Sin[x] 2 ]] 4 2 Cos[x] + Cos[x] Addison-Wesley Verlag + Cos[x] 2 (1 2 2 Sin[x]) + Sin[x] Kofler, Gräbe: Mathematica http://www.kofler.cc Polynomiale, rationale und pseudorationale Ausdrücke 339 Faktorisierung von Summen Factor 1 4x 6x2 4x3 x4 Factor ist das Gegenstück zu Expand, soweit es das Ausmultiplizieren von Produkten anbelangt. Factor versucht, eine Summe von Einzeltermen in die Produktform zurückzuverwandeln. [ ( + + ] 4 1 + x) Factor x4 y4 [ ] 2 (x y) (x + y) (x 2 +y ) Factor funktioniert ebenfalls für pseudorationale Ausdrücke mit verallgemeinerten Kernen als Variablen. Im Ausdruck s1 werden vier solche Kerne (Cos[3 x]; Sin[3 x]; Cos[x] und Sin[x]) unterschieden – eine Faktorisierung ist nicht möglich. s1 Integrate Sin x 3 Cos x 3; x = [ 3 Cos[x] 4 + s1 == Factor 1 12 ( [ 1 ] + [ Cos[3 x] + 12 ] ] 3 Sin[x] 4 + 1 12 Sin[3 x] 9 Cos[x] + Cos[3 x] + 9 Sin[x] + Sin[3 x]) TrigExpand reduziert die Zahl der Kerne auf zwei (Cos[x] und Sin[x]). Nun kann ein Faktor abgespalten werden. s1 == TrigExpand 3 Cos[x] 4 % + == Factor 1 12 (Cos[x] Cos[x] 3 12 Sin[x]) + 3 Sin[x] 4 + 9 + Cos[x] 1 4 2 2 Cos[x] 1 Sin[x] 4 2 Cos[x] Sin[x] + 4 Cos[x] Sin[x] + Sin[x] 3 Sin[x] 12 2 Simplify kann auch noch den zweiten Faktor vereinfachen. % == Simplify 1 6 (Cos[x] Sin[x]) ( 4 + Sin[2 x]) Diese Umformungen bewirkt auch das Kommando TrigFactor, das versucht, einen trigonometrischen Ausdruck möglichst weitgehend in Faktoren zu zerlegen. Addison-Wesley Verlag s1 == TrigFactor 1 6 (Cos[x] Kofler, Gräbe: Mathematica Sin[x]) ( 4 + Sin[2 x]) http://www.kofler.cc 340 14 Umformung und Vereinfachung mathematischer Ausdrücke Im Gegensatz zu Expand wirkt Factor bei Brüchen gleichermaßen im Zähler und im Nenner. Factor bildet nur Terme mit ganzzahligen Koeffizienten und nicht ( 21 + x)( 12 + x), was hier ebenfalls korrekt wäre. Factor x x2 x 1 6 2+ ( 2 + x) (3 + x) ( 1 + x) (1 + x) Factorx2 14 1 4 Factor bildet normalerweise nur Terme mit rationalen Koeffizienten. Aus diesem Grund kann 1 + x2 nicht weiter vereinfacht werden. ! Mit der Option GaussianIntegers True I erreichen Sie, dass auch oder Extension komplexe Koeffizienten (genauer: Zahlen der Form a + b I mit a; b ) verwendet werden. ! 2Z Die Extension-Option können Sie auch für Produktzerlegungen über anderen Grundbereichserweiterungen verwenden. ! Extension Automatic bezieht alle in einem Ausdruck vorkommenden algebraischen Zahlen in den Grundbereich ein. ( 1 + 2 x) (1 + 2 x) Factor 1 x2 + 2 1 + x Factor 1 x2; GaussianIntegers ! True oder Factor 1 x2; Extension ! I i i + + ( + x) ( Factor x2 3x 1; Extension ! p5 + 1 3 + 4 p 5 + 2x 3 + p 5 + 2x Factorx2 2p2x 2; Extension ! Automatic + p 2 + x FactorTerms ist eine eingeschränkte Variante zu Factor. Das Kommando zieht lediglich einen gemeinsamen numerischen Faktor vor den Ausdruck. + x) + 2 2 2 f Expand 2 7 x 2x 3 3 f == FactorTerms ( = 1 21 (18 9 x ) ( 2 24 x ) 3 + 12 x ; 4 +8 x 5 4 x ) Arbeiten mit rationalen Funktionen Im Mittelpunkt dieses Abschnitts stehen Funktionen, mit denen rationale Ausdrücke weiterverarbeitet werden können. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Polynomiale, rationale und pseudorationale Ausdrücke 341 Brüche auf gemeinsamen Hauptnenner bringen Together bringt eine Summe von Brüchen auf einen gemeinsamen Nenner. Togetherx yz + y+ x z z Together x 1 3 x 1 1 x2 1 1 + + + 2 5 +5 x + 2 x ( Together funktioniert auch für pseudorationale Ausdrücke wie hier beim Zusammenfassen des Ergebnisses dieses Integrate-Kommandos. 1 + x) (1 + x) (3 + x) 3 Sin x Integrate 1 Cos x ; x [ ] + 2 Cos x 2 2 [ ] Cos[x] 1 + Cos[x] % Cos + x 2 2 2 Cos[2 x] 2 (1 + Cos[x]) == Together 4 Cos x 2 Cos[x] + Cos x 2 2 Cos[2 x] 2 (1 + Cos[x]) Simplify kann das Ergebnis allerdings noch weiter vereinfachen. % == Simplify 1 4 ( 4 Cos[x] + Cos[2 x]) Zähler und Nenner ermitteln Die Funktionen Numerator und Denominator ermitteln den Zähler und Nenner eines Bruchs. x 1 23 x 5 fNumerator f ; Denominator f g f = ( + ) ( [ ] f (1 + x) Die beiden Kommandos sind reine Selektoren und bilden nicht automatisch einen gemeinsamen Nenner. Dazu muss vorher gegebenenfalls Together verwendet werden. ; ) 3 ;( [ ] 2 5 + x) g Numerator 1 a xx2 bx + b x + a x x2 1 NumeratorTogether 1 a xx2 bx + b Addison-Wesley Verlag 2 a x Kofler, Gräbe: Mathematica 2 + b x http://www.kofler.cc 342 14 Umformung und Vereinfachung mathematischer Ausdrücke Brüche kürzen Cancel kürzt Brüche, d.h. dividiert aus dem Zähler und dem Nenner eines Bruches den größten gemeinsamen Teiler aus. Das Kommando funktioniert auch für pseudorationale Funktionen, allerdings nur bzgl. der dabei vorgefundenen rationalen Struktur. Brüche werden zwar meist auch von Simplify gekürzt, aber der Vorteil von Cancel besteht darin, dass es wirklich kürzt und nur kürzt. Hier wird der Unterschied deutlich: Da der gekürzte Bruch (etwas) komplizierter ist als der ungekürzte, lässt Simplify das Kürzen sein. 8x x2 x3 Cancel 12 18 3x 4x2 x3 + + + 2 + x 3 + x f 1 x36 f == Simplify x 1 ; = ( ) 1 (x 3 x 6 1) f == Cancel 1 ( x x 2 5 1 + x) Partialbruchzerlegung Apart berechnet die Partialbruchzerlegung eines rationalen oder pseudorationalen Ausdrucks, d.h. zerlegt ihn in die Summe von Brüchen mit möglichst einfachen Nennern. Apart x4 x 1 1 4 ( + 1 + x) 1 x 4 (1 + x) 2 (1 + x ) 2 Solche Zerlegungen spielen etwa beim Integrieren rationaler Funktionen eine wichtige Rolle. Beachten Sie, dass dabei exakt gerechnet wird und Mathematica deshalb den Nenner nur in Faktoren über zerlegt, nicht aber in komplexe Linearfaktoren oder reelle lineare und quadratische Faktoren, wie es gewöhnlich in der Mathematik-Ausbildung gelehrt wird. Soviel zum Unterschied zwischen theoretischer und algorithmischer Mathematik! Q Enthält ein Ausdruck mehrere Variablen, so können Sie angeben, nach welcher Variablen die Zerlegung durchgeführt werden soll. Alle anderen Variablen werden dann als (konstante) Parameter betrachtet. Es kann aber nur eine Variable angegeben werden, denn Apart ist Listable und wird deshalb in diesem Beispiel über die Liste der Parameter im zweiten Argument distribuiert. Addison-Wesley Verlag Apart x x yy 2 ; x ( y x y ) y + 2 2 (x y) Apart x x yy 2 ; fx; yg ( ) y x y y + Kofler, Gräbe: Mathematica (x 2 2 y) ; 2 x ( 2 x + y) + x x+ y http://www.kofler.cc Trigonometrische Ausdrücke 343 Trigonometrische Ausdrücke Eine besondere Fülle von Beziehungen gibt es zwischen den trigonometrischen Funktionen, so dass Sie leicht die Orientierung verlieren können, wenn keine klaren Zielvorstellungen Ihre Umformungen begleiten. Ein erster Ansatz könnte sein, die Zahl der verschiedenen Funktionen Sin bzw. Cos ersetzt werden. in einem Ausdruck zu reduzieren, indem Tan und Cot durch Cos Sin Das ist mit Mathematica leider nicht möglich. Obwohl sonst nur selten ungefragt Umformungen vorgenommen werden – was ja auch gut so ist –, kennt Mathematica bei den Winkelfunktionen kein Halten und macht die genannten Ersetzungen immer sofort rückgängig. Sin x ; 1 ; Cos x ; 1 Cos x Cos x Sin x Sin x f [ ] [ ] [ ] [ ] [ ] [ ] ; Sec[x]; Cot[x]; Csc[x]g Tan[x] Wir wollen deshalb zwei Zielvorstellungen für trigonometrische Umformungen, die einleuchtend und einfach sind, zunächst theoretisch erörtern, auch wenn sie aus den eben genannten Gründen in keinem der weiter unten vorgestellten Mathematica-Kommandos in dieser reinen Form ausgeführt werden. Sie können sich in einem solchen Fall allerdings behelfen, indem Sie ein Regelsystem entwerfen, das genau diese Umformungen bewirkt. Nach einem Überblick über die entsprechenden Mathematica-Kommandos werden wir gemeinsam ab Seite 347 ein solches Regelsystem entwickeln. Wenn Sie nur an den Kommandos interessiert sind, dann können Sie diese beiden Abschnitte überschlagen. Eine dritte Strategie hilft in verzwickten Situationen manchmal ebenfalls weiter: Die Anwendung der Formeln ix Sin[x] = e e 2i ix und ix Cos[x] = e + e 2 ix ; mit denen trigonometrische Formeln in die (komplexe) Exponentialschreibweise umgeformt werden können. Der Erfolg dieses Zugangs liegt darin begründet, dass Mathematica mit solchen Power-Ausdrücken wesentlich besser rechnen kann als mit den trigonometrischen Funktionen selbst. Die entsprechenden Umformungen können mit den Kommandos TrigToExp (Umwandlung in die Exponentialschreibweise) und ExpToTrig (Rückumwandlung) vorgenommen werden. Sin x Cot x == TrigToExp ix ix i i x i i x ii x i x iix i x == Simplify i i ix i ix i 2ix i 3ix [ 1 2 ] + [ ] 1 e 2 e e e e e e e % 2 e +2 e +2 2ix e e 2 + 2 e Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 344 % 14 Umformung und Vereinfachung mathematischer Ausdrücke == ExpToTrig (2 i i + Cos[x] + 2 i Cos[2 x] ( i Cos[3 x] i 3 Sin[x] 2 + 2 Cos[2 x] + 2 2 Sin[2 x] + Sin[3 x]) Sin[2 x]) Allerdings bedarf es oft einiger Kunstfertigkeit, die dabei entstehenden Ergebnisse richtig zu interpretieren. Sie sehen an diesem Beispiel noch einmal, dass Simplify durchaus nicht immer die einfachste Darstellung findet. % == Simplify 1 2 ( 1 2 Cos[x] + Cos[2 x]) Csc[x] Sin x == Simplify % [ ] Cot[x] Wie vereinfacht man trigonometrische Ausdrücke? Dieser Abschnitt ist fakultativ, für ein besseres Verständnis der Problematik aber zu empfehlen. Um trigonometrische Ausdrücke zu vereinfachen, sollten zunächst die sechs bekannten trigonometrischen Funktionen (Sin, Cos, Tan, Cot, Sec, Csc) auf zwei von ihnen (Sin, Cos) reduziert werden. Das ist, wie oben erläutert, mit Mathematica leider grundsätzlich nicht möglich, aber wir wollen hier davon ausgehen, dass diese Umformungen ausgeführt wurden und (oder gar nicht notwendig waren, weil) ein pseudorationaler Ausdruck vorliegt, in dessen Kernen nur Sin- und Cos-Funktionen vorkommen. Die folgenden beiden Additionstheoreme sind für die weiteren Ausführungen zentral: ( SP Regeln ( ) Sin[x + y ] = Sin[x] Cos[y ] + Cos[x] Sin[y ] Cos[x + y ] = Cos[x] Cos[y ] Sin[x] Sin[y ] Sie können umgestellt werden in die Form ( PS Regeln ) 8 > < > : Sin[x] Sin[y ] = Sin[x] Cos[y ] = Cos[x] Cos[y ] = x y ] Cos[x + y ]) x + y ] + Sin[x y ]) x y ] + Cos[x + y ]) 1 2 (Cos[ 1 2 (Sin[ 1 (Cos[ 2 Die SP-Regeln (SP steht für Summe-Produkt) sind geeignet, Winkelfunktionen mit Mehrfachargumenten, also Terme wie Sin[3 x + y ] oder Cos[5 x], in polynomiale Ausdrücke zu verwandeln, in denen nur noch Sin[x]; Sin[y ]; Cos[x]; Cos[y ] als Kerne vorkommen. (Sin[3 x] etwa kann als Sin[2 x + x] geschrieben werden, woraus sich nach zweimaligem Anwenden der SP-Regeln die bekannte Formel Sin[3 x] = 3 Sin[x] 4 Sin[x]3 ergibt.) Auf diese Weise kann die Zahl der verschiedenen Kerne in einem pseudorationalen trigonometrischen Ausdruck deutlich reduziert werden. Kommen etwa nur Winkelfunktionen der Form Sin[n x] und Cos[n x] für verschiedene n vor, so lässt sich der Ausdruck durch mehrfaches Anwenden der SP-Regeln so umschreiben, dass nur noch Sin[x] und Cos[x] als Kerne vorkommen. Wenden Sie schließlich noch die Beziehung Sin[x]2 = 1 Cos[x]2 (oder umgekehrt) an, 2N Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Trigonometrische Ausdrücke 345 dann haben Sie den Ausdruck schon in eine kanonische Form gebracht. Wenn sich dabei nicht alle Terme weggehoben haben, dann ist der untersuchte Ausdruck auch wirklich verschieden von Null, d.h. das Simplifikationsproblem für solche trigonometrischen Ausdrücke ist damit gelöst – kurz, ein effizientes und laufzeitfreundliches Simplifikationsverfahren. Ähnlich gute, wenn auch nicht ganz so offensichtliche Eigenschaften haben die PS-Regeln (PS steht für Produkt-Summe). Sie sind so etwas wie das Gegenstück zu den SP-Regeln, denn sie verwandeln Produkte und Potenzen von Winkelfunktionen mit einfachen Argumenten in Linearkombinationen von Winkelfunktionen mit Mehrfachwinkelargumenten. In der Tat: Ersetzen Sie in einem Produkt von Winkelfunktionen zwei Faktoren nach der PS-Regel, so entstehen zwei Produkte mit je einem Faktor weniger. Mehrfache Anwendung der SP-Regeln löst also nach endlich vielen Schritten alle Produkte auf. Die Einfachheit dieser Darstellung beruht auf ihrer Linearität, womit sie besonders fürs Integrieren und Differenzieren gut geeignet ist. Sie ist ebenfalls eine (effizient und laufzeitfreundlich berechenbare) kanonische Form, wenigstens für pseudopolynomiale trigonometrische Ausdrücke. Aus diesen Überlegungen ergeben sich zwei zueinander inverse Simplifikationsstrategien für trigonometrische Ausdrücke: Mit den SP-Regeln Mehrfachwinkelargumente zugunsten von Produkten aufzulösen oder mit den PS-Regeln Produkte zugunsten von Mehrfachwinkelargumenten aufzulösen. Die erste Strategie verfolgt in etwa TrigExpand, die zweite TrigReduce. Mathematica-Kommandos zur Umformung trigonometrischer Funktionen Mathematica hält einige Kommandos speziell für die Umformung von Ausdrücken mit trigonometrischen Funktionen bereit. Obwohl keines von ihnen die im letzten Abschnitt beschriebenen Umformungen punktgenau ausführt, erlauben sie immer noch – insbesondere im Vergleich zu Simplify und FullSimplify – eine sehr viel gezieltere Vorgehensweise. TrigExpand versucht (nach den SP-Regeln), Summen und Vielfache in den Argumenten der trigonometrischen Funktionen aufzulösen. Dabei erhöht sich der polynomiale Grad der umgeformten Ausdrücke. TrigExpand Cos [ ] Cos[ ] Cos[ TrigExpand Cos p Addison-Wesley Verlag 2 ]] + ] Sin[ ] ii 2x + Sin[ h Cos[x] Für polynomiale Ausdrücke in Sin und Cos ist das Ergebnis von TrigExpand meist noch vorhersagbar. [ h 4 p 2 Cos[x] Sin[x] 2 TrigExpand Cos 4x [ 4 Cos[x] Kofler, Gräbe: Mathematica [ 2 2 ]] 2 6 Cos[x] p Sin[x] 2 Sin[x] 4 + Sin[x] http://www.kofler.cc 346 14 Umformung und Vereinfachung mathematischer Ausdrücke Sind noch andere Winkelfunktionen mit im Spiel, dann wird die von Mathematica verfolgte Strategie undurchsichtig. Hier zum Beispiel wäre eigentlich gar nichts zu expandieren. TrigExpand Sin x 2 Cot x 2 [ 2 3 Cos[x] 4 Einige offensichtliche Faktorisierungen werden dabei aber übersehen. Eine deutlich weitergehende Funktionalität als Factor[: : : ; Trig True] bietet TrigFactor. Das Kommando versucht verschiedene trigonometrische Umformungen, um dabei eine solche Darstellung zu finden, die sich so weit wie möglich in Faktoren zerlegen lässt. Cos[2x] wird nun zerlegt. ! Allerdings kann man Cos[3x] noch weiter zerlegen, wie die nebenstehende Rechnung zeigt. Die Ergebnisse von TrigFactor sind also nicht so aussagekräftig wie die von Factor für Polynome. 8 ] + Cos[x] [ 2 ] ] 2 Cot[x] + 2 Sin[x] + 8 TrigReduce 2Cos Cos [ [ ] [ ]] ] + Cos[ + ] Cos[ TrigReduce Sin x 5 [ 1 16 Die bereits vorgestellten Kommandos Factor und Cancel berücksichtigen zusätzliche Umformungsregeln, wenn Sie die Option Trig verwenden. Einfache zusätzliche Faktorisierungen bzw. Faktoren werden dabei gewöhnlich entdeckt. 1 + 2 7 Csc[x] 8 TrigReduce wirkt genau in die umgekehrte Richtung: Es versucht, Produkte und Potenzen trigonometrischer Funktionen in Linearkombinationen aufzulösen, und nimmt dafür komplexere Funktionsargumente in Kauf. [ (10 Sin[x] ] 5 Sin[3 x] + Sin[5 x]) Factor Cos 3x ; Trig ! True [ [ Cos[x] ( ] ] 1 + 2 Cos[2 x]) Cos 2 ; Trig ! True Cancel 1 Sin [ [ ] ] ] 2 Sin[ Factor Cos 2x ; Trig ! True [ [ ] ] Cos[2 x] TrigFactor Cos 2x [ (Cos[x] [ ]] Sin[x]) (Cos[x] + Sin[x]) TrigFactor Cos 3x [ Cos[x] ( [ 1 + 2 Cos[2 x]) i h ]] h 4Cos x 3 Cos x 3 + i == TrigReduce 1 + 2 Cos[2 x] Was das Kommando TrigFactor drauf hat, sehen Sie am Ergebnis der folgenden Berechnung. Es ist eine etwas verquere Art, TrigFactor für Cos[n x]; n = 2; : : : ; 6 zu bestimmen. (Alle drei Funktionen Times, Cos und TrigFactor sind Listable.) Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Trigonometrische Ausdrücke 347 TrigFactorCos f2; 3; 4; 5; 6gx [ (Cos[x] ] Sin[x]) (Cos[x] + Sin[x]) (Cos[2 x] (Cos[x] ; ; Cos[x] ( Sin[2 x]) (Cos[2 x] + Sin[2 x]) Sin[x]) (Cos[x] + Sin[x]) ( ; 1 + 2 Cos[2 x]) Cos[x] (1 ; 2 Cos[2 x] + 2 Cos[4 x]) 1 + 2 Sin[2 x]) (1 + 2 Sin[2 x]) Ein Regelsystem für trigonometrische Funktionen Wir kommen in diesem Abschnitt auf die SP-Regeln zurück und besprechen, wie Sie aus diesen ein Regelsystem aufbauen können, das die gewünschten Umformungen vornimmt. Wenn Sie den vorletzten Abschnitt nicht gelesen haben, so können Sie auch diese Ausführungen überspringen. Zielgenaue Umformungen lassen sich oft nur mit solchen Regelsystemen erreichen, weil Mathematica nicht für jede spezielle Umformung einen eigenen Befehl bereithalten kann. Hier sind die beiden Regeln zunächst einmal als s1 und c1 angeschrieben: s1 Sin x y ! Sin x Cos y Cos x Sin y c1 Cos x y ! Cos x Cos y Sin x Sin y = [ = + [ + ] [ ] ] [ [ ] ] + [ ] [ ] [ [ ] ] [ ] Die verwendete Syntax mit Mustervariablen x ist Ihnen von Funktionsdefinitionen, die im Kapitel 9 besprochen wurden, bekannt und auch den Rule-Operator haben wir schon oft eingesetzt. Solche Regeln können Variablen zugewiesen und als s1 ; c1 in einer Liste zu einem Regelsystem zusammengestellt werden. f ! g Angewendet werden Regeln mit dem Operator =: (ReplaceAll, einmalige Anwendung der Regeln) oder ==: (ReplaceRepeated, Anwendung so oft wie möglich bzw. bis keine Änderungen mehr eintreten), wie bereits auf Seite 332 beschrieben. Hier wird Sin[x + y + z ] nach den beiden vorgegebenen Regeln umgeformt. Sie sehen an der Form des Ergebnisses, dass zur Anwendung der Regeln das Argument x + y + z (also Plus[x; y; z ]) zunächst als x + (y + z ) zerlegt wurde. Der zweite Schritt (deshalb ==: statt =:) wendet die Regeln noch einmal auf das neue Argument y + z an. Sin x y z ==: fs1; c1g [ + + ] Cos[x] (Cos[z] Sin[y] + Cos[y] Sin[z]) + Sin[x] (Cos[y] Cos[z] Sin[y] Sin[z]) Das Ergebnis mit seinen vielen Klammern ist noch recht unübersichtlich. Wir können die Klammern am Schluss mit Expand auflösen, aber das ist nicht gut, weil ein solcher Schritt möglichst frühzeitig im Vereinfachungsprozess einsetzen und bereits auf Teilergebnisse angewendet werden sollte. Ein nachträgliches Expand könnte sonst (in komplizierteren Fällen) mit tausenden von Klammern konfrontiert sein. Die zusätzliche Regel d2 a = > Expand[a] : Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 348 14 Umformung und Vereinfachung mathematischer Ausdrücke ! (:> statt , denn Expand soll ja nicht jetzt, bei der Regeldefinition, mit a, sondern später, bei der Regelanwendung, mit dem Wert von a ausgeführt werden) leistet nicht das Geforderte: Sin x y z ==: fs1; c1; d2g [ + Cos[y ] z] Sin[x] Cos[x] Sin[y z] Der Grund liegt in der Art, wie Mathematica Ersetzungen sucht. Zunächst wird untersucht, ob eines der Muster auf den ganzen Ausdruck passt, und ggf. die entsprechende Regel angewendet. Passt keine der Regeln auf den gesamten Ausdruck, so werden rekursiv die Teilausdrücke der ersten Ebene untersucht und bearbeitet usw. Hat sich nach einer Regelanwendung nichts geändert, so hört ReplaceAll (mit diesem Teilausdruck) auf. Leider passt die Regel d2 immer auf den Gesamtausdruck und ReplaceAll hat keinen Grund, Ersetzungen auch für Teilausdrücke wie Cos[y z ] zu versuchen. Wir verwenden eine andere Idee und formulieren die Distributivgesetze, die Expand anwendet, als Regel d1 : d1 a b c ! a c b c = ( + ) + Sie hat nicht den eben beschriebenen Nachteil, denn sie ist nur anwendbar, wenn wirklich etwas ausmultipliziert werden kann. Sie werden fragen, was mit Ausdrücken der Form a (b + c) geschieht: Auch diese sind von der vereinbarten Regel erfasst, denn Times ist Orderless. In diesem Fall versucht Mathematica, Produkte in allen möglichen Konstellationen der Faktoren auf die Anwendbarkeit der Regel zu prüfen. Sin x y z ==: fs1; c1; d1g [ + ] Cos[y] Cos[z] Sin[x] Cos[x] Cos[z] Sin[y] + Cos[x] Cos[y] Sin[z] + Sin[x] Sin[y] Sin[z] Leider werden noch keine Mehrfachwinkel zerlegt, denn auf die Umformung Sin[2x] = Sin[x + x] kommt Mathematica nicht von allein. Die können Sie aber durch die nächsten beiden Regeln bewirken: s2 Sin n Integer x = n > 1 ! Sin x Cos n 1 x Cos x Sin n 1 x c2 Cos n Integer x = n > 1 ! Cos x Cos n 1 x Sin x Sin n 1 x = = [ ] [ ; ] [ ; ] [ [( ] [( ) ] + ) ] [ ] [ [( ] [( ) ) ] ] Natürlich würde eine Regel wie Sin n Integer x [ ] =; n > 1 ! Sin x n 1 x [ + ( ) ] nicht ausreichen, denn das zerlegte Argument würde sofort wieder vereinfacht, noch ehe die Regel s1 greifen kann. s2 und c2 sind konditionale Regeln, denn es wird nicht nur geprüft, ob die Ausdrücke auf gewisse Muster passen, sondern die Belegungen der Mustervariablen müssen auch noch zusätzliche Eigenschaften erfüllen. Die dabei verwendete Syntax ist dieselbe wie für partiell definierte Funktionen, siehe Seite 187. Die Einschränkung der Mustervariablen n auf ganze Zahlen größer als 1 garantiert die Termination der Regelanwendungen – im allgemeinen Fall ein diffiziles Problem. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Trigonometrische Ausdrücke 349 Sin 12x ==: fs2; c2; d1g [ ] 12 Cos[x] 11 Sin[x] 3 220 Cos[x] 220 Cos[x] Sin[x] 9 9 3 7 Sin[x] + 792 Cos[x] Sin[x] 5 5 792 Cos[x] 7 Sin[x] + 11 12 Cos[x] Sin[x] Unser kleines Regelsystem wirkt auf diesen Ausdruck bereits wie TrigExpand. Nun wollen wir noch die Beziehung Sin[x]2 + Cos[x]2 = 1 einsetzen, um Sin-Potenzen mit Exponenten größer als 1 aufzulösen. Die Regel Sin x 2 ! 1 Cos x 2 [ ] [ ] reicht dafür nicht aus, denn sie würde nur Sin-Potenzen ersetzen, deren Exponent genau gleich 2 ist (Mathematica fasst seine Regeln, etwa im Gegensatz zum CAS Reduce, immer als exakte Regeln auf, nicht als algebraische). Die Lösung bietet folgende Regel, die wieder einer Aufspaltung n = 2 + (n 2) entspricht: n Integer 2 n 2 sc Sin x = [ =; ] n > 1 ! 1 Cos x Sin x [ ] [ ] Damit können Sie nun z.B. Sin[5x] in einen Ausdruck zerlegen, der Sin[x] nur noch in der ersten Potenz enthält. Der Ausdruck kann mit Factor weiter zerlegt werden in eine Produktdarstellung von Sin[5x], die TrigFactor nicht findet: Sin 5x ==: fs2; c2; d1; scg [ ] 2 Sin[x] 12 Cos[x] Sin[x] + 16 Cos[x] Collect ; Sin x [% 1 % [ ]] 12 Cos[x] 2 + 16 Cos[x] == Factor 1 4 2 2 Cos[x] + 4 Cos[x] 4 Sin[x] Sin[x] 2 1 + 2 Cos[x] + 4 Cos[x] Sin[x] Sin 5x == TrigFactor [ ] (1 + 2 Cos[2 x] + 2 Cos[4 x]) Sin[x] Trigonometrische Umformungen in Anwendungen Die Vielfalt der möglichen zueinander äquivalenten Formen, in denen ein trigonometrischer Ausdruck auftreten kann, wird beim Integrieren besonders deutlich. Sie können ja zur Probe einfach mal einen etwas komplizierteren trigonometrischen Ausdruck nehmen, die zugehörige Stammfunktion berechnen und diese wieder ableiten. Aus mathematischer Sicht stimmt das Ergebnis mit dem Ausdruck, von dem Sie gestartet sind, überein. Was meinen Sie, wie oft es Ihnen gelingt, mit geeigneten Umformungen den Kreis auch syntaktisch zu schließen und zum Ausgangspunkt zurückzukehren? Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 350 14 Umformung und Vereinfachung mathematischer Ausdrücke Wir wollen in diesem Abschnitt einige solche Beispiele partiell diskutieren und die besonders bemerkenswerten Aspekte hervorheben. Mehr (auch aus Platzgründen) auf der Begleit-CD. Wir beginnen mit einem selbst gebauten Werkzeug, der Funktion tests, die auf einen Ausdruck die vier Kommandos zum Vereinfachen trigonometrischer Ausdrücke (Simplify, TrigReduce, TrigExpand, TrigFactor), die wir betrachtet haben, anwendet. tests h [ ] := h & = fSimplify; TrigReduce; TrigExpand; TrigFactorg #[ ] @ Sie hätten das vielleicht anders geschrieben, aber so geht’s auch: Map (Kurzform =@) setzt jede der vier angegebenen Funktionen in #[h] für den Platzhalter # ein, führt die Aufrufe aus und sammelt die Ergebnisse in einer Liste auf. d1 Sin 3x Sin 5x i1 Integrate d1; x Das erste Beispiel ist recht harmlos. Das Produkt d1 wird offensichtlich mit TrigReduce zum Integrieren vorbereitet. Im Ergebnis h1 treffen die Winkelfunktionen mit den alten und den neuen Argumenten aufeinander. Sowohl TrigExpand als auch TrigReduce sollten damit spielend fertig werden und werden es auch, ebenso wie die beiden anderen Kommandos. = 1 4 [ ] [ ]; 1 Sin[2 x] h1 d1 D i1; x [ 1 2 Cos[2 x] + h1 == tests [ ] Sin[8 x] 16 = = ] 1 2 Cos[8 x] + Sin[3 x] Sin[5 x] f; ; ; g 0 0 0 0 Hier sehen Sie zum Vergleich die Wirkung der vier Simplifikationskommandos auf den trigonometrischen Ausdruck i1 . TrigReduce und Simplify (die ersten beiden Listenelemente) liefern dasselbe Ergebnis – eine Linearkombination von Winkelfunktionen. Der dritte Eintrag kommt von TrigExpand – alle Mehrfachwinkel sind aufgelöst. Das vierte Ergebnis (von TrigFactor) ist wegen der auftretenden komplexen Zahlen nicht zufrieden stellend. i1 == tests n 1 (4 Sin[2 x] 16 1 2 Cos[x] Sin[x] i Cos[x] ( i ; Sin[8 x]) 1 2 1 16 7 Cos[x] ; (4 Sin[2 x] Sin[x] + 7 2 Sin[8 x]) 5 Cos[x] i 3 7 Sin[x] Cos[x] 2 i 3 5 Sin[x] + o 3 1 2 7 Cos[x] Sin[x] ; + (1 + ) Cos[2 x]) (1 + (1 + ) Cos[2 x]) Sin[x] Das zweite Beispiel ist eine Nuance schwieriger, denn x2 und x3 sind gemeinsame Vielfache von x6 , also keiner Variablen, sondern eines Ausdrucks. Aber da 56x von TrigExpand nicht als 56 x (so ist die interne Darstellung, schauen Sie sich die FullForm an!), sondern als 5 x6 interpretiert wird, steht dem Anwenden der Mehrwinkelformel nichts im Wege. Addison-Wesley Verlag h i h i d2 Cos x2 Cos x3 i2 Integrate d2; x = = [ h i 3 Sin x + 6 3 5 ] h Sin d2 D i2; x == tests [ ; 5 x i 6 ] f; ; ; g 0 0 0 0 Kofler, Gräbe: Mathematica http://www.kofler.cc Trigonometrische Ausdrücke 351 Noch eine Nuance schwieriger ist das folgende Beispiel, bei dem Mathematica leider voll aus dem Rennen ist. Die vielen mysteriösen Einheitswurzeln lassen sich weder mit Simplify noch mit FullSimplify beseitigen. h i h i d3 Sin 2x 6 Cos 3x 4 i3 Integrate d3; x 5=6 1=3 1 i i 4 4 4 = + + 1 20 ( + 1) i 20 ; + ( 1) Cos[3 x] 5=6 ( 1) = [ Cos[x] Cos ] +3 x Sin[3 x] 1 5=6 ( 1) Cos[3 x] Cos[5 x] Cos 4 + + 3 x ::: + Sin[3 x] Dabei ist der Weg eigentlich klar: Umformungen wie TrigReduce sollten den Integranden ‘weich klopfen’ und dann dürfte die Stammfunktion kein Problem mehr sein. Wenn ihn Mathematica nicht zu gehen scheint, dann können wir ihn ja mal selbst probieren: d3a d3 == TrigReduce = 1 h Sin 2 5 + xi + Sin h 12 i3a Integrate d3a; x = 1 [ 1 2 2 1 2 ( 7=12 1) 1=12 ( 1) i 12 + 5 x ] 5=6 1 + ( 1) 5=6 1 + ( 1) 1 Cos[x] + 1 10 Sin[x] 1) 5=12 ( 10 11=12 ( 1) 1 + ( 1 + ( 1) 1=6 1 =6 1) Cos[5 x]+ Sin[5 x] Der erste Schritt war erfolgreich, aber beim zweiten, dem nunmehr trivialen, patzt Mathematica. Es mag die zusammengesetzten Argumente der Winkelfunktionen nicht. Mit TrigExpand werden wir sie los, aber auch das 5 x im zweiten Term. Eigentlich brauchten wir jetzt eine punktgenaue Umformung, wie sie die Regeln s1 ; c1 aus dem vorigen Abschnitt liefern. Wir versuchen sie schon mal und vertrösten den Leser, der diesen Abschnitt übersprungen hat, auf eine weitere Lösung. f d3b d3 ==: fs1; c1g g = 1 2 1 Cos[2 x] p 3 Sin[2 x] 2 p Cos[3 x] 2 p Sin[3 x] 2 Dieser Ausdruck bereitet Mathematica nun keine Schwierigkeiten mehr. Das Ergebnis des Integrate-Kommandos fällt wie immer etwas lang aus, deshalb ist gleich ein Simplify nachgeschoben. i3b Integrate d3b; x == Simplify = [ p 1 20 5 p 3 ] 1 Cos[x] + 1 + p 3 Cos[5 x] + 5 (1 + p 3) Sin[x] + (1 p 3) Sin[5 x] 2 Auch die Probe, wenigstens mit d3b statt d3, bereitet nun keine Mühe mehr. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 352 14 Umformung und Vereinfachung mathematischer Ausdrücke Wir hatten noch eine Lösung ohne Regelsystem versprochen. Dann müssen Sie den oben skizzierten Weg gehen, erst mit TrigReduce die Linearkombination herstellen und dann mit TrigExpand die Summen, die Mathematica aus dem Konzept brachten, auflösen. Leider wird dabei auch 5 x mit expandiert, so dass die Linearität wieder verloren geht. Also jagen Sie noch einmal TrigReduce drüber und schon haben Sie einen netten, integrablen Ausdruck! Sowohl Anzahl als auch Reihenfolge der dabei vorgenommenen Umformungen sind wesentlich. d3c d3 == TrigReduce == TrigExpand == TrigReduce = 1 p p p p 2 Cos[x] 8 2 Sin[5 x] + 1 8 [ p 2 p 1 1 + 2 5 p 3 1 + 2 Cos[5 x] + p 6 Cos[5 x] + p 2 Sin[x] p 6 Sin[x]+ 6 Sin[5 x] i3c Integrate d3c; x = p 6 Cos[x] ] Cos[x] p 3 1 p 5 2 1 + p 3 Cos[5 x] p 2 1 + p 3 Sin[x]+ Sin[5 x] Eigentlich ganz logisch, oder? Etwas Verständnis sowohl für die zugrunde liegende Mathematik als auch grobe Vorstellungen von Mathematica-Interna waren natürlich erforderlich. Aber das Ergebnis, das mit einem Werkzeug erzielt wird, kann nicht besser sein als der, der es gebraucht. Überlegungen und Kenntnisse wie die hier vorgetragenen sind eher typisch als die Ausnahme, wenn Sie Mathematica intelligent einsetzen wollen und sich nicht mit ‘Lösungen von der Stange’ (bzw. Nicht-Lösungen) begnügen. Auf der Begleit-CD finden Sie noch einige weitere (aber nicht ganz so schlimme) Beispiele zum (elementaren) Integrieren trigonometrischer Funktionen. Syntaxzusammenfassung Allgemeine Simplifikations-Kommandos Simplify f [ ] versucht den Ausdruck f zu vereinfachen. Simplify f ; Zusatzannahmen [ ] versucht den Ausdruck f unter den angegebenen Zusatzannahmen zu vereinfachen. Wenn für eine Variable eine Ungleichung angegeben wird, setzt Mathematica automatisch voraus, dass diese Variable reell ist. Simplify f ; x 2 Bereich [ ] 2 versucht den Ausdruck f unter der Annhame x Bereich zu vereinfachen. Als Bereiche können Complexes, Reals, Algebraics, Rationals, Integers, Primes, Booleans eingesetzt werden. Kann mit anderen booleschen Prädikaten kombiniert werden. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Syntaxzusammenfassung 353 FullSimplify f ; TimeConstraint ! n [ ] wie Simplify, aber gründlicher (und langsamer). Besonders im Zusammenhang mit algebraischen Zahlen kann noch einmal eine deutliche Vereinfachung erreicht werden. Durch die Option TimeConstraint kann ein Zeitlimit in Sekunden angegeben werden. Zusatzannahmen und Bereichsangaben sind ebenfalls möglich. Vereinfachung polynomialer, rationaler und pseudorationaler Ausdrücke Klammern auflösen Expand f [ ] multipliziert die Produkte in polynomialen oder pseudopolynomialen Ausdrücken aus. ExpandAll f [ ] expandiert Produkte in allen Teilen eines Ausdrucks. PowerExpand f [ ] expandiert Potenzen/Wurzeln von Produkten und Quotienten in Produkte und Quotienten von Potenzen/Wurzeln. Das Kommando ist nur eingeschränkt mathematisch korrekt, siehe Seite 332! LogicalExpand f [ ] vereinfacht den Ausdruck nach den Regeln der booleschen Algebra. Ausdrücke nach Variablen zusammenfassen Collect f ; x Collect f ; x; g [ ] [ ] gruppiert den Ausdruck nach Potenzen von x. Die optionale Funktion g wird auf alle Koeffizienten angewendet. CoeÆcientList f ; x CoeÆcient f ; x; n [ [ ] ] Liste der Koeffizienten bzw. Koeffizient vor xn , wenn f nach Potenzen von x gruppiert ist CoeÆcientList2f ; fx; yg CoeÆcient f ; x y [ [ ] ] multivariate Variante dieser Kommandos Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc 354 14 Umformung und Vereinfachung mathematischer Ausdrücke Faktorzerlegung Factor f [ ] zerlegt den Ausdruck in ein Produkt. ! ! p Mit den Optionen GaussianIntegers True oder Extension d kann der Grundbereich, über dem faktorisiert wird (Standard: ), verändert werden. FactorList f Q [ ] klammert einen gemeinsamen numerischen Faktor aus. Rationale Funktionen Together f [ ] bringt den Ausdruck auf einen gemeinsamen Nenner. Numerator f Denominator f [ ] [ ] ermitteln Zähler und Nenner eines Bruchs. Cancel f [ ] kürzt einen Bruch. Apart f Apart f ; x [ ] [ ] führt eine Partialbruchzerlegung des Ausdrucks (bzgl. der Variablen x) durch. Vereinfachung trigonometrischer Ausdrücke TrigExpand f [ ] Winkelsummen und Mehrfachwinkel in Argumenten zugunsten von Produkten von Winkelfunktionen auflösen. Vereinfacht Argumente, aber Grad der Ausdrücke wächst. TrigReduce f [ ] Produkte und Potenzen von Winkelfunktionen zugunsten von Mehrfachwinkelargumenten auflösen. In günstigen Fällen bleiben danach nur Linearkombinationen von Winkelfunktionen übrig. TrigFactor f [ ] versucht, trigonometrische Ausdrücke so umzuformen, dass sie in möglichst viele Faktoren zerlegt sind. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc Syntaxzusammenfassung 355 Factor f ; Trig ! True Cancel f ; Trig ! True [ ] [ ] funktionieren wie Factor bzw. Cancel unter der zusätzlichen Berücksichtigung trigonometrischer Umformungen. TrigToExp f ExpToTrig f [ ] [ ] wandelt trigonometrische Ausdrücke in die Exponentialschreibweise um bzw. diese zurück in die Standarddarstellung. Addison-Wesley Verlag Kofler, Gräbe: Mathematica http://www.kofler.cc