• Keine Ergebnisse gefunden

Wir wollen dabei die sprachlichen Mittel, welche die einzelnen Interpreter anbieten, zur Formu-lierung von Anfragen intensiver nutzen. So werden wir etwa die in allen Systemen vorhandene Funktionsolveverwenden, mit der man die Nullstellen von Polynomen und allgemeineren Glei-chungen und Gleichungssystemen bestimmen kann. Allerdings ist das Ausgabeformat dieser Funk-tion von System zu System verschieden und differiert selbst zwischen unterschiedlichen Typen von Gleichungen und Gleichungssystemen.

Mapleliefert etwa f¨ur univariate Polynome, die wir in diesem Abschnitt untersuchen, keine Liste, sondern eineAusdruckssequenz zur¨uck, welche die verschiedenen Nullstellen zusammenfasst. Wir wollen sie gleich in eine Liste verwandeln:

sol:=[solve(x^3+x+1,x)];

Wir sehen, dass Maple das Problem der voneinander abh¨angigen Kerne auf eine clevere Art und Weise l¨ost: Das Endergebnis wird unter Verwendung einer neuen Variablen %1 formuliert1, mit der ein gemeinsamer Teilausdruck, welcher in der Formel mehrfach vorkommt, identifiziert wird. Auf diese Information wird bei sp¨ateren Simplifikationen zur¨uckgegriffen, was f¨ur unsere Aufgabenstellung bereits ausreichend ist:

expandist der polynomiale Normalformoperator, d.h. multipliziert Produkte aus und fasst gleich-artige Terme zusammen, wobei xund %1= p3

108 + 12√

93 als Kerne betrachtet werden. Aller-dings wird der zweite Kern vonindets(p)nicht mit ausgegeben.

Der gemeinsame Teilterm u = 108 + 12√

93 kann sogar durch eine Variable ersetzt werden, so dass wir diese Umformungen nachvollziehen k¨onnen. Beachten Sie, dass der Kern%1selbst nicht so einfach zug¨anglich ist, da er im Ausdruck in zwei Formen vorkommt, als u1/3 und als u−1/3, denn Maple stellt den Nenner 1/%1nicht als (u1/3)−1, sondern alsu−1/3 dar.

p2:=subs((108+12*93^(1/2))=u,p);

1Das ist nicht ganz korrekt und in der Terminalversion von 9.5 auch anders: In derMaple-Dokumentation wird darauf hingewiesen, dass es sich nur um

Pattern“, nicht aber um Variablen handelt. Gleichwohl istMapleaber in der Lage, solche gleichartigen Teile eines Ausdrucks ohne viel Aufwand zu identifizieren, was sicher damit zu tun hat, dass es sich um Referenzen auf dieselben Objekte handelt – die hier entscheidende Eigenschaft einer Variablen.

H.-G. Gr¨abe: Einf¨uhrung in das symbolische Rechnen, Notizen zur Vorlesung 112

Durch Rationalmachen, d.h. durch Multiplizieren mit dem zuukonjugierten Wurzelausdruck, kann man das Absolutglied des Polynomsp1weiter vereinfachen. Diese Technik ist jedoch ein spezieller mathematischer Trick, der in der polynomialen Normalformbildung rationaler Ausdr¨ucke nicht enthalten ist. Er wird folglich bei Anwendung von expand auch nicht ausgef¨uhrt. Die folgende Anweisung f¨uhrt schließlich zum gew¨unschten Ergebnis, w¨ahrend simplify(p) auch in Maple 9.5 nicht ausreicht, da es das Expandieren nicht ausprobiert.

simplify(p1);

x3+x+ 1

Alternativ f¨uhrtnormal(p1)zum selben Ergebnis. In der Tat,p1ist ein rationaler Ausdruck in den Kernenxundv=√

93. W¨ahrend der Berechnung der Normalform wird zun¨achst ein Hauptnenner gebildet

p3:=normal(subs(sqrt(93)=v,p1));

69 + 18v+ 162x+ 18x v+ 162x3+ 18x3v+v2 18 (9 +v)

danach im Z¨ahlerv2 durch 93 ersetzt und schließlich gcd von Z¨ahler und Nenner ausgeteilt:

subs(v^2=93,p3);

normal(%);

x3+x+ 1

Experimentieren wir weiter mit den Ausdr¨ucken aus der Listesol. Es stellt sich heraus, dass Po-tenzsummen der drei Wurzeln stets ganzzahlig sind. Wir wollen wiederum pr¨ufen, wieweitMaple in der Lage ist, dies zu erkennen. Dazu sammeln wir in einer Liste die Ergebnisse der Verein-fachung von xk1 +xk2 +xk3 f¨ur k = 2, . . . ,9 auf und versuchen sie danach weiter auszuwerten.

Nach unseren bisherigen Betrachtungen (die Ausdr¨ucke enthalten nur zwei Kerne), sollte f¨ur diese Vereinfachungen das Kommandonormalausreichen.

sums:=[seq(sum(sol[i]^k,i=1 .. 3),k=2 .. 9)];

map(normal,sums);

Bei gr¨oßeren k ergeben sich Probleme mit faktorisierten Nennern in der Normalform, die sich beheben lassen, wenn man mit expandierten Nennern rechnet (was im Zusammenspiel mit alge-braischen Vereinfachungen zu einer Normalform f¨uhrt, wie wir noch sehen werden).

map(normal,sums,expanded);

[−2,−3,2,5,1,−7,−6,6]

Ahnlich ist in¨ MuPADvorzugehen, wobei zu ber¨ucksichtigen ist, dass seit der Version 2.0 bereits Nullstellen von Polynomen dritten Grades in der RootOf-Notation ausgegeben werden. Wir kommen darauf weiter unten zur¨uck. Mit der Option MaxDegree=3 werden die Nullstellen als Wurzelausdr¨ucke dargestellt:

phat eine ¨ahnlich komplizierte Gestalt wie dasMaple-Ergebnis. Die Kerne lassen sich inMuPAD mit rationalize angeben; es werden vier Kerne lokalisiert,√

3,i, u1/3 undu−1/3, von denen in der expandierten Formp1nochuubrig ist, das seinerseits die Kerne¨ k1=√

31 undk2=√ 108 in der Konstellationk1·k2enth¨alt. Ein weiteressimplifywendet auf diese Kerne die Vereinfachung

√ 31√

108→6√

93 an und kommt damit zu einem ¨ahnlichen Ergebnis p2:=simplify(p1);

wieMaple.normal vereinfacht die jedoch in Version 2.5.3 erst nach zweimaliger Anwendung zu x3+x+ 1, d.h. opertiert nicht – wie man es von einem Simplifikator erwarten w¨urde – idempotent.

Wir hatten oben gesehen, dass w¨ahrend der Normalformberechnung der gcd erst nach m¨oglichen algebraischen Vereinfachungen von Z¨ahler und Nenner berechnet werden darf. Das Normalform-problem f¨ur rationale Funktionen, die algebraische Zahlen enthalten, ist also komplizierter als das f¨ur rationale Funktionen in Unbestimmten. W¨ahrend normal erst nach zweimaliger Anwendung auf p2 zur kanonischen Darstellung x3+x+ 1 findet, wird das Normalformproblem bereits im ersten Anlauf gel¨ost.

normal(p2-(x^3+x+1));

0

Dasselbe Ergebnis wird erzielt, wenn gleich das rechnerisch aufw¨andigereradsimpzur Anwendung kommt.

In der Version 1.4.2 wurde als Resultat vonexpand(p)der Ausdruck

x3+ 3x3

als Ergebnis ausgegeben, was offensichtlich damit zusammenhing, dass bereits in p neben dem Kernu=

y nicht ohne Weiteres zu √3 x y zusammengefasst werden darf, kann diese Beziehung nicht rekonstruiert werden.

Mathematicaliefert f¨ur unsere Gleichung dritten Grades folgende Antwort:

sol=Solve[x^3+x+1==0,x]

H.-G. Gr¨abe: Einf¨uhrung in das symbolische Rechnen, Notizen zur Vorlesung 114

Das Ergebnis desSolve-Operators ist keine Liste oder Menge von L¨osungen, sondern eine Substi-tutionsliste, wie wir sie im Abschnitt 2.6 kennengelernt haben. Solche Substitutionslisten werden auch vonMapleundMuPADf¨ur Gleichungssysteme in mehreren Ver¨anderlichen verwendet, wo man die einzelnen L¨osungskomponenten verschiedenen Variablen zuordnen muss. Mathemati-cas Ausgabeformat ist in dieser Hinsicht also, wie auch das vonAxiom,MaximaundReduce, konsistenter.

Die einzelnen Komponenten der L¨osung k¨onnen wir durch die Aufrufe x /. sol[[i]]erzeugen, welche jeweils die in der L¨osungsliste aufgesammelten Substitutionen ausf¨uhren. Diese darf sich im ProduktQ3

i=1(x−xi) nat¨urlich nur auf die Berechnung vonxi ausdehnen. Durch entsprechende Klammerung erreichen wir, dass im Ausdruckx-(x /. sol[[i]])das erstexals Symbol erhalten bleibt, w¨ahrend f¨ur das zweitexdie entsprechende Ersetzungx7→xi ausgef¨uhrt wird.

p=Product[x-(x /. sol[[i]]),{i,1,3}]

Expand vereinfacht wieder im Sinne der polynomialen Normalform in einen Ausdruck der Form x3+x+U, wobeiU selbst wieder ein rationaler Ausdruck in im Wesentlichen dem Kern√

93 ist, welcher mitTogetherzux3+x+ 1 vereinfacht wird.

F¨ur die Potenzsummen der Nullstellen, die man mit dem SequenzierungsoperatorTable aufsam-meln kann, bekommt man mitSimplifyeine Liste von ganzen Zahlen:

sums=Table[Sum[(x/.sol[[i]])^k,{i,1,3}],{k,2,9}];

sums//Simplify

{−2,−3,2,5,1,−7,−6,6}

Togetherreicht ebenfalls nicht aus und operiert auf einer Reihe von Listenelementen nicht idem-potent.

Ahnlich gehen die Systeme¨ AxiomundMaximavor, wobei hier oft eine genauere Kenntnis spe-ziellerer Designmomente notwendig ist. So liefert etwaAxiommit

solve(x^3+x+1)

das etwas verwunderliche Ergebnis [x3+x+ 1 = 0]. Erst die explizite Aufforderung nach einer L¨osung in Radikalen

sol:=radicalSolve(x^3+x+1)

wartet mit einem Ergebnis auf, welches dem der anderen Systeme ¨ahnelt. Die Vereinfachung des Produkts sowie die Berechnung der Potenzsummen geschieht ¨ahnlich wie in Maple ¨uber die Konversion von Listen in Produkte bzw. Summen (mit reduce) und bedarf keiner zus¨atzlichen Simplifikationsaufrufe, da in diesem CAS der 3. Generation alle Operationen

”wissen, was zu tun ist“.

p:=reduce(*,[x-subst(x,sol.i) for i in 1..3]) x3+x+ 1

[reduce(+,[subst(x^k,sol.i) for i in 1..3]) for k in 2..9]

[−2,−3,2,5,1,−7,−6,6]

Maximaliefert als Ergebnis dessolve-Operators die L¨osungsmenge in Form einer Substitutions-liste in ¨ahnlicher Form wieMathematica.

sol:solve(x^3+x+1,x);

Auch hier kann (z.B.) durch geeignete Listenoperationen das Produktpgebildet werden.

p:apply("*",map(lambda([u],x-subst(u,x)),sol));

Wie in Maple reicht die Berechnung der rationalen Normalform mit ratsimpaus, umx3+x+ 1 zur¨uckzugewinnen.

Auf dieselbe Weise lassen sich die Potenzsummen berechnen:

sums:makelist(apply("+",map(lambda([u],subst(u,x^k)),sol)),k,2,9);

map(ratsimp,sums);

H.-G. Gr¨abe: Einf¨uhrung in das symbolische Rechnen, Notizen zur Vorlesung 116

[−2,−3,2,5,1,−7,−6,6]

An diesem Beispiel wird der funktionale Charakter der im symbolischen Rechnen verwendeten Programmiersprachen sehr deutlich. Nat¨urlich h¨atte man, und sei es zur besseren Lesbarkeit, auch die einzelnen Schritte zur Konstruktion der Liste der zu evaluierenden Ausdr¨ucke nacheinander ausf¨uhren und die jeweiligen Zwischenergebnisse in Variablen speichern k¨onnen. Listen sind jedoch eine sehr bequeme Datenstruktur, mit der sich auch gr¨oßere (homogene) Datenmengen wie in diesem Fall die verschiedenen Potenzsummen von einer Funktion an die n¨achste ¨ubergeben lassen.

4.2 Die allgemeine L¨ osung einer Gleichungen dritten